handler-playable-sdk 0.5.552 → 0.5.556

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.
@@ -1,4 +1,4 @@
1
- import{c as Ki,d as we,e as Xi}from"./chunk-I5OOVR5U.js";import{i as Ut}from"./chunk-PW2FGMCO.js";import{c as Ve,d as Ft,e as We,g as ba,h as Ji,j as va,k as ya,n as Zi,o as Bt,p as Qe,q as wa,r as Qi,s as xa}from"./chunk-HVKF2KYL.js";import{a as ps}from"./chunk-JXBG6UFL.js";import{Application as jo}from"pixi.js";var Re={};function Gt(s,e,t=!1){Re[s]||(Re[s]=[]),Re[s].push({fn:e,once:t})}function en(s,e){if(Re[s]){if(!e){delete Re[s];return}Re[s]=Re[s].filter(t=>t.fn!==e)}}function qt(s,...e){let t=Re[s];if(t)for(let i of[...t])i.fn(...e),i.once&&en(s,i.fn)}function pe(s,e){Gt(s,e,!0)}var X=null,me=[],et=null;function Aa(s){X=s,me=[],et!==null&&(clearTimeout(et),et=null)}function Ca(){var s,e,t;return{endpoint:(X==null?void 0:X.endpoint)||"",transport:(X==null?void 0:X.transport)||"beacon",batchSize:(s=X==null?void 0:X.batchSize)!=null?s:10,flushIntervalMs:(e=X==null?void 0:X.flushIntervalMs)!=null?e:300,maxQueue:(t=X==null?void 0:X.maxQueue)!=null?t:200,debug:!!(X!=null&&X.debug)}}async function Sa(s,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(s,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function tn(s,e){let t=Ca();if(e&&t.endpoint){if(me.push(s),me.length>t.maxQueue&&(me=me.slice(me.length-t.maxQueue)),me.length>=t.batchSize){Ea();return}et===null&&(et=window.setTimeout(()=>{et=null,Ea()},t.flushIntervalMs))}}async function Ea(){let s=Ca();if(!s.endpoint||me.length===0)return;let e=me.splice(0,s.batchSize);await Sa(s.endpoint,{events:e},s.transport,s.debug),me.length>0&&await Sa(s.endpoint,{events:me.splice(0,s.batchSize)},s.transport,s.debug)}function Ta(s){return Math.max(0,Math.min(1,s))}function us(s){let e=String(s!=null?s:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function wt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function gs(s,e){let t=s==null?void 0:s[e];return typeof t=="number"?t:0}function La(s,e,t){try{s[e]=t}catch{}}function hs(s){let e=s==null?void 0:s.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function ka(s,e){let t=s==null?void 0:s.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Pa(s,e){let t=hs(s);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function Ma(){let s=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),s.size>0&&i()})},n=d=>{var u;s.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{s.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},r=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var p,u;let d=wt();for(let g of Array.from(s)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let m=g.durationMs>0?h/g.durationMs:1,f=Ta(m),b=g.repeat>=0?g.repeat+1:1,v=g.repeat>0?Math.min(Math.floor(m),b-1):0;if(g.repeat>0&&m>=1){let x=m-v;f=Ta(x)}let w=g.ease(f);g.yoyo&&v%2===1&&(w=1-w);for(let x of g.props)La(g.target,x.key,x.from+(x.to-x.from)*w);g.scaleFrom&&g.scaleTo&&ka(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*w,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*w});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(m>=b){r(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var x;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((x=u==null?void 0:u.delayMsOverride)!=null?x:0)),m=us(p.ease),f=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,v=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),w=[];for(let M of Object.keys(p)){if(v.has(M))continue;let j=p[M];typeof j=="number"&&w.push({key:M,from:gs(d,M),to:j})}let y=Pa(d,p);return{target:d,startMs:wt(),delayMs:h,durationMs:g,ease:m,props:w,scaleFrom:y.from,scaleTo:y.to,repeat:f,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>r(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=wt())},resume:()=>{var m;if(!u.paused)return;let g=(m=u.pauseAtMs)!=null?m:wt(),h=wt()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&La(d,g,h)}let u=Pa(d,p);u.to&&ka(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))r(u)},timeline(d={}){let p=[],u=0,g=!1,h=[],m=v=>{if(typeof v=="number")return Math.max(0,v*1e3);let w=typeof v=="string"?v.trim():"";return w.startsWith("+=")?u+Math.max(0,Number(w.slice(2))*1e3||0):w?Math.max(0,Number(w)*1e3||0):u},f=v=>{p.push(v);let w=Math.max(0,(typeof v.vars.duration=="number"?v.vars.duration:.5)*1e3);u=Math.max(u,v.atMs+w)},b={to(v,w,y){return f({kind:"to",target:v,vars:w,atMs:m(y)}),b},fromTo(v,w,y,x){return f({kind:"fromTo",target:v,vars:y,from:w,atMs:m(x)}),b},play(){var v,w;if(g)return b;g=!0,h=[];for(let y of p)y.kind==="fromTo"&&c.set(y.target,(v=y.from)!=null?v:{}),h.push(c.to(y.target,{...y.vars,delay:y.atMs/1e3+((w=y.vars.delay)!=null?w:0)}));return b},pause(){for(let v of h)v.pause();return b},kill(){for(let v of h)v.kill();h=[],g=!1}};return d.paused||b.play(),b}};return c}function Ia(){if(typeof window=="undefined")return;let s=window;if(!s.gsap)try{s.gsap=Ma()}catch{}}var ja={name:"handler-playable-sdk",version:"0.5.552",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var ue=0,fs=ue++,_a=ue++,Oa=ue++,Ra=ue++,za=ue++,Da=ue++,$a=ue++,Ha=ue++,Na=ue++,Fa=ue++,Ba=ue++,Ua=ue++,W=fs;function Ga(){return W===_a}function qa(){return W===Oa}function Va(){return W===Ra}function Wa(){return W===za}function tt(){return W===Da}function it(){return W===$a}function Ya(){return W===Ha}function Ka(){return W===Na}function Xa(){return W===Fa}function nn(){return W===Ba}function an(){return W===Ua}function Ja(){let s=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(s==="mraid")try{mraid.getState(),W=_a;return}catch{}else if(s==="dapi")try{dapi.isReady(),W=Oa;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(W=Ra)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(W=za)}catch{}else if(e==="mintegral")window.gameReady&&(W=Da);else if(e==="tapjoy")window.TJ_API&&(W=$a);else if(e==="tiktok")window.openAppStore&&(W=Ha);else if(e==="smadex")try{window.smxTracking&&(W=Na)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(W=Fa)}catch{}else e==="vungle"?W=Ba:(s==="nucleo"||e==="nucleo")&&(W=Ua)}import rn from"lottie-web";var Za=rn;typeof window!="undefined"&&(window.lottie=rn,window.__baseLottie=rn);function J(s,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(s,e);return`${s/i}:${e/i}`}var sl=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:J(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:J(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:J(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:J(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:J(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:J(360,780)}],ol=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:J(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:J(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:J(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:J(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:J(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:J(412,915)}],ll=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:J(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:J(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:J(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:J(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:J(800,1280)}],sn=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:J(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:J(768,1024),mraidScale:.7}];var Qa=[...sn],er=[{category:"playable",label:"Playable Ad",devices:sn}],on=sn[0];function nt(s){return Qa.find(e=>e.id===s)||on}function cl(s){return Qa.filter(e=>e.category===s)}var ze=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let r=a(e);if(!r){console.error("[PropertyUpdateManager] Config not found for:",e);return}Ve({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let p=window.__editableConfig,u=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:r;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function ln(s){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let r=n.result,o=s.category||"misc",c=`${(s.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:r,overwrite:!0})})).json();if(!(p!=null&&p.success)){alert(`Upload failed: ${(p==null?void 0:p.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await s.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Vt=class{constructor(){this.updateManager=new ze}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let r=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,r);break;case"ai-edit":this.openAIEditor(t,i,r);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,r);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let r=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",r),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",r)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===a||d.slotId===a)){let d=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:d,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:d,assetType:"image"}),n.categories&&!n.categories.includes(d)&&n.categories.push(d),n.libraryAssets&&!n.libraryAssets[d]&&(n.libraryAssets[d]=[]);let p=window.reRenderAssetLibrary;typeof p=="function"&&p()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let r=window.__updateWorkbenchTabs;typeof r=="function"&&r()}if(n.libraryPanel){let r=window.getEditableObjectConfig,o=r==null?void 0:r(e),l=(a=o==null?void 0:o.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var r;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((r=n==null?void 0:n.identity)==null?void 0:r.category)||(t.split(".")[0]==="render"?"environment":"ui");ln({objectId:e,category:a,onApply:async o=>{var d,p;await this.updateManager.updateProperty(e,t,o);let l=window.__debugContext;(p=(d=l==null?void 0:l.options)==null?void 0:d.onPropertyChange)==null||p.call(d,e,t,o);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),r=window.__editableConfig;if(!(r!=null&&r.schemas))return;let o=null;if(r.schemas instanceof Map?o=r.schemas.get(n):typeof r.schemas=="object"&&(o=r.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,r,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var bs=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],vs=["environment","ui","character","system","backgrounds"],ys=["bg","world","ui"],tr={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},Wt=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
1
+ import{c as Ki,d as we,e as Xi}from"./chunk-I5OOVR5U.js";import{i as Ut}from"./chunk-PW2FGMCO.js";import{c as Ve,d as Bt,e as We,g as ba,h as Ji,j as va,k as ya,n as Zi,o as Ft,p as et,q as wa,r as Qi,s as xa}from"./chunk-HVKF2KYL.js";import{a as ps}from"./chunk-JXBG6UFL.js";import{Application as jo}from"pixi.js";var ze={};function Gt(s,e,t=!1){ze[s]||(ze[s]=[]),ze[s].push({fn:e,once:t})}function en(s,e){if(ze[s]){if(!e){delete ze[s];return}ze[s]=ze[s].filter(t=>t.fn!==e)}}function qt(s,...e){let t=ze[s];if(t)for(let i of[...t])i.fn(...e),i.once&&en(s,i.fn)}function pe(s,e){Gt(s,e,!0)}var X=null,me=[],tt=null;function Aa(s){X=s,me=[],tt!==null&&(clearTimeout(tt),tt=null)}function Ca(){var s,e,t;return{endpoint:(X==null?void 0:X.endpoint)||"",transport:(X==null?void 0:X.transport)||"beacon",batchSize:(s=X==null?void 0:X.batchSize)!=null?s:10,flushIntervalMs:(e=X==null?void 0:X.flushIntervalMs)!=null?e:300,maxQueue:(t=X==null?void 0:X.maxQueue)!=null?t:200,debug:!!(X!=null&&X.debug)}}async function Sa(s,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(s,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function tn(s,e){let t=Ca();if(e&&t.endpoint){if(me.push(s),me.length>t.maxQueue&&(me=me.slice(me.length-t.maxQueue)),me.length>=t.batchSize){Ea();return}tt===null&&(tt=window.setTimeout(()=>{tt=null,Ea()},t.flushIntervalMs))}}async function Ea(){let s=Ca();if(!s.endpoint||me.length===0)return;let e=me.splice(0,s.batchSize);await Sa(s.endpoint,{events:e},s.transport,s.debug),me.length>0&&await Sa(s.endpoint,{events:me.splice(0,s.batchSize)},s.transport,s.debug)}function Ta(s){return Math.max(0,Math.min(1,s))}function us(s){let e=String(s!=null?s:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function wt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function gs(s,e){let t=s==null?void 0:s[e];return typeof t=="number"?t:0}function La(s,e,t){try{s[e]=t}catch{}}function hs(s){let e=s==null?void 0:s.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function ka(s,e){let t=s==null?void 0:s.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Pa(s,e){let t=hs(s);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function Ma(){let s=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),s.size>0&&i()})},n=d=>{var u;s.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{s.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},r=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var p,u;let d=wt();for(let g of Array.from(s)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let m=g.durationMs>0?h/g.durationMs:1,f=Ta(m),b=g.repeat>=0?g.repeat+1:1,v=g.repeat>0?Math.min(Math.floor(m),b-1):0;if(g.repeat>0&&m>=1){let x=m-v;f=Ta(x)}let w=g.ease(f);g.yoyo&&v%2===1&&(w=1-w);for(let x of g.props)La(g.target,x.key,x.from+(x.to-x.from)*w);g.scaleFrom&&g.scaleTo&&ka(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*w,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*w});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(m>=b){r(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var x;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((x=u==null?void 0:u.delayMsOverride)!=null?x:0)),m=us(p.ease),f=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,v=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),w=[];for(let M of Object.keys(p)){if(v.has(M))continue;let j=p[M];typeof j=="number"&&w.push({key:M,from:gs(d,M),to:j})}let y=Pa(d,p);return{target:d,startMs:wt(),delayMs:h,durationMs:g,ease:m,props:w,scaleFrom:y.from,scaleTo:y.to,repeat:f,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>r(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=wt())},resume:()=>{var m;if(!u.paused)return;let g=(m=u.pauseAtMs)!=null?m:wt(),h=wt()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&La(d,g,h)}let u=Pa(d,p);u.to&&ka(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))r(u)},timeline(d={}){let p=[],u=0,g=!1,h=[],m=v=>{if(typeof v=="number")return Math.max(0,v*1e3);let w=typeof v=="string"?v.trim():"";return w.startsWith("+=")?u+Math.max(0,Number(w.slice(2))*1e3||0):w?Math.max(0,Number(w)*1e3||0):u},f=v=>{p.push(v);let w=Math.max(0,(typeof v.vars.duration=="number"?v.vars.duration:.5)*1e3);u=Math.max(u,v.atMs+w)},b={to(v,w,y){return f({kind:"to",target:v,vars:w,atMs:m(y)}),b},fromTo(v,w,y,x){return f({kind:"fromTo",target:v,vars:y,from:w,atMs:m(x)}),b},play(){var v,w;if(g)return b;g=!0,h=[];for(let y of p)y.kind==="fromTo"&&c.set(y.target,(v=y.from)!=null?v:{}),h.push(c.to(y.target,{...y.vars,delay:y.atMs/1e3+((w=y.vars.delay)!=null?w:0)}));return b},pause(){for(let v of h)v.pause();return b},kill(){for(let v of h)v.kill();h=[],g=!1}};return d.paused||b.play(),b}};return c}function Ia(){if(typeof window=="undefined")return;let s=window;if(!s.gsap)try{s.gsap=Ma()}catch{}}var ja={name:"handler-playable-sdk",version:"0.5.556",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var ue=0,fs=ue++,Oa=ue++,_a=ue++,za=ue++,Ra=ue++,Da=ue++,$a=ue++,Ha=ue++,Na=ue++,Ba=ue++,Fa=ue++,Ua=ue++,W=fs;function Ga(){return W===Oa}function qa(){return W===_a}function Va(){return W===za}function Wa(){return W===Ra}function it(){return W===Da}function nt(){return W===$a}function Ya(){return W===Ha}function Ka(){return W===Na}function Xa(){return W===Ba}function nn(){return W===Fa}function an(){return W===Ua}function Ja(){let s=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(s==="mraid")try{mraid.getState(),W=Oa;return}catch{}else if(s==="dapi")try{dapi.isReady(),W=_a;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(W=za)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(W=Ra)}catch{}else if(e==="mintegral")window.gameReady&&(W=Da);else if(e==="tapjoy")window.TJ_API&&(W=$a);else if(e==="tiktok")window.openAppStore&&(W=Ha);else if(e==="smadex")try{window.smxTracking&&(W=Na)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(W=Ba)}catch{}else e==="vungle"?W=Fa:(s==="nucleo"||e==="nucleo")&&(W=Ua)}import rn from"lottie-web";var Za=rn;typeof window!="undefined"&&(window.lottie=rn,window.__baseLottie=rn);function J(s,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(s,e);return`${s/i}:${e/i}`}var sl=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:J(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:J(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:J(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:J(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:J(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:J(360,780)}],ol=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:J(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:J(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:J(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:J(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:J(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:J(412,915)}],ll=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:J(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:J(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:J(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:J(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:J(800,1280)}],sn=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:J(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:J(768,1024),mraidScale:.7}];var Qa=[...sn],er=[{category:"playable",label:"Playable Ad",devices:sn}],on=sn[0];function at(s){return Qa.find(e=>e.id===s)||on}function cl(s){return Qa.filter(e=>e.category===s)}var Re=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let r=a(e);if(!r){console.error("[PropertyUpdateManager] Config not found for:",e);return}Ve({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let p=window.__editableConfig,u=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:r;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function ln(s){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let r=n.result,o=s.category||"misc",c=`${(s.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:r,overwrite:!0})})).json();if(!(p!=null&&p.success)){alert(`Upload failed: ${(p==null?void 0:p.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await s.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Vt=class{constructor(){this.updateManager=new Re}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let r=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,r);break;case"ai-edit":this.openAIEditor(t,i,r);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,r);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let r=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",r),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",r)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===a||d.slotId===a)){let d=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:d,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:d,assetType:"image"}),n.categories&&!n.categories.includes(d)&&n.categories.push(d),n.libraryAssets&&!n.libraryAssets[d]&&(n.libraryAssets[d]=[]);let p=window.reRenderAssetLibrary;typeof p=="function"&&p()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let r=window.__updateWorkbenchTabs;typeof r=="function"&&r()}if(n.libraryPanel){let r=window.getEditableObjectConfig,o=r==null?void 0:r(e),l=(a=o==null?void 0:o.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var r;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((r=n==null?void 0:n.identity)==null?void 0:r.category)||(t.split(".")[0]==="render"?"environment":"ui");ln({objectId:e,category:a,onApply:async o=>{var d,p;await this.updateManager.updateProperty(e,t,o);let l=window.__debugContext;(p=(d=l==null?void 0:l.options)==null?void 0:d.onPropertyChange)==null||p.call(d,e,t,o);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),r=window.__editableConfig;if(!(r!=null&&r.schemas))return;let o=null;if(r.schemas instanceof Map?o=r.schemas.get(n):typeof r.schemas=="object"&&(o=r.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,r,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var bs=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],vs=["environment","ui","character","system","backgrounds"],ys=["bg","world","ui"],tr={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},Wt=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
2
2
  <div class="wizard-card">
3
3
  <div class="wizard-header">
4
4
  <div class="wizard-title">
@@ -449,18 +449,18 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
449
449
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Create</button>
450
450
  </div>
451
451
  </div>
452
- `;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=b=>{let v=b.trim();if(!v)return null;try{return JSON.parse(v)}catch{return null}},p=()=>{var F;let b=t.querySelector("#spawner-instance-id").value.trim(),v=t.querySelector("#spawner-template-id").value.trim(),w=t.querySelector("#spawner-spawn-templates").value,y=t.querySelector("#spawner-position-source").value.trim(),x=t.querySelector("#spawner-point-mode").value.trim(),M=t.querySelector("#spawner-spawn-points").value,j=t.querySelector("#spawner-random-bounds").value,L=t.querySelector("#spawner-pattern").value.trim(),_=Number(t.querySelector("#spawner-rate").value.trim()),O=Number(t.querySelector("#spawner-pool").value.trim()),T=Number(t.querySelector("#spawner-lifetime").value.trim()),A=t.querySelector("#spawner-return-on-invisible").checked,k=t.querySelector("#spawner-movement").value.trim(),C=t.querySelector("#spawner-velocity").value.trim(),E=t.querySelector("#spawner-velocity-range").value,S=d(w),I=Array.isArray(S)&&S.length?S:null,P=typeof((F=I==null?void 0:I[0])==null?void 0:F.templateId)=="string"?String(I[0].templateId):v;if(!b){alert("Instance ID is required.");return}if(!P){alert("Template ID is required (or provide Spawn Templates JSON).");return}let R={templateId:P,spawnPattern:L,spawnRate:Number.isFinite(_)?_:650,poolSize:Number.isFinite(O)?O:18,returnOnInvisible:A,positionSource:y,spawnPointMode:x,movementMode:k,lifetime:Number.isFinite(T)?T:5e3};I&&(R.spawnTemplates=I);let D=d(M);Array.isArray(D)&&(R.spawnPoints=D);let N=d(j);if(N&&typeof N=="object"&&(R.randomBounds=N),C.includes(",")){let[G,Y]=C.split(",").map(le=>le.trim()),Q=Number(G),ie=Number(Y);Number.isFinite(Q)&&Number.isFinite(ie)&&(R.velocity={x:Q,y:ie})}let H=d(E);H&&typeof H=="object"&&(R.velocityRange=H),c(),e({templateId:P,instanceId:b,spawnerProps:R})},u=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",b=>b.stopPropagation()),(h=t.querySelector('[data-action="confirm"]'))==null||h.addEventListener("click",p),(m=t.querySelector('[data-action="cancel"]'))==null||m.addEventListener("click",u),(f=t.querySelector(".add-menu-modal-close"))==null||f.addEventListener("click",u),t.addEventListener("click",b=>{b.target===t&&u()}),document.body.appendChild(t),t.querySelector("#spawner-instance-id").focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let r=a,o=this.buildDefaultConfig(e,r,a);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:r,objectConfigId:o.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:o})}),u=await p.json().catch(()=>({}));if(!p.ok||(u==null?void 0:u.success)===!1){let h=((l=u==null?void 0:u.errors)==null?void 0:l.join(`
452
+ `;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=b=>{let v=b.trim();if(!v)return null;try{return JSON.parse(v)}catch{return null}},p=()=>{var B;let b=t.querySelector("#spawner-instance-id").value.trim(),v=t.querySelector("#spawner-template-id").value.trim(),w=t.querySelector("#spawner-spawn-templates").value,y=t.querySelector("#spawner-position-source").value.trim(),x=t.querySelector("#spawner-point-mode").value.trim(),M=t.querySelector("#spawner-spawn-points").value,j=t.querySelector("#spawner-random-bounds").value,L=t.querySelector("#spawner-pattern").value.trim(),O=Number(t.querySelector("#spawner-rate").value.trim()),_=Number(t.querySelector("#spawner-pool").value.trim()),T=Number(t.querySelector("#spawner-lifetime").value.trim()),A=t.querySelector("#spawner-return-on-invisible").checked,k=t.querySelector("#spawner-movement").value.trim(),C=t.querySelector("#spawner-velocity").value.trim(),E=t.querySelector("#spawner-velocity-range").value,S=d(w),I=Array.isArray(S)&&S.length?S:null,P=typeof((B=I==null?void 0:I[0])==null?void 0:B.templateId)=="string"?String(I[0].templateId):v;if(!b){alert("Instance ID is required.");return}if(!P){alert("Template ID is required (or provide Spawn Templates JSON).");return}let z={templateId:P,spawnPattern:L,spawnRate:Number.isFinite(O)?O:650,poolSize:Number.isFinite(_)?_:18,returnOnInvisible:A,positionSource:y,spawnPointMode:x,movementMode:k,lifetime:Number.isFinite(T)?T:5e3};I&&(z.spawnTemplates=I);let D=d(M);Array.isArray(D)&&(z.spawnPoints=D);let N=d(j);if(N&&typeof N=="object"&&(z.randomBounds=N),C.includes(",")){let[G,Y]=C.split(",").map(le=>le.trim()),Q=Number(G),ie=Number(Y);Number.isFinite(Q)&&Number.isFinite(ie)&&(z.velocity={x:Q,y:ie})}let H=d(E);H&&typeof H=="object"&&(z.velocityRange=H),c(),e({templateId:P,instanceId:b,spawnerProps:z})},u=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",b=>b.stopPropagation()),(h=t.querySelector('[data-action="confirm"]'))==null||h.addEventListener("click",p),(m=t.querySelector('[data-action="cancel"]'))==null||m.addEventListener("click",u),(f=t.querySelector(".add-menu-modal-close"))==null||f.addEventListener("click",u),t.addEventListener("click",b=>{b.target===t&&u()}),document.body.appendChild(t),t.querySelector("#spawner-instance-id").focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let r=a,o=this.buildDefaultConfig(e,r,a);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:r,objectConfigId:o.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:o})}),u=await p.json().catch(()=>({}));if(!p.ok||(u==null?void 0:u.success)===!1){let h=((l=u==null?void 0:u.errors)==null?void 0:l.join(`
453
453
  `))||(u==null?void 0:u.error)||"Failed to create object.";alert(h);return}let{trackObjectCreation:g}=await import("./ConfigOverride-V7DLPL5I.js");g(r,i,o),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),(d=(c=this.options).onRefresh)==null||d.call(c)}catch(p){alert(`Failed to create object: ${p instanceof Error?p.message:String(p)}`)}}async handleCreateFromTemplate(e,t){var r,o,l;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",a=await this.promptName(n);if(a)try{let c=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:a,screenId:i})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let p=((r=d==null?void 0:d.errors)==null?void 0:r.join(`
454
- `))||(d==null?void 0:d.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,r,o,l,c,d,p,u,g,h,m,f,b,v,w,y,x,M,j,L,_,O,T,A,k,C;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let E=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let I=((n=S==null?void 0:S.errors)==null?void 0:n.join(`
454
+ `))||(d==null?void 0:d.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,r,o,l,c,d,p,u,g,h,m,f,b,v,w,y,x,M,j,L,O,_,T,A,k,C;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let E=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let I=((n=S==null?void 0:S.errors)==null?void 0:n.join(`
455
455
  `))||(S==null?void 0:S.error)||"Failed to create collectable system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(r=(a=this.options).onRefresh)==null||r.call(a)}catch(E){alert(`Failed to create collectable system: ${E instanceof Error?E.message:String(E)}`)}if(e==="drag-snap-couples")try{let E=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let I=((o=S==null?void 0:S.errors)==null?void 0:o.join(`
456
456
  `))||(S==null?void 0:S.error)||"Failed to create drag-snap system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(E){alert(`Failed to create drag-snap system: ${E instanceof Error?E.message:String(E)}`)}if(e==="swerve-collect")try{let E=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let I=((d=S==null?void 0:S.errors)==null?void 0:d.join(`
457
457
  `))||(S==null?void 0:S.error)||"Failed to create swerve collect system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(u=(p=this.options).onRefresh)==null||u.call(p)}catch(E){alert(`Failed to create swerve collect system: ${E instanceof Error?E.message:String(E)}`)}if(e==="tap-destroy")try{let E=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let I=((g=S==null?void 0:S.errors)==null?void 0:g.join(`
458
458
  `))||(S==null?void 0:S.error)||"Failed to create tap destroy system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(m=(h=this.options).onRefresh)==null||m.call(h)}catch(E){alert(`Failed to create tap destroy system: ${E instanceof Error?E.message:String(E)}`)}if(e==="scratch-card")try{let E=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let I=((f=S==null?void 0:S.errors)==null?void 0:f.join(`
459
459
  `))||(S==null?void 0:S.error)||"Failed to create scratch card system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(v=(b=this.options).onRefresh)==null||v.call(b)}catch(E){alert(`Failed to create scratch card system: ${E instanceof Error?E.message:String(E)}`)}if(e==="start-screen"||e==="start-screen-no-hand")try{let S=await fetch("/api/systems/start-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="start-screen"})}),I=await S.json().catch(()=>({}));if(!S.ok||(I==null?void 0:I.success)===!1){let P=((w=I==null?void 0:I.errors)==null?void 0:w.join(`
460
460
  `))||(I==null?void 0:I.error)||"Failed to create start screen template.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(x=(y=this.options).onRefresh)==null||x.call(y)}catch(E){alert(`Failed to create start screen template: ${E instanceof Error?E.message:String(E)}`)}if(e==="endgame-screen"||e==="endgame-screen-no-hand")try{let S=await fetch("/api/systems/endgame-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="endgame-screen"})}),I=await S.json().catch(()=>({}));if(!S.ok||(I==null?void 0:I.success)===!1){let P=((M=I==null?void 0:I.errors)==null?void 0:M.join(`
461
- `))||(I==null?void 0:I.error)||"Failed to create endgame screen template.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(L=(j=this.options).onRefresh)==null||L.call(j)}catch(E){alert(`Failed to create endgame screen template: ${E instanceof Error?E.message:String(E)}`)}if(e==="bullet-system")try{let E=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let I=((_=S==null?void 0:S.errors)==null?void 0:_.join(`
462
- `))||(S==null?void 0:S.error)||"Failed to create bullet system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(T=(O=this.options).onRefresh)==null||T.call(O)}catch(E){alert(`Failed to create bullet system: ${E instanceof Error?E.message:String(E)}`)}if(e==="spawner"){let E=await this.promptSpawnerConfig();if(!E)return;let{templateId:S,instanceId:I,spawnerProps:P}=E;try{let R=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,templateId:S,instanceId:I,spawnerProps:P})}),D=await R.json().catch(()=>({}));if(!R.ok||(D==null?void 0:D.success)===!1){let N=((A=D==null?void 0:D.errors)==null?void 0:A.join(`
463
- `))||(D==null?void 0:D.error)||"Failed to create spawner.";alert(N);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(C=(k=this.options).onRefresh)==null||C.call(k)}catch(R){alert(`Failed to create spawner: ${R instanceof Error?R.message:String(R)}`)}}}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[AddObjectMenu] Failed to sync screens:",e)}}};var Xt=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.selectedIds=new Set;this.lastSelectedIndex=-1;this.objectEntries=[];this.options=null;this.retryTimer=null;this.screenFilter="all";this.showTemplates=!1;this.isContextMenuOpen=!1;this.systemBundles=new Map}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getShowTemplatesStorageKey(){return`handler_preview_show_templates::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
461
+ `))||(I==null?void 0:I.error)||"Failed to create endgame screen template.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(L=(j=this.options).onRefresh)==null||L.call(j)}catch(E){alert(`Failed to create endgame screen template: ${E instanceof Error?E.message:String(E)}`)}if(e==="bullet-system")try{let E=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let I=((O=S==null?void 0:S.errors)==null?void 0:O.join(`
462
+ `))||(S==null?void 0:S.error)||"Failed to create bullet system.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(T=(_=this.options).onRefresh)==null||T.call(_)}catch(E){alert(`Failed to create bullet system: ${E instanceof Error?E.message:String(E)}`)}if(e==="spawner"){let E=await this.promptSpawnerConfig();if(!E)return;let{templateId:S,instanceId:I,spawnerProps:P}=E;try{let z=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,templateId:S,instanceId:I,spawnerProps:P})}),D=await z.json().catch(()=>({}));if(!z.ok||(D==null?void 0:D.success)===!1){let N=((A=D==null?void 0:D.errors)==null?void 0:A.join(`
463
+ `))||(D==null?void 0:D.error)||"Failed to create spawner.";alert(N);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(C=(k=this.options).onRefresh)==null||C.call(k)}catch(z){alert(`Failed to create spawner: ${z instanceof Error?z.message:String(z)}`)}}}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[AddObjectMenu] Failed to sync screens:",e)}}};var Xt=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.selectedIds=new Set;this.lastSelectedIndex=-1;this.objectEntries=[];this.options=null;this.retryTimer=null;this.screenFilter="all";this.showTemplates=!1;this.isContextMenuOpen=!1;this.systemBundles=new Map}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getShowTemplatesStorageKey(){return`handler_preview_show_templates::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
464
464
  <div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects">
465
465
  <div class="scene-panel-header" data-panel-handle>
466
466
  <div class="panel-title">
@@ -499,7 +499,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
499
499
  </div>
500
500
  <div class="panel-resize-handle-v" data-panel-resize-v></div>
501
501
  </div>
502
- `}initialize(e,t){var r,o,l,c,d,p,u,g,h;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(r=this.root)==null?void 0:r.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(l=this.searchInput)==null||l.addEventListener("input",()=>this.refreshObjects()),(c=this.listContainer)==null||c.addEventListener("click",m=>{let f=m.target,b=f==null?void 0:f.closest("[data-object-visibility-toggle][data-object-id]");if(b){let x=b.dataset.objectId;if(!x)return;m.preventDefault(),m.stopPropagation(),this.toggleObjectVisibility(x);return}let v=f==null?void 0:f.closest("[data-system-bundle-action][data-system-bundle-id]");if(!v)return;m.preventDefault(),m.stopPropagation();let w=v.dataset.systemBundleAction,y=v.dataset.systemBundleId;if(!(!w||!y)){if(w==="toggle-visibility"){this.toggleSystemBundleVisibility(y);return}w==="delete"&&this.deleteSystemBundle(y)}});let i=(d=this.root)==null?void 0:d.querySelector("[data-add-object]");i==null||i.addEventListener("click",m=>{m.stopPropagation();let f=i.getBoundingClientRect();this.openAddObjectMenu({x:f.left,y:f.bottom+4})});let n=(p=this.root)==null?void 0:p.querySelector("#scene-screen-filter");if(n){try{let m=window.localStorage.getItem(this.getScreenFilterStorageKey());m&&(this.screenFilter=m)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let m=n.value||"all";this.screenFilter=m;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}let a=(u=this.root)==null?void 0:u.querySelector("#scene-templates-toggle");if(a){try{let m=window.localStorage.getItem(this.getShowTemplatesStorageKey());this.showTemplates=m==="true"}catch{}a.checked=this.showTemplates,a.addEventListener("change",()=>{this.showTemplates=!!a.checked;try{window.localStorage.setItem(this.getShowTemplatesStorageKey(),this.showTemplates?"true":"false")}catch{}this.refreshObjects()})}(g=this.root)==null||g.addEventListener("click",m=>{let f=m.target;if(!f||f.closest("[data-context-menu]"))return;if(f.tagName==="INPUT"&&f.classList.contains("scene-object-checkbox")){let M=f.dataset.objectId;if(!M)return;m.stopPropagation(),this.toggleBatchSelect(M);return}let b=f.closest(".scene-object-item[data-object-id]");if(!b)return;let v=b.dataset.objectId;if(!v)return;let w=m.ctrlKey||m.metaKey;m.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,v):w?this.toggleBatchSelect(v):this.select(v)}),(h=this.listContainer)==null||h.addEventListener("contextmenu",m=>{var M;let f=m.target,b=f==null?void 0:f.closest("[data-object-id]");if(!b)return;let v=b.dataset.objectId;if(!v)return;m.preventDefault();let w=window.getEditableObjectConfig,y=typeof w=="function"?w(v):null;if(!y){let j=window.__editableObjectConfigs;j&&typeof j.get=="function"&&(y=(M=j.get(v))!=null?M:null)}let x=this.inferScreen(v,y);this.showContextMenu(v,x,m.clientX,m.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){e?(this.selectedIds.clear(),this.selectedIds.add(e),this.selectedId=e):(this.selectedIds.clear(),this.selectedId=null),this.updateSelectionUI()}getSelectedIds(){return Array.from(this.selectedIds)}updateSelectionUI(){var a,r,o,l,c;if(!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{let p=d.dataset.objectId,u=p?this.selectedIds.has(p):!1,g=p===this.selectedId;d.classList.toggle("selected",u),d.classList.toggle("active",g);let h=d.closest(".scene-object-item-wrapper"),m=h==null?void 0:h.querySelector(".scene-object-checkbox");m&&(m.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(r=this.root)==null?void 0:r.querySelector("[data-breadcrumb-screen]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-object]");if(t&&i&&n){let d=this.selectedIds.size===1?this.selectedId:null;if(d){let p=window.getEditableObjectConfig,u=typeof p=="function"?p(d):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(l=b.get(d))!=null?l:null)}let g=this.inferScreen(d,u),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},m=(((c=u==null?void 0:u.identity)==null?void 0:c.id)||d).toString(),f=this.formatDisplayName(m);i.textContent=h[g]||g,n.textContent=f,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var w;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.refreshEditableConfigIndex;if(typeof t=="function"&&t(),typeof e!="function"){this.scheduleRetry();return}let i=e();if(!Array.isArray(i)||i.length===0){let y=window.__editableObjectConfigs;y&&typeof y.keys=="function"&&(i=Array.from(y.keys()))}if(!Array.isArray(i)||i.length===0){this.scheduleRetry();return}let n=(((w=this.searchInput)==null?void 0:w.value)||"").trim().toLowerCase(),a=["loading","start","gameplay","tutorial","endgame"],r=Object.fromEntries(a.map(y=>[y,[]])),o=Object.fromEntries(a.map(y=>[y,[]])),l=[],c=[],d=new Map;this.systemBundles=new Map;let p=y=>{var j,L,_,O,T;let x=(O=(_=(L=(j=window.__editableConfig)==null?void 0:j.objects)==null?void 0:L.get)==null?void 0:_.call(L,y))!=null?O:null;if(x)return x;let M=window.__editableObjectConfigs;return M&&typeof M.get=="function"&&(T=M.get(y))!=null?T:null};i.forEach(y=>{var N,H,F,G,Y,Q,ie,le;let x=p(y),M=(((N=x==null?void 0:x.identity)==null?void 0:N.category)||"scene").toString(),j=(((H=x==null?void 0:x.identity)==null?void 0:H.id)||y).toString(),L=M.toLowerCase(),_=j.toLowerCase(),O=L.includes("ui")||_.startsWith("ui")||_.includes("label"),T=L==="system",A=((F=x==null?void 0:x.identity)==null?void 0:F.is_template)===!0||_.includes(".template")||y.toLowerCase().includes(".template"),k=typeof((G=x==null?void 0:x.identity)==null?void 0:G.system_group)=="string"?x.identity.system_group:null,C=typeof((Y=x==null?void 0:x.identity)==null?void 0:Y.system_label)=="string"?x.identity.system_label:k?this.formatDisplayName(k):null,E=this.formatDisplayName(j||y),S=((Q=x==null?void 0:x.render)==null?void 0:Q.visible)===!1||(x==null?void 0:x.enabled)===!1,I=this.getObjectType(x),P={id:y,label:E,category:M,isUi:O,isTemplate:A,isUnused:S,objectType:I,systemGroupId:k,systemLabel:C},R=this.inferScreen(P.id,x);if(!(this.screenFilter!=="all"&&R!==this.screenFilter||!(!n||P.id.toLowerCase().includes(n)||P.label.toLowerCase().includes(n)))){if(k){if(A&&!this.showTemplates)return;let $=(ie=d.get(k))!=null?ie:[];$.push(P),d.set(k,$);let Z=(le=this.systemBundles.get(k))!=null?le:{label:C!=null?C:k,objectIds:[]};Z.label=C!=null?C:Z.label,Z.objectIds.push(y),this.systemBundles.set(k,Z);return}if(A){if(!this.showTemplates)return;c.push(P);return}T?l.push(P):(P.isUnused?o:r)[R].push(P)}});let u={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=[...Array.from(d.entries()).map(([y,x])=>{var M,j,L,_;return{groupId:y,label:(j=(M=this.systemBundles.get(y))==null?void 0:M.label)!=null?j:y,objectIds:(_=(L=this.systemBundles.get(y))==null?void 0:L.objectIds)!=null?_:[],entries:x}})].sort((y,x)=>y.label.localeCompare(x.label)),m=h.length>0?this.renderSystemBundlesGroup(h):"",f=l.length>0?this.renderSystemGroup(l):"",b=a.map(y=>this.renderGroup(u[y],[...r[y],...o[y]])).join(""),v=c.length>0?this.renderGroup("Templates",c):"";if(this.listContainer.innerHTML=m+f+b+v,this.objectEntries=[...h.flatMap(y=>y.entries),...l,...a.flatMap(y=>[...r[y],...o[y]]),...c],l.length>0){let y=this.listContainer.querySelector("[data-delete-system-group]");y==null||y.addEventListener("click",x=>{x.stopPropagation(),this.deleteSystemGroup(l)})}this.updateSelectionUI()}renderSystemBundlesGroup(e){if(!e.length)return"";let t=e.map(i=>this.renderSystemBundle(i.groupId,i.label,i.objectIds,i.entries)).join("");return`
502
+ `}initialize(e,t){var r,o,l,c,d,p,u,g,h;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(r=this.root)==null?void 0:r.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(l=this.searchInput)==null||l.addEventListener("input",()=>this.refreshObjects()),(c=this.listContainer)==null||c.addEventListener("click",m=>{let f=m.target,b=f==null?void 0:f.closest("[data-object-visibility-toggle][data-object-id]");if(b){let x=b.dataset.objectId;if(!x)return;m.preventDefault(),m.stopPropagation(),this.toggleObjectVisibility(x);return}let v=f==null?void 0:f.closest("[data-system-bundle-action][data-system-bundle-id]");if(!v)return;m.preventDefault(),m.stopPropagation();let w=v.dataset.systemBundleAction,y=v.dataset.systemBundleId;if(!(!w||!y)){if(w==="toggle-visibility"){this.toggleSystemBundleVisibility(y);return}w==="delete"&&this.deleteSystemBundle(y)}});let i=(d=this.root)==null?void 0:d.querySelector("[data-add-object]");i==null||i.addEventListener("click",m=>{m.stopPropagation();let f=i.getBoundingClientRect();this.openAddObjectMenu({x:f.left,y:f.bottom+4})});let n=(p=this.root)==null?void 0:p.querySelector("#scene-screen-filter");if(n){try{let m=window.localStorage.getItem(this.getScreenFilterStorageKey());m&&(this.screenFilter=m)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let m=n.value||"all";this.screenFilter=m;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}let a=(u=this.root)==null?void 0:u.querySelector("#scene-templates-toggle");if(a){try{let m=window.localStorage.getItem(this.getShowTemplatesStorageKey());this.showTemplates=m==="true"}catch{}a.checked=this.showTemplates,a.addEventListener("change",()=>{this.showTemplates=!!a.checked;try{window.localStorage.setItem(this.getShowTemplatesStorageKey(),this.showTemplates?"true":"false")}catch{}this.refreshObjects()})}(g=this.root)==null||g.addEventListener("click",m=>{let f=m.target;if(!f||f.closest("[data-context-menu]"))return;if(f.tagName==="INPUT"&&f.classList.contains("scene-object-checkbox")){let M=f.dataset.objectId;if(!M)return;m.stopPropagation(),this.toggleBatchSelect(M);return}let b=f.closest(".scene-object-item[data-object-id]");if(!b)return;let v=b.dataset.objectId;if(!v)return;let w=m.ctrlKey||m.metaKey;m.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,v):w?this.toggleBatchSelect(v):this.select(v)}),(h=this.listContainer)==null||h.addEventListener("contextmenu",m=>{var M;let f=m.target,b=f==null?void 0:f.closest("[data-object-id]");if(!b)return;let v=b.dataset.objectId;if(!v)return;m.preventDefault();let w=window.getEditableObjectConfig,y=typeof w=="function"?w(v):null;if(!y){let j=window.__editableObjectConfigs;j&&typeof j.get=="function"&&(y=(M=j.get(v))!=null?M:null)}let x=this.inferScreen(v,y);this.showContextMenu(v,x,m.clientX,m.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){e?(this.selectedIds.clear(),this.selectedIds.add(e),this.selectedId=e):(this.selectedIds.clear(),this.selectedId=null),this.updateSelectionUI()}getSelectedIds(){return Array.from(this.selectedIds)}updateSelectionUI(){var a,r,o,l,c;if(!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{let p=d.dataset.objectId,u=p?this.selectedIds.has(p):!1,g=p===this.selectedId;d.classList.toggle("selected",u),d.classList.toggle("active",g);let h=d.closest(".scene-object-item-wrapper"),m=h==null?void 0:h.querySelector(".scene-object-checkbox");m&&(m.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(r=this.root)==null?void 0:r.querySelector("[data-breadcrumb-screen]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-object]");if(t&&i&&n){let d=this.selectedIds.size===1?this.selectedId:null;if(d){let p=window.getEditableObjectConfig,u=typeof p=="function"?p(d):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(l=b.get(d))!=null?l:null)}let g=this.inferScreen(d,u),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},m=(((c=u==null?void 0:u.identity)==null?void 0:c.id)||d).toString(),f=this.formatDisplayName(m);i.textContent=h[g]||g,n.textContent=f,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var w;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.refreshEditableConfigIndex;if(typeof t=="function"&&t(),typeof e!="function"){this.scheduleRetry();return}let i=e();if(!Array.isArray(i)||i.length===0){let y=window.__editableObjectConfigs;y&&typeof y.keys=="function"&&(i=Array.from(y.keys()))}if(!Array.isArray(i)||i.length===0){this.scheduleRetry();return}let n=(((w=this.searchInput)==null?void 0:w.value)||"").trim().toLowerCase(),a=["loading","start","gameplay","tutorial","endgame"],r=Object.fromEntries(a.map(y=>[y,[]])),o=Object.fromEntries(a.map(y=>[y,[]])),l=[],c=[],d=new Map;this.systemBundles=new Map;let p=y=>{var j,L,O,_,T;let x=(_=(O=(L=(j=window.__editableConfig)==null?void 0:j.objects)==null?void 0:L.get)==null?void 0:O.call(L,y))!=null?_:null;if(x)return x;let M=window.__editableObjectConfigs;return M&&typeof M.get=="function"&&(T=M.get(y))!=null?T:null};i.forEach(y=>{var N,H,B,G,Y,Q,ie,le;let x=p(y),M=(((N=x==null?void 0:x.identity)==null?void 0:N.category)||"scene").toString(),j=(((H=x==null?void 0:x.identity)==null?void 0:H.id)||y).toString(),L=M.toLowerCase(),O=j.toLowerCase(),_=L.includes("ui")||O.startsWith("ui")||O.includes("label"),T=L==="system",A=((B=x==null?void 0:x.identity)==null?void 0:B.is_template)===!0||O.includes(".template")||y.toLowerCase().includes(".template"),k=typeof((G=x==null?void 0:x.identity)==null?void 0:G.system_group)=="string"?x.identity.system_group:null,C=typeof((Y=x==null?void 0:x.identity)==null?void 0:Y.system_label)=="string"?x.identity.system_label:k?this.formatDisplayName(k):null,E=this.formatDisplayName(j||y),S=((Q=x==null?void 0:x.render)==null?void 0:Q.visible)===!1||(x==null?void 0:x.enabled)===!1,I=this.getObjectType(x),P={id:y,label:E,category:M,isUi:_,isTemplate:A,isUnused:S,objectType:I,systemGroupId:k,systemLabel:C},z=this.inferScreen(P.id,x);if(!(this.screenFilter!=="all"&&z!==this.screenFilter||!(!n||P.id.toLowerCase().includes(n)||P.label.toLowerCase().includes(n)))){if(k){if(A&&!this.showTemplates)return;let $=(ie=d.get(k))!=null?ie:[];$.push(P),d.set(k,$);let Z=(le=this.systemBundles.get(k))!=null?le:{label:C!=null?C:k,objectIds:[]};Z.label=C!=null?C:Z.label,Z.objectIds.push(y),this.systemBundles.set(k,Z);return}if(A){if(!this.showTemplates)return;c.push(P);return}T?l.push(P):(P.isUnused?o:r)[z].push(P)}});let u={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=[...Array.from(d.entries()).map(([y,x])=>{var M,j,L,O;return{groupId:y,label:(j=(M=this.systemBundles.get(y))==null?void 0:M.label)!=null?j:y,objectIds:(O=(L=this.systemBundles.get(y))==null?void 0:L.objectIds)!=null?O:[],entries:x}})].sort((y,x)=>y.label.localeCompare(x.label)),m=h.length>0?this.renderSystemBundlesGroup(h):"",f=l.length>0?this.renderSystemGroup(l):"",b=a.map(y=>this.renderGroup(u[y],[...r[y],...o[y]])).join(""),v=c.length>0?this.renderGroup("Templates",c):"";if(this.listContainer.innerHTML=m+f+b+v,this.objectEntries=[...h.flatMap(y=>y.entries),...l,...a.flatMap(y=>[...r[y],...o[y]]),...c],l.length>0){let y=this.listContainer.querySelector("[data-delete-system-group]");y==null||y.addEventListener("click",x=>{x.stopPropagation(),this.deleteSystemGroup(l)})}this.updateSelectionUI()}renderSystemBundlesGroup(e){if(!e.length)return"";let t=e.map(i=>this.renderSystemBundle(i.groupId,i.label,i.objectIds,i.entries)).join("");return`
503
503
  <div class="scene-object-group scene-object-group-system">
504
504
  <div class="scene-object-group-title">
505
505
  <span>\u{1F9E9} Systems <span class="scene-object-count">${e.length}</span></span>
@@ -1013,7 +1013,7 @@ ${m}
1013
1013
  Add Logic
1014
1014
  </button>
1015
1015
  </div>
1016
- `:m}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let p=c[t];if(p&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let h=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,h,n,p)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),m=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?m+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':m}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let m=["1","-1"],f=i==null?"1":String(i);return this.selectRenderer.render(e,t,f,n,m)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let m=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,m,n)}}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function ws(s,e){let t;return function(...n){let a=()=>{clearTimeout(t),s(...n)};clearTimeout(t),t=setTimeout(a,e)}}var ui=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new pi,this.updateManager=new ze,this.quickActions=new Vt;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
1016
+ `:m}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let p=c[t];if(p&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let h=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,h,n,p)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),m=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?m+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':m}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let m=["1","-1"],f=i==null?"1":String(i);return this.selectRenderer.render(e,t,f,n,m)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let m=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,m,n)}}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function ws(s,e){let t;return function(...n){let a=()=>{clearTimeout(t),s(...n)};clearTimeout(t),t=setTimeout(a,e)}}var ui=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new pi,this.updateManager=new Re,this.quickActions=new Vt;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
1017
1017
  <div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
1018
1018
  <div class="scene-panel-header" data-panel-handle>
1019
1019
  <div class="panel-title">
@@ -1111,11 +1111,11 @@ ${m}
1111
1111
  ${f.join("")}
1112
1112
  </div>
1113
1113
  </div>
1114
- `);let x=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),M=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),j=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),L=[u("continuousRotate.enabled"),u("continuousRotate.speed"),u("continuousRotate.direction")].filter(Boolean),_=[u("orbit.enabled"),u("orbit.radius"),u("orbit.speed"),u("orbit.direction"),u("orbit.pivotOffsetX"),u("orbit.pivotOffsetY")].filter(Boolean);if(x.length||M.length||j.length||L.length||_.length){let T=(k,C)=>C.length?`
1114
+ `);let x=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),M=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),j=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),L=[u("continuousRotate.enabled"),u("continuousRotate.speed"),u("continuousRotate.direction")].filter(Boolean),O=[u("orbit.enabled"),u("orbit.radius"),u("orbit.speed"),u("orbit.direction"),u("orbit.pivotOffsetX"),u("orbit.pivotOffsetY")].filter(Boolean);if(x.length||M.length||j.length||L.length||O.length){let T=(k,C)=>C.length?`
1115
1115
  <div class="inspector-motion-continuous-group">
1116
1116
  <div class="inspector-subsection-title">${k}</div>
1117
1117
  <div class="inspector-subsection-content">${C.join("")}</div>
1118
- </div>`:"",A=[T("Pulse",x),T("Swing",M),T("Move forever",j),T("Rotate (pivoting itself)",L),T("Rotate around",_)].filter(Boolean).join("");n.push(`
1118
+ </div>`:"",A=[T("Pulse",x),T("Swing",M),T("Move forever",j),T("Rotate (pivoting itself)",L),T("Rotate around",O)].filter(Boolean).join("");n.push(`
1119
1119
  <div class="inspector-subsection inspector-subsection-continuous">
1120
1120
  <div class="inspector-subsection-title">Continuous</div>
1121
1121
  <div class="inspector-subsection-content inspector-motion-continuous-groups">
@@ -1135,7 +1135,7 @@ ${m}
1135
1135
  ${n.join("")}
1136
1136
  </div>
1137
1137
  </div>
1138
- `}attachEventListeners(){var y,x,M,j;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=ws((L,_,O)=>{var T,A;this.updateManager.updateProperty(L,_,O),(A=(T=this.options)==null?void 0:T.onPropertyChange)==null||A.call(T,L,_,O)},300),i=L=>L?/(^|\.)logic(\.\d+)?\.id$/.test(L):!1;e.forEach(L=>{let _=T=>{var E,S;let A=T.target,k=A.dataset.propertyPath,C=A.dataset.objectId;if(k&&C){let I=A.value;if(A.type==="checkbox")I=A.checked;else if(A.type==="number"){if(I=parseFloat(A.value),isNaN(I))return}else if(A.dataset.json==="true")try{I=JSON.parse(A.value)}catch{return}A.type==="text"||A.type==="range"||A.tagName==="TEXTAREA"?t(C,k,I):(this.updateManager.updateProperty(C,k,I),(S=(E=this.options)==null?void 0:E.onPropertyChange)==null||S.call(E,C,k,I))}},O=L.dataset.propertyPath;i(O)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",O),L.addEventListener("change",async T=>{var D;let A=T.target,k=A.dataset.propertyPath,C=A.dataset.objectId,E=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",E),!k||!C)return;await this.updateManager.updateProperty(C,k,E),console.log("[Inspector v1.0.0] Logic ID updated");let S=window,I=(D=S==null?void 0:S.__HANDLER_LOGIC_META)==null?void 0:D[E],P=this.getDefaultPropsForLogic(E,I);console.log("[Inspector v1.0.0] New logic default props:",P);let R=k.replace(/\.id$/,".props");await this.updateManager.updateProperty(C,R,P),console.log("[Inspector v1.0.0] Logic props updated to:",P),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(C)})):(L.addEventListener("change",_),(L.tagName==="INPUT"||L.tagName==="TEXTAREA")&&L.addEventListener("input",_))}),this.contentContainer.querySelectorAll("[data-action]").forEach(L=>{L.addEventListener("click",_=>{let O=_.target,T=O.dataset.action,A=O.dataset.path,k=O.dataset.object;T&&A&&k&&this.quickActions.handleAction(T,k,A)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(L=>{L.addEventListener("click",_=>{var A,k;let O=_.target,T=O.dataset.sectionToggle||((A=O.closest("[data-section-toggle]"))==null?void 0:A.getAttribute("data-section-toggle"));if(T){let C=(k=this.contentContainer)==null?void 0:k.querySelector(`[data-section="${T}"]`);C==null||C.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(L=>{L.addEventListener("click",async _=>{let T=_.currentTarget.dataset.motionPreset;!T||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,T)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(L=>{L.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(L=>{L.addEventListener("click",async _=>{let O=_.target,T=O.dataset.objectId,A=O.dataset.propertyPath;if(!T||!A)return;let k=window.getEditableObjectConfig,C=k==null?void 0:k(T);if(!C)return;let E=this.updateManager.getNestedProperty(C,A),S=Array.isArray(E)?[...E]:[];S.push({x:0,y:0}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(L=>{L.addEventListener("click",async _=>{let O=_.target,T=O.dataset.objectId,A=O.dataset.propertyPath,k=Number(O.dataset.index||"-1");if(!T||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(T);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let I=S.filter((P,R)=>R!==k);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(L=>{L.addEventListener("click",async _=>{let O=_.target,T=O.dataset.objectId,A=O.dataset.propertyPath;if(!T||!A)return;let k=window.getEditableObjectConfig,C=k==null?void 0:k(T);if(!C)return;let E=this.updateManager.getNestedProperty(C,A),S=Array.isArray(E)?[...E]:[];S.push({templateId:"",weight:1}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(L=>{L.addEventListener("click",async _=>{var P;let O=_.target,T=O.dataset.objectId,A=O.dataset.propertyPath,k=Number((P=O.dataset.index)!=null?P:-1);if(!T||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(T);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let I=S.filter((R,D)=>D!==k);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(L=>{L.addEventListener("click",async _=>{var N;let O=_.target,T=O.dataset.objectId,A=O.dataset.propertyPath;if(!T||!A)return;let k=window.getEditableObjectConfig,C=k==null?void 0:k(T);if(!C)return;let E=this.updateManager.getNestedProperty(C,A),S;Array.isArray(E)?S=[...E]:E!=null?typeof E=="string"?S=[{id:E,props:{}}]:typeof E=="object"?S=[E]:S=[]:S=[];let I=this.getDefaultLogicId(),P=window,R=(N=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:N[I],D=this.getDefaultPropsForLogic(I,R);S.push({id:I,props:D}),console.log("[InspectorPanel] Adding logic to array:",{objectId:T,path:A,current:E,next:S}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(L=>{L.addEventListener("click",async _=>{var P;let O=_.target,T=O.dataset.objectId,A=O.dataset.propertyPath,k=Number((P=O.dataset.index)!=null?P:-1);if(!T||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(T);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let I=S.filter((R,D)=>D!==k);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(L=>{L.addEventListener("click",async _=>{var H,F;let O=_.target,T=O.dataset.objectId,A=O.dataset.propertyPath,k=Number((H=O.dataset.index)!=null?H:-1);if(!T||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(T);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let I=S[k];if(typeof I!="string")return;let P=window,R=(F=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:F[I],D=this.getDefaultPropsForLogic(I,R),N=[...S];N[k]={id:I,props:D},await this.updateManager.updateProperty(T,A,N),this.loadObject(T)})});let f=(y=this.root)==null?void 0:y.querySelector("[data-inspector-advanced]");f==null||f.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(x=this.root)==null?void 0:x.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var _;let L=(_=this.root)==null?void 0:_.querySelector("[data-convert-menu]");L==null||L.classList.toggle("hidden")});let v=(M=this.contentContainer)==null?void 0:M.querySelector("[data-inspector-add-component-btn]"),w=(j=this.contentContainer)==null?void 0:j.querySelector("[data-inspector-component-select]");v==null||v.addEventListener("click",async()=>{let L=w.value;L&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,L)})}getMotionDefaults(){var i,n,a,r;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(r=(a=t.motion)==null?void 0:a.defaults)!=null?r:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),r={...(l=n.motion)!=null?l:a},o={...(c=r.intro)!=null?c:{}};r.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",r.intro=o,await this.updateManager.updateProperty(e,"motion",r),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},r={...(l=a.intro)!=null?l:{}};a.enabled=!0,r.enabled=!0,a.intro=r,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,r=a==null?void 0:a.schemas,o=null;r instanceof Map?o=r.get(t):r&&typeof r=="object"&&(o=r[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,r;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((r=(a=i.render)==null?void 0:a.asset)==null?void 0:r.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
1138
+ `}attachEventListeners(){var y,x,M,j;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=ws((L,O,_)=>{var T,A;this.updateManager.updateProperty(L,O,_),(A=(T=this.options)==null?void 0:T.onPropertyChange)==null||A.call(T,L,O,_)},300),i=L=>L?/(^|\.)logic(\.\d+)?\.id$/.test(L):!1;e.forEach(L=>{let O=T=>{var E,S;let A=T.target,k=A.dataset.propertyPath,C=A.dataset.objectId;if(k&&C){let I=A.value;if(A.type==="checkbox")I=A.checked;else if(A.type==="number"){if(I=parseFloat(A.value),isNaN(I))return}else if(A.dataset.json==="true")try{I=JSON.parse(A.value)}catch{return}A.type==="text"||A.type==="range"||A.tagName==="TEXTAREA"?t(C,k,I):(this.updateManager.updateProperty(C,k,I),(S=(E=this.options)==null?void 0:E.onPropertyChange)==null||S.call(E,C,k,I))}},_=L.dataset.propertyPath;i(_)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",_),L.addEventListener("change",async T=>{var D;let A=T.target,k=A.dataset.propertyPath,C=A.dataset.objectId,E=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",E),!k||!C)return;await this.updateManager.updateProperty(C,k,E),console.log("[Inspector v1.0.0] Logic ID updated");let S=window,I=(D=S==null?void 0:S.__HANDLER_LOGIC_META)==null?void 0:D[E],P=this.getDefaultPropsForLogic(E,I);console.log("[Inspector v1.0.0] New logic default props:",P);let z=k.replace(/\.id$/,".props");await this.updateManager.updateProperty(C,z,P),console.log("[Inspector v1.0.0] Logic props updated to:",P),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(C)})):(L.addEventListener("change",O),(L.tagName==="INPUT"||L.tagName==="TEXTAREA")&&L.addEventListener("input",O))}),this.contentContainer.querySelectorAll("[data-action]").forEach(L=>{L.addEventListener("click",O=>{let _=O.target,T=_.dataset.action,A=_.dataset.path,k=_.dataset.object;T&&A&&k&&this.quickActions.handleAction(T,k,A)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(L=>{L.addEventListener("click",O=>{var A,k;let _=O.target,T=_.dataset.sectionToggle||((A=_.closest("[data-section-toggle]"))==null?void 0:A.getAttribute("data-section-toggle"));if(T){let C=(k=this.contentContainer)==null?void 0:k.querySelector(`[data-section="${T}"]`);C==null||C.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(L=>{L.addEventListener("click",async O=>{let T=O.currentTarget.dataset.motionPreset;!T||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,T)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(L=>{L.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(L=>{L.addEventListener("click",async O=>{let _=O.target,T=_.dataset.objectId,A=_.dataset.propertyPath;if(!T||!A)return;let k=window.getEditableObjectConfig,C=k==null?void 0:k(T);if(!C)return;let E=this.updateManager.getNestedProperty(C,A),S=Array.isArray(E)?[...E]:[];S.push({x:0,y:0}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(L=>{L.addEventListener("click",async O=>{let _=O.target,T=_.dataset.objectId,A=_.dataset.propertyPath,k=Number(_.dataset.index||"-1");if(!T||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(T);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let I=S.filter((P,z)=>z!==k);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(L=>{L.addEventListener("click",async O=>{let _=O.target,T=_.dataset.objectId,A=_.dataset.propertyPath;if(!T||!A)return;let k=window.getEditableObjectConfig,C=k==null?void 0:k(T);if(!C)return;let E=this.updateManager.getNestedProperty(C,A),S=Array.isArray(E)?[...E]:[];S.push({templateId:"",weight:1}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(L=>{L.addEventListener("click",async O=>{var P;let _=O.target,T=_.dataset.objectId,A=_.dataset.propertyPath,k=Number((P=_.dataset.index)!=null?P:-1);if(!T||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(T);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let I=S.filter((z,D)=>D!==k);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(L=>{L.addEventListener("click",async O=>{var N;let _=O.target,T=_.dataset.objectId,A=_.dataset.propertyPath;if(!T||!A)return;let k=window.getEditableObjectConfig,C=k==null?void 0:k(T);if(!C)return;let E=this.updateManager.getNestedProperty(C,A),S;Array.isArray(E)?S=[...E]:E!=null?typeof E=="string"?S=[{id:E,props:{}}]:typeof E=="object"?S=[E]:S=[]:S=[];let I=this.getDefaultLogicId(),P=window,z=(N=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:N[I],D=this.getDefaultPropsForLogic(I,z);S.push({id:I,props:D}),console.log("[InspectorPanel] Adding logic to array:",{objectId:T,path:A,current:E,next:S}),await this.updateManager.updateProperty(T,A,S),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(L=>{L.addEventListener("click",async O=>{var P;let _=O.target,T=_.dataset.objectId,A=_.dataset.propertyPath,k=Number((P=_.dataset.index)!=null?P:-1);if(!T||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(T);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let I=S.filter((z,D)=>D!==k);await this.updateManager.updateProperty(T,A,I),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(L=>{L.addEventListener("click",async O=>{var H,B;let _=O.target,T=_.dataset.objectId,A=_.dataset.propertyPath,k=Number((H=_.dataset.index)!=null?H:-1);if(!T||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(T);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let I=S[k];if(typeof I!="string")return;let P=window,z=(B=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:B[I],D=this.getDefaultPropsForLogic(I,z),N=[...S];N[k]={id:I,props:D},await this.updateManager.updateProperty(T,A,N),this.loadObject(T)})});let f=(y=this.root)==null?void 0:y.querySelector("[data-inspector-advanced]");f==null||f.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(x=this.root)==null?void 0:x.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var O;let L=(O=this.root)==null?void 0:O.querySelector("[data-convert-menu]");L==null||L.classList.toggle("hidden")});let v=(M=this.contentContainer)==null?void 0:M.querySelector("[data-inspector-add-component-btn]"),w=(j=this.contentContainer)==null?void 0:j.querySelector("[data-inspector-component-select]");v==null||v.addEventListener("click",async()=>{let L=w.value;L&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,L)})}getMotionDefaults(){var i,n,a,r;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(r=(a=t.motion)==null?void 0:a.defaults)!=null?r:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),r={...(l=n.motion)!=null?l:a},o={...(c=r.intro)!=null?c:{}};r.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",r.intro=o,await this.updateManager.updateProperty(e,"motion",r),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},r={...(l=a.intro)!=null?l:{}};a.enabled=!0,r.enabled=!0,a.intro=r,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,r=a==null?void 0:a.schemas,o=null;r instanceof Map?o=r.get(t):r&&typeof r=="object"&&(o=r[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,r;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((r=(a=i.render)==null?void 0:a.asset)==null?void 0:r.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
1139
1139
  <div class="inspector-empty">
1140
1140
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
1141
1141
  <span class="inspector-empty-text">${e}</span>
@@ -1145,7 +1145,7 @@ ${m}
1145
1145
  <span class="inspector-empty-icon">\u{1F3AF}</span>
1146
1146
  <span class="inspector-empty-text">Select an object to inspect</span>
1147
1147
  </div>
1148
- `)}};function cn(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function ir(s){var n;let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function nr(s){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=s})}async function gi(s){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",s);let i=await fetch(s);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,s),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await cn(n),r=await nr(a),o=ir(a);return console.log("[ImageUtils] Success resolution:",r==null?void 0:r.width,"x",r==null?void 0:r.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:a,width:(e=r==null?void 0:r.width)!=null?e:0,height:(t=r==null?void 0:r.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function De(s){var e,t;try{let i=await cn(s),n=await nr(i),a=ir(i);return{base64:a.base64,mimeType:a.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function dn(s){return cn(s).then(e=>e).catch(()=>null)}function pn(s,e){var t;try{let[i,n]=s.split(","),a=i.match(/data:(.*?);base64/),r=(t=a==null?void 0:a[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:r})}catch{return null}}async function at(s,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((p,u)=>{let g=new Image;g.onload=()=>p(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=s}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),s;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),r=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(p=>({r:r[p.offset],g:r[p.offset+1],b:r[p.offset+2]})),c=0;for(let p=0;p<r.length;p+=4){let u=r[p],g=r[p+1],h=r[p+2],m=!1;for(let f of l)if(Math.sqrt(Math.pow(u-f.r,2)+Math.pow(g-f.g,2)+Math.pow(h-f.b,2))<e){m=!0;break}m&&(r[p+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),s}}function ar(s,e){if(!s||!e)return"1:1";let t=s/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function Le(s){return typeof s=="object"&&s!==null&&!Array.isArray(s)}function te(s){return typeof s=="string"?s:void 0}function rr(s){return s.toLowerCase().endsWith(".png")?s.slice(0,-4):s}function xs(s){var i,n,a;let e=(i=te(s.id))!=null?i:te(s.name);if(e)return e;let t=(n=te(s.file))!=null?n:te(s.asset);return t?rr((a=t.split("/").pop())!=null?a:t):void 0}function Ss(s,e,t){var i,n,a;if(typeof e=="string")return{id:s,file:e,role:t};if(Le(e)){let r=(i=te(e.file))!=null?i:te(e.asset);return r?{id:(n=te(e.id))!=null?n:s,file:r,role:(a=te(e.role))!=null?a:t,dataUrl:te(e.dataUrl),layout:e.layout}:null}return null}function un(s,e){var t,i,n;if(!s)return[];if(Array.isArray(s)){let a=[];for(let r of s){if(typeof r=="string"){let o=rr((t=r.split("/").pop())!=null?t:r);a.push({id:o,file:r,role:e});continue}if(Le(r)){let o=xs(r),l=(i=te(r.file))!=null?i:te(r.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=te(r.role))!=null?n:e,dataUrl:te(r.dataUrl),layout:r.layout})}}return a}if(Le(s)){let a=[];for(let[r,o]of Object.entries(s)){let l=Ss(r,o,e);l&&a.push(l)}return a}return[]}function Es(s){var e,t;return(t=(e=te(s.brand_name))!=null?e:te(s.brandName))!=null?t:te(s.name)}function As(s){if(Le(s.brand_dna)&&Le(s.brand_dna.colors))return s.brand_dna;if(Le(s.colors)){let e={colors:s.colors};return typeof s.style=="string"&&(e.style=s.style),Le(s.fonts)&&(e.fonts=s.fonts),e}}function Cs(s){var t;let e=new Map;for(let i of s){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function sr(s,e={}){var r,o,l;let t=s.filter(Le),i=(o=(r=t.map(Es).find(Boolean))!=null?r:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(As).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...un(c.layers,"visual element")),"assets"in c&&a.push(...un(c.assets,"visual element")),Le(c.endgame)&&"assets"in c.endgame&&a.push(...un(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:Cs(a)}}import{GoogleGenAI as Ts}from"@google/genai";async function hi(s,e,t=[],i={}){var n,a,r,o,l,c,d;try{if(!(s!=null&&s.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let v=t[b];if(!v.base64||!v.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(v.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!v.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${v.mimeType}`)}let p=new Ts({apiKey:s}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,v)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${v+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await p.models.generateContent({model:u,contents:g}),m="",f=(r=(a=(n=h.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:r.parts;if(f)for(let b of f)b.text&&(m+=b.text);if(!m.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${m.length}`),m}catch(p){throw console.error("[Gemini] API error:",p),(o=p.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=p.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=p.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=p.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):p}}import{GoogleGenAI as Ls}from"@google/genai";async function rt(s,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new Ls({apiKey:s}),a=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let r=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!r.candidates||!r.candidates[0]||!r.candidates[0].content||!r.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let o of r.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,c=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function or(s){let e=s.brandAssets.map(a=>{let r=`- ${a.id}: ${a.role}`;return a.layout&&(r+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),r}).join(`
1148
+ `)}};function cn(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function ir(s){var n;let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function nr(s){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=s})}async function gi(s){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",s);let i=await fetch(s);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,s),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await cn(n),r=await nr(a),o=ir(a);return console.log("[ImageUtils] Success resolution:",r==null?void 0:r.width,"x",r==null?void 0:r.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:a,width:(e=r==null?void 0:r.width)!=null?e:0,height:(t=r==null?void 0:r.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function De(s){var e,t;try{let i=await cn(s),n=await nr(i),a=ir(i);return{base64:a.base64,mimeType:a.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function dn(s){return cn(s).then(e=>e).catch(()=>null)}function pn(s,e){var t;try{let[i,n]=s.split(","),a=i.match(/data:(.*?);base64/),r=(t=a==null?void 0:a[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:r})}catch{return null}}async function rt(s,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((p,u)=>{let g=new Image;g.onload=()=>p(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=s}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),s;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),r=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(p=>({r:r[p.offset],g:r[p.offset+1],b:r[p.offset+2]})),c=0;for(let p=0;p<r.length;p+=4){let u=r[p],g=r[p+1],h=r[p+2],m=!1;for(let f of l)if(Math.sqrt(Math.pow(u-f.r,2)+Math.pow(g-f.g,2)+Math.pow(h-f.b,2))<e){m=!0;break}m&&(r[p+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),s}}function ar(s,e){if(!s||!e)return"1:1";let t=s/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function Le(s){return typeof s=="object"&&s!==null&&!Array.isArray(s)}function te(s){return typeof s=="string"?s:void 0}function rr(s){return s.toLowerCase().endsWith(".png")?s.slice(0,-4):s}function xs(s){var i,n,a;let e=(i=te(s.id))!=null?i:te(s.name);if(e)return e;let t=(n=te(s.file))!=null?n:te(s.asset);return t?rr((a=t.split("/").pop())!=null?a:t):void 0}function Ss(s,e,t){var i,n,a;if(typeof e=="string")return{id:s,file:e,role:t};if(Le(e)){let r=(i=te(e.file))!=null?i:te(e.asset);return r?{id:(n=te(e.id))!=null?n:s,file:r,role:(a=te(e.role))!=null?a:t,dataUrl:te(e.dataUrl),layout:e.layout}:null}return null}function un(s,e){var t,i,n;if(!s)return[];if(Array.isArray(s)){let a=[];for(let r of s){if(typeof r=="string"){let o=rr((t=r.split("/").pop())!=null?t:r);a.push({id:o,file:r,role:e});continue}if(Le(r)){let o=xs(r),l=(i=te(r.file))!=null?i:te(r.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=te(r.role))!=null?n:e,dataUrl:te(r.dataUrl),layout:r.layout})}}return a}if(Le(s)){let a=[];for(let[r,o]of Object.entries(s)){let l=Ss(r,o,e);l&&a.push(l)}return a}return[]}function Es(s){var e,t;return(t=(e=te(s.brand_name))!=null?e:te(s.brandName))!=null?t:te(s.name)}function As(s){if(Le(s.brand_dna)&&Le(s.brand_dna.colors))return s.brand_dna;if(Le(s.colors)){let e={colors:s.colors};return typeof s.style=="string"&&(e.style=s.style),Le(s.fonts)&&(e.fonts=s.fonts),e}}function Cs(s){var t;let e=new Map;for(let i of s){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function sr(s,e={}){var r,o,l;let t=s.filter(Le),i=(o=(r=t.map(Es).find(Boolean))!=null?r:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(As).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...un(c.layers,"visual element")),"assets"in c&&a.push(...un(c.assets,"visual element")),Le(c.endgame)&&"assets"in c.endgame&&a.push(...un(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:Cs(a)}}import{GoogleGenAI as Ts}from"@google/genai";async function hi(s,e,t=[],i={}){var n,a,r,o,l,c,d;try{if(!(s!=null&&s.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let v=t[b];if(!v.base64||!v.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(v.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!v.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${v.mimeType}`)}let p=new Ts({apiKey:s}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,v)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${v+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await p.models.generateContent({model:u,contents:g}),m="",f=(r=(a=(n=h.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:r.parts;if(f)for(let b of f)b.text&&(m+=b.text);if(!m.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${m.length}`),m}catch(p){throw console.error("[Gemini] API error:",p),(o=p.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=p.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=p.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=p.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):p}}import{GoogleGenAI as Ls}from"@google/genai";async function st(s,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new Ls({apiKey:s}),a=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let r=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!r.candidates||!r.candidates[0]||!r.candidates[0].content||!r.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let o of r.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,c=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function or(s){let e=s.brandAssets.map(a=>{let r=`- ${a.id}: ${a.role}`;return a.layout&&(r+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),r}).join(`
1149
1149
  `)||"None",t=s.brandDna?`Colors: ${JSON.stringify(s.brandDna.colors)}, Style: ${s.brandDna.style||"not specified"}`:"Not provided",i=s.gameObjects.map(a=>typeof a=="string"?`- id: ${a}`:`- id: ${a.id}${a.category?`, category: ${a.category}`:""}${a.type?`, type: ${a.type}`:""}`).join(`
1150
1150
  `),n="";if(s.brandConfig){let a=s.brandConfig,r=[];a.splash&&r.push(`SPLASH: title="${a.splash.title||""}", subtitle="${a.splash.subtitle||""}", button="${a.splash.button_label||""}"`),a.endgame&&r.push(`ENDGAME: title="${a.endgame.title||""}", subtitle="${a.endgame.subtitle||""}", cta="${a.endgame.cta_label||""}"`),a.tutorial&&r.push(`TUTORIAL: text="${a.tutorial.label_text||""}", helper="${a.tutorial.helper_text||""}"`),r.length>0&&(n=`
1151
1151
  BRAND CONTENT:
@@ -1230,7 +1230,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
1230
1230
 
1231
1231
  OUTPUT:
1232
1232
  Generate the requested asset matching the brand style.${s.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
1233
- `.trim()}function cr(s){return s.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function dr(s,e){return!(s.includes("background")&&(s.includes("_1")||s.includes("splash")||s.includes("endgame")||s.includes("main"))||e==="text"||e==="effects"&&s.includes("particle"))}async function pr(s){var r,o;let e=cr(s.gameObjects),t={gamePrompt:s.gamePrompt,gameObjects:e,brandAssets:s.manifest.assets,brandDna:s.manifest.brand_dna,brandName:s.manifest.brand_name},i=or(t),n=[];if(s.flatDesignDataUrl)try{let l=ur(s.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await hi(s.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(r=l.message)!=null&&r.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return ks(a,s.gameObjects)}function ks(s,e){try{let t=s,i=s.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=s.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:s,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:s,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:s,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function gn(s,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let r=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,r.game_object);try{let o=await Ps(s,r);r.output_dataUrl=o,r.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${r.game_object}:`,o),r.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Ps(s,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&s.manifest){let o=s.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=s.assetFiles.get(o.file);if(l){let c=await De(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(s.flatDesignDataUrl){let o=ur(s.flatDesignDataUrl);o&&t.push(o)}let i=dr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:s.manifest.brand_dna,needsTransparency:i},a=lr(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let r=await rt(s.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await at(r)||r}function ur(s){let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function gr(s,e){let t=s.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],s.assets=i;for(let n of i){let a=e.get(n.file);if(a){let r=await De(a);r&&(n.dataUrl=r.dataUrl)}}}function hr(s){let e=new Map;if(!s)return e;if(s!=null&&s.layers&&Array.isArray(s.layers))for(let t of s.layers){let i=t.asset||t.id||t.name;i&&t.layout&&e.set(i,{position:t.layout.position||{x:0,y:0},scale:t.layout.scale||1,rotation:t.layout.rotation||0})}if(typeof s=="object"&&!Array.isArray(s)){for(let[t,i]of Object.entries(s))if(i&&typeof i=="object"&&"layout"in i){let n=i.layout;e.set(t,{position:(n==null?void 0:n.position)||{x:0,y:0},scale:(n==null?void 0:n.scale)||1,rotation:(n==null?void 0:n.rotation)||0})}}return e}function mr(s,e){if(!s||e.size===0)return null;if(e.has(s))return e.get(s);let t=s.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return e.get(t);for(let[i,n]of e.entries()){let a=i.toLowerCase(),r=t.toLowerCase();if(a===r||a.includes(r)||r.includes(a))return n}return null}function Ms(s){return s.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function fr(){var n,a,r,o,l,c,d;let s=window.getEditableObjectList,e=typeof s=="function"?s():[],t=window.getEditableObjectConfig;if(typeof t!="function")return[];let i=[];for(let p of e)try{let u=t(p);if(!u)continue;(((a=(n=u==null?void 0:u.render)==null?void 0:n.asset)==null?void 0:a.type)==="image"||(o=(r=u==null?void 0:u.render)==null?void 0:r.asset)!=null&&o.path||(l=u==null?void 0:u.render)!=null&&l.asset&&typeof u.render.asset=="string")&&i.push({id:p,name:Ms(p),type:((d=(c=u==null?void 0:u.render)==null?void 0:c.asset)==null?void 0:d.type)||"sprite"})}catch(u){console.warn(`[CanvaZip] Failed to check object ${p}:`,u)}return i.sort((p,u)=>p.name.localeCompare(u.name))}import{Assets as mi}from"pixi.js";async function br(s,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await mi.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)we[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function vr(s,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,r=typeof a=="function"?a():null,o=(t=r==null?void 0:r.slots)==null?void 0:t.find(f=>f.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let p=await mi.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)we[f]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let m=window.gameObjectManager;if(m)for(let f of h){let b=m.get(f);if(b){let v=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;v!=null&&v.texture&&(v.texture=p,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function fi(s,e,t,i){var n,a,r,o,l,c,d,p,u,g,h,m,f,b,v;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let w=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",w);let y=Date.now(),x=`/raw/library/${i}/${t}?t=${y}`;console.log("[LIBRARY] Loading texture from:",x);let M=await mi.load(x);if(!M){console.error("[LIBRARY] Failed to load texture:",x);return}console.log("[LIBRARY] \u2705 Texture loaded"),we[w]=M,console.log("[LIBRARY] \u2705 Updated AssetTextures."+w);let j=window.CustomAssets;j!=null&&j[w]&&(j[w].texture=M,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+w));let L=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!L),L){let O=Array.from(((n=L.keys)==null?void 0:n.call(L))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",O);let T=L.get(w);if(console.log("[LIBRARY] gameObject for "+w+"?",!!T),T){let A=((a=T.getDisplayObject)==null?void 0:a.call(T))||T.pixiObject||T.pixi||T,k=(r=A==null?void 0:A.constructor)==null?void 0:r.name;if(console.log("[LIBRARY] displayObject:",A),console.log("[LIBRARY] displayObject type:",k),console.log("[LIBRARY] has texture?",!!(A!=null&&A.texture)),A!=null&&A.texture)A.texture=M,console.log("[LIBRARY] \u2705 Applied to display object:",w);else if(k==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:C}=await import("pixi.js"),E=A.parent,S=(l=(o=E==null?void 0:E.getChildIndex)==null?void 0:o.call(E,A))!=null?l:0,I={x:A.x,y:A.y},P={x:(d=(c=A.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=A.anchor)==null?void 0:p.y)!=null?u:.5},R={x:(h=(g=A.scale)==null?void 0:g.x)!=null?h:1,y:(f=(m=A.scale)==null?void 0:m.y)!=null?f:1},D=(b=A.alpha)!=null?b:1,N=(v=A.visible)!=null?v:!0,H=new C(M);H.anchor.set(P.x,P.y),H.position.set(I.x,I.y),H.scale.set(R.x,R.y),H.alpha=D,H.visible=N,E&&(E.removeChild(A),E.addChildAt(H,S),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),T.pixiObject&&(T.pixiObject=H),T.pixi&&(T.pixi=H),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(A!=null&&A.children){let C=A.children.find(E=>E.texture);C?(C.texture=M,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let _=`raw/library/${i}/${t}`;Ve({objectId:w,path:"render.asset.path",value:_}),console.log("[LIBRARY] \u2705 Staged config override for:",w,"path:",_)}catch(w){console.error("[LIBRARY] Error applying slot asset:",w)}}async function yr(s,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,r=Date.now(),o=`/raw/${t}?t=${r}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await mi.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}we[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let d=window.gameObjectManager;if(d){let p=d.get(a);if(p){let u=((n=p.getDisplayObject)==null?void 0:n.call(p))||p.pixiObject||p;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Ve({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}var bi=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
1233
+ `.trim()}function cr(s){return s.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function dr(s,e){return!(s.includes("background")&&(s.includes("_1")||s.includes("splash")||s.includes("endgame")||s.includes("main"))||e==="text"||e==="effects"&&s.includes("particle"))}async function pr(s){var r,o;let e=cr(s.gameObjects),t={gamePrompt:s.gamePrompt,gameObjects:e,brandAssets:s.manifest.assets,brandDna:s.manifest.brand_dna,brandName:s.manifest.brand_name},i=or(t),n=[];if(s.flatDesignDataUrl)try{let l=ur(s.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await hi(s.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(r=l.message)!=null&&r.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return ks(a,s.gameObjects)}function ks(s,e){try{let t=s,i=s.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=s.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:s,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:s,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:s,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function gn(s,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let r=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,r.game_object);try{let o=await Ps(s,r);r.output_dataUrl=o,r.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${r.game_object}:`,o),r.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Ps(s,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&s.manifest){let o=s.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=s.assetFiles.get(o.file);if(l){let c=await De(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(s.flatDesignDataUrl){let o=ur(s.flatDesignDataUrl);o&&t.push(o)}let i=dr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:s.manifest.brand_dna,needsTransparency:i},a=lr(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let r=await st(s.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await rt(r)||r}function ur(s){let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function gr(s,e){let t=s.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],s.assets=i;for(let n of i){let a=e.get(n.file);if(a){let r=await De(a);r&&(n.dataUrl=r.dataUrl)}}}function hr(s){let e=new Map;if(!s)return e;if(s!=null&&s.layers&&Array.isArray(s.layers))for(let t of s.layers){let i=t.asset||t.id||t.name;i&&t.layout&&e.set(i,{position:t.layout.position||{x:0,y:0},scale:t.layout.scale||1,rotation:t.layout.rotation||0})}if(typeof s=="object"&&!Array.isArray(s)){for(let[t,i]of Object.entries(s))if(i&&typeof i=="object"&&"layout"in i){let n=i.layout;e.set(t,{position:(n==null?void 0:n.position)||{x:0,y:0},scale:(n==null?void 0:n.scale)||1,rotation:(n==null?void 0:n.rotation)||0})}}return e}function mr(s,e){if(!s||e.size===0)return null;if(e.has(s))return e.get(s);let t=s.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return e.get(t);for(let[i,n]of e.entries()){let a=i.toLowerCase(),r=t.toLowerCase();if(a===r||a.includes(r)||r.includes(a))return n}return null}function Ms(s){return s.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function fr(){var n,a,r,o,l,c,d;let s=window.getEditableObjectList,e=typeof s=="function"?s():[],t=window.getEditableObjectConfig;if(typeof t!="function")return[];let i=[];for(let p of e)try{let u=t(p);if(!u)continue;(((a=(n=u==null?void 0:u.render)==null?void 0:n.asset)==null?void 0:a.type)==="image"||(o=(r=u==null?void 0:u.render)==null?void 0:r.asset)!=null&&o.path||(l=u==null?void 0:u.render)!=null&&l.asset&&typeof u.render.asset=="string")&&i.push({id:p,name:Ms(p),type:((d=(c=u==null?void 0:u.render)==null?void 0:c.asset)==null?void 0:d.type)||"sprite"})}catch(u){console.warn(`[CanvaZip] Failed to check object ${p}:`,u)}return i.sort((p,u)=>p.name.localeCompare(u.name))}import{Assets as mi}from"pixi.js";async function br(s,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await mi.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)we[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function vr(s,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,r=typeof a=="function"?a():null,o=(t=r==null?void 0:r.slots)==null?void 0:t.find(f=>f.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let p=await mi.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)we[f]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let m=window.gameObjectManager;if(m)for(let f of h){let b=m.get(f);if(b){let v=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;v!=null&&v.texture&&(v.texture=p,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function fi(s,e,t,i){var n,a,r,o,l,c,d,p,u,g,h,m,f,b,v;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let w=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",w);let y=Date.now(),x=`/raw/library/${i}/${t}?t=${y}`;console.log("[LIBRARY] Loading texture from:",x);let M=await mi.load(x);if(!M){console.error("[LIBRARY] Failed to load texture:",x);return}console.log("[LIBRARY] \u2705 Texture loaded"),we[w]=M,console.log("[LIBRARY] \u2705 Updated AssetTextures."+w);let j=window.CustomAssets;j!=null&&j[w]&&(j[w].texture=M,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+w));let L=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!L),L){let _=Array.from(((n=L.keys)==null?void 0:n.call(L))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",_);let T=L.get(w);if(console.log("[LIBRARY] gameObject for "+w+"?",!!T),T){let A=((a=T.getDisplayObject)==null?void 0:a.call(T))||T.pixiObject||T.pixi||T,k=(r=A==null?void 0:A.constructor)==null?void 0:r.name;if(console.log("[LIBRARY] displayObject:",A),console.log("[LIBRARY] displayObject type:",k),console.log("[LIBRARY] has texture?",!!(A!=null&&A.texture)),A!=null&&A.texture)A.texture=M,console.log("[LIBRARY] \u2705 Applied to display object:",w);else if(k==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:C}=await import("pixi.js"),E=A.parent,S=(l=(o=E==null?void 0:E.getChildIndex)==null?void 0:o.call(E,A))!=null?l:0,I={x:A.x,y:A.y},P={x:(d=(c=A.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=A.anchor)==null?void 0:p.y)!=null?u:.5},z={x:(h=(g=A.scale)==null?void 0:g.x)!=null?h:1,y:(f=(m=A.scale)==null?void 0:m.y)!=null?f:1},D=(b=A.alpha)!=null?b:1,N=(v=A.visible)!=null?v:!0,H=new C(M);H.anchor.set(P.x,P.y),H.position.set(I.x,I.y),H.scale.set(z.x,z.y),H.alpha=D,H.visible=N,E&&(E.removeChild(A),E.addChildAt(H,S),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),T.pixiObject&&(T.pixiObject=H),T.pixi&&(T.pixi=H),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(A!=null&&A.children){let C=A.children.find(E=>E.texture);C?(C.texture=M,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let O=`raw/library/${i}/${t}`;Ve({objectId:w,path:"render.asset.path",value:O}),console.log("[LIBRARY] \u2705 Staged config override for:",w,"path:",O)}catch(w){console.error("[LIBRARY] Error applying slot asset:",w)}}async function yr(s,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,r=Date.now(),o=`/raw/${t}?t=${r}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await mi.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}we[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let d=window.gameObjectManager;if(d){let p=d.get(a);if(p){let u=((n=p.getDisplayObject)==null?void 0:n.call(p))||p.pixiObject||p;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Ve({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}var bi=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
1234
1234
  <div class="canva-wizard-overlay" data-canva-wizard>
1235
1235
  <div class="canva-wizard-modal">
1236
1236
  <div class="canva-wizard-header">
@@ -1368,7 +1368,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1368
1368
  <div class="inspector-row">
1369
1369
  <button class="inspector-btn inspector-btn-sm" type="button" data-vision-upload-assets>\u{1F4F7} Upload PNGs</button>
1370
1370
  <input class="hidden" type="file" accept="image/*" multiple data-vision-assets-input>
1371
- <span class="inspector-text-sm" data-vision-assets-status>None</span>
1371
+ <span class="inspector-text-sm" data-vision-assets-status>Upload JSONs first, then PNGs</span>
1372
1372
  </div>
1373
1373
  </div>
1374
1374
 
@@ -1430,14 +1430,15 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1430
1430
  </div>
1431
1431
  <div class="panel-resize-handle" data-panel-resize></div>
1432
1432
  </div>
1433
- `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,r,o,l,c,d,p,u,g;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let m=h.dataset.visionTab;this.switchTab(m)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let m=h.target.value;this.switchUploadMethod(m)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||m.click()}),(r=this.root.querySelector("[data-vision-zip-input]"))==null||r.addEventListener("change",h=>{this.handleZipUpload(h)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||m.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-generate-all]"))==null||u.addEventListener("click",()=>{this.generateAllMissing()}),(g=this.root.querySelector("[data-vision-apply-all]"))==null||g.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let m=h.target;if(!m)return;let f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;b&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(b),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(b),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(b),m.closest("[data-mapping-generate-one]")&&this.generateOne(b),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let m=h.target;if(!m||!this.mappingResult)return;let f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;if(!b)return;let v=this.mappingResult.mappings.find(w=>w.game_object===b);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let m=h.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;if(!b)return;let v=this.mappingResult.mappings.find(w=>w.game_object===b);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var c;let t=await import("jszip"),i=t.default||t;if(!i||typeof i.loadAsync!="function")throw new Error("JSZip failed to load. loadAsync is not a function.");let n=await i.loadAsync(e),a=[],r=[];n.forEach((d,p)=>{let u=d.toLowerCase();u.endsWith(".json")?a.push({name:d,content:null}):u.startsWith("assets/")&&u.endsWith(".png")&&r.push({name:d,file:p})});for(let d of a)try{let p=await((c=n.file(d.name))==null?void 0:c.async("text"));p&&(d.content=JSON.parse(p))}catch(p){console.warn(`Failed to parse ${d.name}:`,p)}let o=[];for(let d of r)try{let p=await d.file.async("uint8array"),u=new Blob([p],{type:"image/png"}),g=d.name.split("/").pop()||d.name;console.log(`Processing ${g}, uint8array length: ${p.length}, blob size: ${u.size}`);let h;try{h=await this.blobToDataUrl(u)}catch(m){console.warn(`FileReader failed for ${g}, using fallback:`,m),h=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(p)))}`}if(!h.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${g}:`,h.substring(0,100));continue}o.push({filename:g,dataUrl:h})}catch(p){console.warn(`Failed to extract ${d.name}:`,p)}let l=null;for(let d of a){let p=d.name.toLowerCase();if(p.includes("positionnormalizedpack")||p.includes("positionnormalized")){l=d.content;break}}if(o.length>0){await this.showCanvaZipWizard(o,l),this.setStatus("zip",`\u2705 Wizard completed - ${o.length} assets processed`);return}else{this.setStatus("zip","\u26A0\uFE0F No PNG files found in ZIP");return}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async showCanvaZipWizard(e,t){return new Promise(i=>{let n=e.filter(o=>!this.wizardProcessedAssets.has(o.filename));if(n.length===0){console.log("[BrandVision] All assets already processed by wizard"),i();return}let a=document.createElement("div");document.body.appendChild(a),new bi().initialize(a,n,t,{onComplete:o=>{console.log("[BrandVision] Wizard completed, processed assets:",o),o.forEach(l=>{this.wizardProcessedAssets.add(l.filename)}),a.remove(),i()},onCancel:()=>{console.log("[BrandVision] Wizard cancelled"),a.remove(),i()}})})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let r=a.category||"misc";n[r]||(n[r]=[]),i.libraryAssets[r]||(i.libraryAssets[r]=[]),i.libraryAssets[r].some(l=>l.filename===a.filename)||(i.libraryAssets[r].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${r}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var a;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let r of Array.from(i))try{let o=await r.text(),l=JSON.parse(o);this.uploadedJsons.set(r.name,l),l.layers?n+=`\u2705 Layers: ${r.name}
1434
- `:l.brand_dna||l.colors?n+=`\u2705 Brand: ${r.name}
1435
- `:n+=`\u2705 Loaded: ${r.name}
1436
- `}catch{n+=`\u274C Error in ${r.name}
1437
- `}try{this.normalizedManifest=sr(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let r=Array.isArray((a=this.normalizedManifest)==null?void 0:a.assets)?this.normalizedManifest.assets.length:0;n+=`
1438
- \u{1F4E6} Normalized manifest: ${r} assets`,n+=`
1439
- \u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:r,brandName:this.normalizedManifest.brand_name})}catch(r){console.error("[BrandVision] Failed to normalize manifest:",r),this.normalizedManifest=null,n+=`
1440
- \u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",n.trim())}async handleAssetsUpload(e){let i=e.target.files;if(!i||i.length===0)return;let n=[];for(let a of Array.from(i)){if(!a.type.startsWith("image/")){this.assetFiles.set(a.name,a);continue}try{let r=await this.fileToDataUrl(a);n.push({filename:a.name,dataUrl:r})}catch(r){console.warn(`Failed to process ${a.name}:`,r),this.assetFiles.set(a.name,a)}}if(n.length>0){let a=null;for(let[r,o]of this.uploadedJsons.entries()){let l=r.toLowerCase();if(l.includes("positionnormalizedpack")||l.includes("positionnormalized")){a=o;break}}await this.showCanvaZipWizard(n,a),this.setStatus("assets",`\u2705 Wizard completed - ${n.length} assets processed`)}else this.setStatus("assets",`${this.assetFiles.size} files loaded`)}async handleFlatDesignUpload(e){var a,r;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await De(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let o=(r=this.root)==null?void 0:r.querySelector("[data-vision-flat-preview]");o&&(o.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,a,r,o,l,c;if(this.isAnalyzing)return;let e=(a=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await gr(t,this.assetFiles);let d={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},p=await pr(d);this.mappingResult=p.mappingResult,this.analysisRawResponse=p.rawResponse,this.analysisParsedOk=p.parsed,this.analysisParseError=(r=p.parseError)!=null?r:null,this.renderMappings(),p.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(o=this.mappingResult)==null?void 0:o.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${p.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(d){console.error("[BrandVision] Analysis failed:",d),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await gn(a,this.mappingResult,{onProgress:(r,o,l)=>{this.setStatus("apply",`Generating ${r}/${o}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(a){console.error("[BrandVision] Generation failed:",a),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var o;let e=(o=this.root)==null?void 0:o.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,a=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),r=n?`
1433
+ `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,r,o,l,c,d,p,u,g;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let m=h.dataset.visionTab;this.switchTab(m)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let m=h.target.value;this.switchUploadMethod(m)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||m.click()}),(r=this.root.querySelector("[data-vision-zip-input]"))==null||r.addEventListener("change",h=>{this.handleZipUpload(h)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||m.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-generate-all]"))==null||u.addEventListener("click",()=>{this.generateAllMissing()}),(g=this.root.querySelector("[data-vision-apply-all]"))==null||g.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let m=h.target;if(!m)return;let f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;b&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(b),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(b),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(b),m.closest("[data-mapping-generate-one]")&&this.generateOne(b),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let m=h.target;if(!m||!this.mappingResult)return;let f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;if(!b)return;let v=this.mappingResult.mappings.find(w=>w.game_object===b);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let m=h.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;if(!b)return;let v=this.mappingResult.mappings.find(w=>w.game_object===b);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var l;let t;try{let c=await import("jszip");if(t=c.default,console.log("[BrandVision] JSZip import:",{hasDefault:!!c.default,defaultType:typeof c.default,hasLoadAsync:t&&typeof t.loadAsync=="function",moduleKeys:Object.keys(c).slice(0,10)}),(!t||typeof t.loadAsync!="function")&&(console.warn("[BrandVision] JSZip.default failed, trying module directly"),t=c),!t)throw new Error("JSZip module is null or undefined");if(typeof t.loadAsync!="function")throw console.error("[BrandVision] JSZip structure:",{JSZipType:typeof t,JSZipKeys:Object.keys(t).slice(0,20),isConstructor:typeof t=="function",hasLoadAsync:"loadAsync"in t}),new Error(`JSZip.loadAsync is not a function. JSZip type: ${typeof t}`)}catch(c){throw console.error("[BrandVision] JSZip import error:",c),new Error(`Failed to load JSZip: ${c instanceof Error?c.message:String(c)}`)}let i=await t.loadAsync(e),n=[],a=[];i.forEach((c,d)=>{let p=c.toLowerCase();p.endsWith(".json")?n.push({name:c,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&a.push({name:c,file:d})});for(let c of n)try{let d=await((l=i.file(c.name))==null?void 0:l.async("text"));d&&(c.content=JSON.parse(d))}catch(d){console.warn(`Failed to parse ${c.name}:`,d)}let r=[];for(let c of a)try{let d=await c.file.async("uint8array"),p=new Blob([d],{type:"image/png"}),u=c.name.split("/").pop()||c.name;console.log(`Processing ${u}, uint8array length: ${d.length}, blob size: ${p.size}`);let g;try{g=await this.blobToDataUrl(p)}catch(h){console.warn(`FileReader failed for ${u}, using fallback:`,h),g=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(d)))}`}if(!g.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${u}:`,g.substring(0,100));continue}r.push({filename:u,dataUrl:g})}catch(d){console.warn(`Failed to extract ${c.name}:`,d)}let o=null;for(let c of n){let d=c.name.toLowerCase();if(d.includes("positionnormalizedpack")||d.includes("positionnormalized")){o=c.content;break}}if(r.length>0){await this.showCanvaZipWizard(r,o),this.setStatus("zip",`\u2705 Wizard completed - ${r.length} assets processed`);return}else{this.setStatus("zip","\u26A0\uFE0F No PNG files found in ZIP");return}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async showCanvaZipWizard(e,t){return new Promise(i=>{let n=e.filter(o=>!this.wizardProcessedAssets.has(o.filename));if(n.length===0){console.log("[BrandVision] All assets already processed by wizard"),i();return}let a=document.createElement("div");document.body.appendChild(a),new bi().initialize(a,n,t,{onComplete:o=>{console.log("[BrandVision] Wizard completed, processed assets:",o),o.forEach(l=>{this.wizardProcessedAssets.add(l.filename)}),a.remove(),i()},onCancel:()=>{console.log("[BrandVision] Wizard cancelled"),a.remove(),i()}})})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let r=a.category||"misc";n[r]||(n[r]=[]),i.libraryAssets[r]||(i.libraryAssets[r]=[]),i.libraryAssets[r].some(l=>l.filename===a.filename)||(i.libraryAssets[r].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${r}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var r;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let o of Array.from(i))try{let l=await o.text(),c=JSON.parse(l);this.uploadedJsons.set(o.name,c),c.layers?n+=`\u2705 Layers: ${o.name}
1434
+ `:c.brand_dna||c.colors?n+=`\u2705 Brand: ${o.name}
1435
+ `:n+=`\u2705 Loaded: ${o.name}
1436
+ `}catch{n+=`\u274C Error in ${o.name}
1437
+ `}try{this.normalizedManifest=sr(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let o=Array.isArray((r=this.normalizedManifest)==null?void 0:r.assets)?this.normalizedManifest.assets.length:0;n+=`
1438
+ \u{1F4E6} Normalized manifest: ${o} assets`,n+=`
1439
+ \u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:o,brandName:this.normalizedManifest.brand_name})}catch(o){console.error("[BrandVision] Failed to normalize manifest:",o),this.normalizedManifest=null,n+=`
1440
+ \u274C Failed to normalize manifest`}t.value="";let a=n.trim();this.uploadedJsons.size>0?this.setStatus("manifest",`${a}
1441
+ \u2705 JSONs ready - now upload PNGs to open wizard`):this.setStatus("manifest",a)}async handleAssetsUpload(e){console.log("[BrandVision] handleAssetsUpload called",e);let t=e.target,i=t.files;if(console.log("[BrandVision] Files object:",i),!i||i.length===0){console.log("[BrandVision] No files selected");return}console.log(`[BrandVision] handleAssetsUpload: ${i.length} files selected`);for(let o=0;o<i.length;o++)console.log(`[BrandVision] File ${o}: ${i[o].name}, type: ${i[o].type}, size: ${i[o].size}`);let n=[];for(let o of Array.from(i)){if(console.log(`[BrandVision] Processing file: ${o.name}, type: ${o.type}`),!o.type.startsWith("image/")){console.log(`[BrandVision] Skipping non-image file: ${o.name}`),this.assetFiles.set(o.name,o);continue}try{let l=await this.fileToDataUrl(o);n.push({filename:o.name,dataUrl:l}),console.log(`[BrandVision] \u2705 Converted ${o.name} to data URL (length: ${l.length})`)}catch(l){console.error(`[BrandVision] Failed to process ${o.name}:`,l),this.assetFiles.set(o.name,o)}}console.log(`[BrandVision] Extracted ${n.length} image assets`);let a=this.uploadedJsons.size>0,r=n.length>0;if(console.log(`[BrandVision] Individual upload check: JSONs=${a}, Images=${r}`),a&&r){console.log("[BrandVision] Both JSONs and images present - showing wizard"),this.setStatus("assets",`Processing ${n.length} images...`);let o=null;for(let[l,c]of this.uploadedJsons.entries()){let d=l.toLowerCase();if(d.includes("positionnormalizedpack")||d.includes("positionnormalized")){o=c,console.log("[BrandVision] Found position data in:",l);break}}console.log("[BrandVision] Opening wizard with assets:",n.map(l=>l.filename)),await this.showCanvaZipWizard(n,o),console.log("[BrandVision] Wizard completed successfully"),this.setStatus("assets",`\u2705 Wizard completed - ${n.length} assets processed`)}else console.log("[BrandVision] Waiting for both JSONs and images. Current state:",{jsons:this.uploadedJsons.size,images:n.length}),a?this.setStatus("assets",`Uploaded ${n.length} images. JSONs ready - wizard should open now.`):this.setStatus("assets","\u26A0\uFE0F Upload JSONs first, then PNGs to open wizard");t.value=""}async handleFlatDesignUpload(e){var a,r;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await De(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let o=(r=this.root)==null?void 0:r.querySelector("[data-vision-flat-preview]");o&&(o.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,a,r,o,l,c;if(this.isAnalyzing)return;let e=(a=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await gr(t,this.assetFiles);let d={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},p=await pr(d);this.mappingResult=p.mappingResult,this.analysisRawResponse=p.rawResponse,this.analysisParsedOk=p.parsed,this.analysisParseError=(r=p.parseError)!=null?r:null,this.renderMappings(),p.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(o=this.mappingResult)==null?void 0:o.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${p.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(d){console.error("[BrandVision] Analysis failed:",d),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await gn(a,this.mappingResult,{onProgress:(r,o,l)=>{this.setStatus("apply",`Generating ${r}/${o}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(a){console.error("[BrandVision] Generation failed:",a),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var o;let e=(o=this.root)==null?void 0:o.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,a=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),r=n?`
1441
1442
  <div class="vision-raw-block">
1442
1443
  <div class="inspector-text-sm" style="white-space: pre-wrap;">
1443
1444
  \u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
@@ -1500,7 +1501,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1500
1501
  </div>
1501
1502
  `}).join("")}
1502
1503
  `}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let r=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;r&&(await this.stageEngineAssetOverride(n,r),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(r=>r.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(r=>r.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,r;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(r=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:r.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let o={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await gn(o,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(o){console.error("[BrandVision] generateOne failed:",o),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-V7DLPL5I.js");i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let r=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(r!=null&&r.success)||!(r!=null&&r.path))return console.error("[BrandVision] Save to library failed:",(r==null?void 0:r.error)||r),null;let o=window.addAssetToRegistry;typeof o=="function"&&o(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(r.path)}catch(a){return console.error("[BrandVision] Save to library error:",a),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let r=n.slots.find(o=>o.slotId===e||o.currentAsset===e);if(r!=null&&r.category)return String(r.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let r=e.toLowerCase(),o=l=>a.find(c=>c.toLowerCase().includes(l));return r.includes("bg")||r.includes("background")?o("background")||a[0]:(r.includes("cta")||r.includes("button")||r.includes("ui")||r.includes("logo"))&&o("ui")||a[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var a;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(a=this.root)==null?void 0:a.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,a=o=>{let l=Math.max(300,n+(o.clientX-i));this.root.style.width=`${l}px`},r=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",r)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",r)})}refresh(){}};function wr(s,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${s}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
1503
- `)}var Is=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],js=["cta_hint","cta_label_end"],xr=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],_s=["brand.primary","brand.heading","brand.body","brand.warning"],yi=class{constructor(){this.root=null;this.assetsContainer=null;this.colorsContainer=null;this.fontsContainer=null;this.textsContainer=null;this.audioContainer=null;this.options=null;this.previewModal=null;this.autoApplyTimer=null;this.activePreviewKey=null;this.activePreviewValue=null;this.activePreviewFileInput=null;this.retryTimer=null;this.aiModal=null;this.aiTargetKey=null;this.aiKeyInput=null;this.aiPromptInput=null;this.aiStrengthInput=null;this.aiStrengthValue=null;this.aiModelSelect=null;this.aiModalSubtitle=null;this.aiGalleryToggle=null;this.aiGalleryEl=null;this.aiGalleryGrid=null;this.aiReferenceInput=null;this.aiReferenceName=null;this.aiReferenceFile=null;this.aiRemoveBgToggle=null;this.aiUseOutputToggle=null;this.aiGenerateBtn=null;this.aiApplyBtn=null;this.aiSaveLibraryBtn=null;this.aiCropBtn=null;this.aiDownloadBtn=null;this.aiPreviewImg=null;this.aiStatusEl=null;this.aiOutputDataUrl=null;this.aiBaseDataUrl=null;this.aiBaseValue=null;this.aiOutputKey=null;this.aiContext=null;this.aiBgToleranceInput=null;this.aiBgToleranceValue=null;this.aiRawOutputDataUrl=null;this.aiLoadingEl=null}render(){return`
1504
+ `)}var Is=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],js=["cta_hint","cta_label_end"],xr=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],Os=["brand.primary","brand.heading","brand.body","brand.warning"],yi=class{constructor(){this.root=null;this.assetsContainer=null;this.colorsContainer=null;this.fontsContainer=null;this.textsContainer=null;this.audioContainer=null;this.options=null;this.previewModal=null;this.autoApplyTimer=null;this.activePreviewKey=null;this.activePreviewValue=null;this.activePreviewFileInput=null;this.retryTimer=null;this.aiModal=null;this.aiTargetKey=null;this.aiKeyInput=null;this.aiPromptInput=null;this.aiStrengthInput=null;this.aiStrengthValue=null;this.aiModelSelect=null;this.aiModalSubtitle=null;this.aiGalleryToggle=null;this.aiGalleryEl=null;this.aiGalleryGrid=null;this.aiReferenceInput=null;this.aiReferenceName=null;this.aiReferenceFile=null;this.aiRemoveBgToggle=null;this.aiUseOutputToggle=null;this.aiGenerateBtn=null;this.aiApplyBtn=null;this.aiSaveLibraryBtn=null;this.aiCropBtn=null;this.aiDownloadBtn=null;this.aiPreviewImg=null;this.aiStatusEl=null;this.aiOutputDataUrl=null;this.aiBaseDataUrl=null;this.aiBaseValue=null;this.aiOutputKey=null;this.aiContext=null;this.aiBgToleranceInput=null;this.aiBgToleranceValue=null;this.aiRawOutputDataUrl=null;this.aiLoadingEl=null}render(){return`
1504
1505
  <div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
1505
1506
  <div class="scene-panel-header" data-panel-handle>
1506
1507
  <div class="panel-title">
@@ -1568,7 +1569,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1568
1569
  <path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
1569
1570
  <path d="M5 14v4h14v-4h2v6H3v-6h2z" />
1570
1571
  </svg>
1571
- `;let p=document.createElement("input");p.type="file",p.accept="image/*,audio/*,application/json",p.className="customize-file",p.addEventListener("change",()=>{var h;let g=(h=p.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>p.click()),l.appendChild(c),l.appendChild(d),l.appendChild(p),a.appendChild(r),a.appendChild(o),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Is.forEach(t=>{var l,c,d;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let r=document.createElement("input");r.type="color",r.value=i,r.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=i,o.className="customize-color-text",o.dataset.colorTextKey=t,r.addEventListener("input",()=>{o.value=r.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(r.value=o.value)}),n.appendChild(a),n.appendChild(r),n.appendChild(o),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",_s.forEach(t=>{var r,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(r=e==null?void 0:e[t])!=null?r:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",js.forEach(t=>{var r,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(r=this.readUiValue(e,t))!=null?r:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(o=this.textsContainer)==null||o.appendChild(i)}),xr.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.getObjectTextValue(i))!=null?o:"",r.className="customize-input",r.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(r),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let r=document.createElement("input");r.type=i.includes("volume")?"number":"text",r.min="0",r.max="1",r.step="0.1",r.value=String((o=e==null?void 0:e[i])!=null?o:""),r.className="customize-input",r.dataset.audioKey=i,i.includes("file")&&(r.placeholder="audio file path"),n.appendChild(a),n.appendChild(r),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let r of n){if(a==null)return null;a=a[r]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),r=n;for(let o of a){if(r==null)return null;r=r[o]}return typeof r=="string"?r:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(o=>{let l=o;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(o=>{let l=o,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(o=>{let l=o,c=l.dataset.fontKey;c&&(n[c]=l.value)});let a={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(a[c]=l.value)});let r={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let d=parseFloat(l.value);r[c]=isNaN(d)?0:d}else r[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let d=xr.find(p=>p.key===c);d&&this.applyObjectPropertyValue(d.objectId,d.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:r}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await gi(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,r;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(a=(n=o==null?void 0:o.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(r=i==null?void 0:i.dataUrl)!=null?r:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let r=this.resolveAssetUrls(i);r[0]&&(a.src=r[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(a),n.appendChild(o),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var r,o;let i=t,n=i.dataset.assetKey,a=(o=(r=i.value)==null?void 0:r.trim())!=null?o:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var o,l,c,d,p,u,g,h,m,f;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
1572
+ `;let p=document.createElement("input");p.type="file",p.accept="image/*,audio/*,application/json",p.className="customize-file",p.addEventListener("change",()=>{var h;let g=(h=p.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>p.click()),l.appendChild(c),l.appendChild(d),l.appendChild(p),a.appendChild(r),a.appendChild(o),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Is.forEach(t=>{var l,c,d;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let r=document.createElement("input");r.type="color",r.value=i,r.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=i,o.className="customize-color-text",o.dataset.colorTextKey=t,r.addEventListener("input",()=>{o.value=r.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(r.value=o.value)}),n.appendChild(a),n.appendChild(r),n.appendChild(o),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Os.forEach(t=>{var r,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(r=e==null?void 0:e[t])!=null?r:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",js.forEach(t=>{var r,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(r=this.readUiValue(e,t))!=null?r:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(o=this.textsContainer)==null||o.appendChild(i)}),xr.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.getObjectTextValue(i))!=null?o:"",r.className="customize-input",r.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(r),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let r=document.createElement("input");r.type=i.includes("volume")?"number":"text",r.min="0",r.max="1",r.step="0.1",r.value=String((o=e==null?void 0:e[i])!=null?o:""),r.className="customize-input",r.dataset.audioKey=i,i.includes("file")&&(r.placeholder="audio file path"),n.appendChild(a),n.appendChild(r),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let r of n){if(a==null)return null;a=a[r]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),r=n;for(let o of a){if(r==null)return null;r=r[o]}return typeof r=="string"?r:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(o=>{let l=o;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(o=>{let l=o,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(o=>{let l=o,c=l.dataset.fontKey;c&&(n[c]=l.value)});let a={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(a[c]=l.value)});let r={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let d=parseFloat(l.value);r[c]=isNaN(d)?0:d}else r[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let d=xr.find(p=>p.key===c);d&&this.applyObjectPropertyValue(d.objectId,d.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:r}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await gi(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,r;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(a=(n=o==null?void 0:o.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(r=i==null?void 0:i.dataUrl)!=null?r:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let r=this.resolveAssetUrls(i);r[0]&&(a.src=r[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(a),n.appendChild(o),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var r,o;let i=t,n=i.dataset.assetKey,a=(o=(r=i.value)==null?void 0:r.trim())!=null?o:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var o,l,c,d,p,u,g,h,m,f;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
1572
1573
  <div class="ai-modal-card">
1573
1574
  <div class="ai-modal-header">
1574
1575
  <div>
@@ -1639,7 +1640,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1639
1640
  </div>
1640
1641
  </div>
1641
1642
  </div>
1642
- `;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let r=n.querySelector("[data-ai-ref-button]");r==null||r.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var v,w;let b=(w=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?w:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var v,w;let b=(w=(v=this.aiBgToleranceInput)==null?void 0:v.value)!=null?w:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var v,w,y;let b=(y=(w=(v=this.aiReferenceInput)==null?void 0:v.files)==null?void 0:w[0])!=null?y:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(m=this.aiCropBtn)==null||m.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,h,m,f,b,v,w,y,x,M,j,L,_,O,T,A,k;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(b=(f=(m=this.aiPromptInput)==null?void 0:m.value)==null?void 0:f.trim())!=null?b:"",n=(w=(v=this.aiRemoveBgToggle)==null?void 0:v.checked)!=null?w:!1,a=n,r=n,o=Number((x=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?x:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((M=l==null?void 0:l.value)==null?void 0:M.trim())||((j=this.aiBaseValue)==null?void 0:j.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let C=null,E=(L=this.getSelectedAssetKey())!=null?L:"unknown",S=(_=this.aiUseOutputToggle)!=null&&_.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl){let F=pn(this.aiOutputDataUrl,"ai-output.png");if(F){let G=await De(F);G&&(C={input:{base64:G.base64,mimeType:G.mimeType},dataUrl:G.dataUrl,width:G.width,height:G.height})}}if(C||(C=await this.getImageDataFromAsset(c)),!C){this.setAiStatus("Unable to load the base image.");return}let I=[C.input],P=!1;if(this.aiReferenceFile){let F=await De(this.aiReferenceFile);F?(I.push({base64:F.base64,mimeType:F.mimeType}),P=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let R=wr(i,{includeReference:P,includeMagenta:a,changeLevel:o}),D=(A=(T=this.aiReferenceFile)==null?void 0:T.name)!=null?A:"none";console.info("[AI] Final prompt:",R),console.info("[AI] Image sources:",{assetKey:E,base:S,reference:D});let N=ar(C.width,C.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await rt(e,R,I,{aspectRatio:N,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,await this.refreshAiOutputFromRaw()}catch(C){console.error("[CustomizePanel] AI Generate Error:",C),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((k=this.aiStatusEl)==null?void 0:k.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,r,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(r=this.aiBgToleranceInput)==null?void 0:r.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await at(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),r=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&r)console.log("[CustomizePanel] Applying AI output directly to object:",a,r),this.applyObjectPropertyValue(a,r,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,r,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),h=((r=this.aiContext)==null?void 0:r.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((o=m.dataset.assetKey)!=null?o:"",m)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&v){let w=this.getFilenameFromPath(c.path);await b(g,w,n)}else this.applyObjectPropertyValue(g,h,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{f(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var r;let t=(r=this.aiContext)==null?void 0:r.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=pn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let r=await dn(a);r&&this.setAiOutput(r)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let d=await this.getImageDimensions(n);if(d){let p=await this.showManualCropModal(e,d,n);if(!p)return;a=p}}let r=await dn(a);if(!r){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",p.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=p.path,this.handleAssetValueChange(i,t);let h=this.inferObjectIdFromAssetKey(i),m=this.inferPathFromAssetKey(i);if(h&&m){let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(m)||/\\.(png|jpg|jpeg)$/i.test(String(p.path||""));if(typeof b=="function"&&v){let w=this.getFilenameFromPath(p.path);await b(h,w,c)}else this.applyObjectPropertyValue(h,m,p.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&h&&setTimeout(()=>{f(h,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",p.error),alert(`Failed to save uploaded file: ${p.error}`)}catch(d){console.error("[CustomizePanel] \u274C Upload error:",d),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let r=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,r)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1643
+ `;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let r=n.querySelector("[data-ai-ref-button]");r==null||r.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var v,w;let b=(w=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?w:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var v,w;let b=(w=(v=this.aiBgToleranceInput)==null?void 0:v.value)!=null?w:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var v,w,y;let b=(y=(w=(v=this.aiReferenceInput)==null?void 0:v.files)==null?void 0:w[0])!=null?y:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(m=this.aiCropBtn)==null||m.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,h,m,f,b,v,w,y,x,M,j,L,O,_,T,A,k;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(b=(f=(m=this.aiPromptInput)==null?void 0:m.value)==null?void 0:f.trim())!=null?b:"",n=(w=(v=this.aiRemoveBgToggle)==null?void 0:v.checked)!=null?w:!1,a=n,r=n,o=Number((x=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?x:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((M=l==null?void 0:l.value)==null?void 0:M.trim())||((j=this.aiBaseValue)==null?void 0:j.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let C=null,E=(L=this.getSelectedAssetKey())!=null?L:"unknown",S=(O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((_=this.aiUseOutputToggle)!=null&&_.checked&&this.aiOutputDataUrl){let B=pn(this.aiOutputDataUrl,"ai-output.png");if(B){let G=await De(B);G&&(C={input:{base64:G.base64,mimeType:G.mimeType},dataUrl:G.dataUrl,width:G.width,height:G.height})}}if(C||(C=await this.getImageDataFromAsset(c)),!C){this.setAiStatus("Unable to load the base image.");return}let I=[C.input],P=!1;if(this.aiReferenceFile){let B=await De(this.aiReferenceFile);B?(I.push({base64:B.base64,mimeType:B.mimeType}),P=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let z=wr(i,{includeReference:P,includeMagenta:a,changeLevel:o}),D=(A=(T=this.aiReferenceFile)==null?void 0:T.name)!=null?A:"none";console.info("[AI] Final prompt:",z),console.info("[AI] Image sources:",{assetKey:E,base:S,reference:D});let N=ar(C.width,C.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await st(e,z,I,{aspectRatio:N,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,await this.refreshAiOutputFromRaw()}catch(C){console.error("[CustomizePanel] AI Generate Error:",C),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((k=this.aiStatusEl)==null?void 0:k.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,r,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(r=this.aiBgToleranceInput)==null?void 0:r.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await rt(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),r=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&r)console.log("[CustomizePanel] Applying AI output directly to object:",a,r),this.applyObjectPropertyValue(a,r,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,r,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),h=((r=this.aiContext)==null?void 0:r.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((o=m.dataset.assetKey)!=null?o:"",m)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&v){let w=this.getFilenameFromPath(c.path);await b(g,w,n)}else this.applyObjectPropertyValue(g,h,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{f(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var r;let t=(r=this.aiContext)==null?void 0:r.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=pn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let r=await dn(a);r&&this.setAiOutput(r)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let d=await this.getImageDimensions(n);if(d){let p=await this.showManualCropModal(e,d,n);if(!p)return;a=p}}let r=await dn(a);if(!r){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",p.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=p.path,this.handleAssetValueChange(i,t);let h=this.inferObjectIdFromAssetKey(i),m=this.inferPathFromAssetKey(i);if(h&&m){let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(m)||/\\.(png|jpg|jpeg)$/i.test(String(p.path||""));if(typeof b=="function"&&v){let w=this.getFilenameFromPath(p.path);await b(h,w,c)}else this.applyObjectPropertyValue(h,m,p.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&h&&setTimeout(()=>{f(h,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",p.error),alert(`Failed to save uploaded file: ${p.error}`)}catch(d){console.error("[CustomizePanel] \u274C Upload error:",d),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let r=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,r)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1643
1644
  <div class="asset-preview-card">
1644
1645
  <div class="asset-preview-header">
1645
1646
  <div class="asset-preview-title">${e}</div>
@@ -1685,7 +1686,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1685
1686
  <button class="asset-crop-apply" type="button">Apply Crop</button>
1686
1687
  </div>
1687
1688
  </div>
1688
- `;let v=c.querySelector(".asset-crop-canvas"),w=c.querySelector(".asset-crop-preview"),y=c.querySelector(".asset-crop-zoom"),x=c.querySelector(".asset-crop-zoom-value"),M=c.querySelector(".asset-crop-close"),j=c.querySelector(".asset-crop-cancel"),L=c.querySelector(".asset-crop-apply"),_=c.querySelector(".asset-crop-reset");if(!v||!w||!y||!x){l(null);return}let O=v.getContext("2d"),T=w.getContext("2d");if(!O||!T){l(null);return}let A=r.naturalWidth,k=r.naturalHeight,C=Math.max(v.width/A,v.height/k),E=1,S=0,I=0,P=!1,R=0,D=0,N=0,H=0,F=()=>{let $=C*E,Z=Math.max(0,(A*$-v.width)/2),ce=Math.max(0,(k*$-v.height)/2);S=Math.min(Z,Math.max(-Z,S)),I=Math.min(ce,Math.max(-ce,I))},G=()=>{let $=C*E;O.clearRect(0,0,v.width,v.height);let Z=v.width/2-A*$/2+S,ce=v.height/2-k*$/2+I;if(O.drawImage(r,Z,ce,A*$,k*$),T.clearRect(0,0,w.width,w.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let q=Math.max(w.width/o.naturalWidth,w.height/o.naturalHeight),ee=w.width/2-o.naturalWidth*q/2,K=w.height/2-o.naturalHeight*q/2;T.drawImage(o,ee,K,o.naturalWidth*q,o.naturalHeight*q)}else T.fillStyle="rgba(255, 255, 255, 0.04)",T.fillRect(0,0,w.width,w.height),T.strokeStyle="rgba(255, 255, 255, 0.08)",T.strokeRect(4,4,w.width-8,w.height-8);let he=w.width/v.width*(C*E),de=S*(w.width/v.width),ve=I*(w.height/v.height),Ce=w.width/2-A*he/2+de,Te=w.height/2-k*he/2+ve;T.save(),T.globalAlpha=.7,T.drawImage(r,Ce,Te,A*he,k*he),T.restore()},Y=()=>{S=0,I=0,F(),G()};y.addEventListener("input",()=>{E=Number(y.value),x.textContent=`${E.toFixed(2)}\xD7`,F(),G()}),v.addEventListener("pointerdown",$=>{P=!0,R=$.clientX,D=$.clientY,N=S,H=I,v.setPointerCapture($.pointerId)}),v.addEventListener("pointermove",$=>{P&&(S=N+($.clientX-R),I=H+($.clientY-D),F(),G())}),v.addEventListener("pointerup",$=>{P=!1,v.releasePointerCapture($.pointerId)}),v.addEventListener("pointerleave",()=>{P=!1});let Q=()=>{c.remove()},ie=()=>{Q(),l(null)},le=async()=>{let $=document.createElement("canvas");$.width=t.width,$.height=t.height;let Z=$.getContext("2d");if(!Z){Q(),l(null);return}let ce=E,de=Math.max($.width/A,$.height/k)*ce,ve=$.width/v.width,Ce=S*ve,Te=I*ve,q=$.width/2-A*de/2+Ce,ee=$.height/2-k*de/2+Te;Z.drawImage(r,q,ee,A*de,k*de);let K=await new Promise(ae=>{$.toBlob(_e=>ae(_e),e.type||"image/png")});if(Q(),!K){l(null);return}l(new File([K],e.name,{type:K.type}))};M==null||M.addEventListener("click",ie),j==null||j.addEventListener("click",ie),_==null||_.addEventListener("click",Y),L==null||L.addEventListener("click",()=>{le()}),c.addEventListener("click",$=>{$.target===c&&ie()}),document.body.appendChild(c),Y()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var wi=class{constructor(){this.root=null;this.options=null}render(){return`
1689
+ `;let v=c.querySelector(".asset-crop-canvas"),w=c.querySelector(".asset-crop-preview"),y=c.querySelector(".asset-crop-zoom"),x=c.querySelector(".asset-crop-zoom-value"),M=c.querySelector(".asset-crop-close"),j=c.querySelector(".asset-crop-cancel"),L=c.querySelector(".asset-crop-apply"),O=c.querySelector(".asset-crop-reset");if(!v||!w||!y||!x){l(null);return}let _=v.getContext("2d"),T=w.getContext("2d");if(!_||!T){l(null);return}let A=r.naturalWidth,k=r.naturalHeight,C=Math.max(v.width/A,v.height/k),E=1,S=0,I=0,P=!1,z=0,D=0,N=0,H=0,B=()=>{let $=C*E,Z=Math.max(0,(A*$-v.width)/2),ce=Math.max(0,(k*$-v.height)/2);S=Math.min(Z,Math.max(-Z,S)),I=Math.min(ce,Math.max(-ce,I))},G=()=>{let $=C*E;_.clearRect(0,0,v.width,v.height);let Z=v.width/2-A*$/2+S,ce=v.height/2-k*$/2+I;if(_.drawImage(r,Z,ce,A*$,k*$),T.clearRect(0,0,w.width,w.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let q=Math.max(w.width/o.naturalWidth,w.height/o.naturalHeight),ee=w.width/2-o.naturalWidth*q/2,K=w.height/2-o.naturalHeight*q/2;T.drawImage(o,ee,K,o.naturalWidth*q,o.naturalHeight*q)}else T.fillStyle="rgba(255, 255, 255, 0.04)",T.fillRect(0,0,w.width,w.height),T.strokeStyle="rgba(255, 255, 255, 0.08)",T.strokeRect(4,4,w.width-8,w.height-8);let he=w.width/v.width*(C*E),de=S*(w.width/v.width),ve=I*(w.height/v.height),Ce=w.width/2-A*he/2+de,Te=w.height/2-k*he/2+ve;T.save(),T.globalAlpha=.7,T.drawImage(r,Ce,Te,A*he,k*he),T.restore()},Y=()=>{S=0,I=0,B(),G()};y.addEventListener("input",()=>{E=Number(y.value),x.textContent=`${E.toFixed(2)}\xD7`,B(),G()}),v.addEventListener("pointerdown",$=>{P=!0,z=$.clientX,D=$.clientY,N=S,H=I,v.setPointerCapture($.pointerId)}),v.addEventListener("pointermove",$=>{P&&(S=N+($.clientX-z),I=H+($.clientY-D),B(),G())}),v.addEventListener("pointerup",$=>{P=!1,v.releasePointerCapture($.pointerId)}),v.addEventListener("pointerleave",()=>{P=!1});let Q=()=>{c.remove()},ie=()=>{Q(),l(null)},le=async()=>{let $=document.createElement("canvas");$.width=t.width,$.height=t.height;let Z=$.getContext("2d");if(!Z){Q(),l(null);return}let ce=E,de=Math.max($.width/A,$.height/k)*ce,ve=$.width/v.width,Ce=S*ve,Te=I*ve,q=$.width/2-A*de/2+Ce,ee=$.height/2-k*de/2+Te;Z.drawImage(r,q,ee,A*de,k*de);let K=await new Promise(ae=>{$.toBlob(Oe=>ae(Oe),e.type||"image/png")});if(Q(),!K){l(null);return}l(new File([K],e.name,{type:K.type}))};M==null||M.addEventListener("click",ie),j==null||j.addEventListener("click",ie),O==null||O.addEventListener("click",Y),L==null||L.addEventListener("click",()=>{le()}),c.addEventListener("click",$=>{$.target===c&&ie()}),document.body.appendChild(c),Y()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var wi=class{constructor(){this.root=null;this.options=null}render(){return`
1689
1690
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
1690
1691
  <div class="scene-panel-header" data-panel-handle>
1691
1692
  <div class="panel-title">
@@ -1751,10 +1752,10 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1751
1752
  </div>
1752
1753
  </div>
1753
1754
  </div>
1754
- `}initialize(e,t){var v,w,y,x,M,j,L,_,O,T,A,k,C,E,S,I;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var R;let P=window.getEditableEngineConfig;if(typeof P=="function"){let D=P();return(R=D==null?void 0:D.loading)!=null?R:{}}return{}})(),a=(v=this.root)==null?void 0:v.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{type:a.value}),this.updateFieldVisibility(a.value)}));let r=(w=this.root)==null?void 0:w.querySelector("#loading-background-color");r&&(r.value=n.background_color||"#160a17",r.addEventListener("input",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{background_color:r.value})}));let o=(y=this.root)==null?void 0:y.querySelector("#loading-overlay-alpha"),l=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((M=n.overlay_alpha)!=null?M:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var R,D;let P=Number(o.value);l&&(l.textContent=P.toFixed(2)),(D=(R=this.options)==null?void 0:R.onUpdateLoading)==null||D.call(R,{overlay_alpha:P})}));let c=(j=this.root)==null?void 0:j.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{text:c.value})}));let d=(L=this.root)==null?void 0:L.querySelector("#loading-text-scale"),p=(_=this.root)==null?void 0:_.querySelector("#loading-text-scale-value");d&&(d.value=String((O=n.text_scale)!=null?O:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var R,D;let P=Number(d.value);p&&(p.textContent=P.toFixed(2)),(D=(R=this.options)==null?void 0:R.onUpdateLoading)==null||D.call(R,{text_scale:P})}));let u=(T=this.root)==null?void 0:T.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{enabled:u.checked})}));let g=(A=this.root)==null?void 0:A.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{blur_enabled:g.checked})}));let h=(k=this.root)==null?void 0:k.querySelector("#loading-blur-strength"),m=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength-value");h&&(h.value=String((E=n.blur_strength)!=null?E:8),m&&(m.textContent=h.value),h.addEventListener("input",()=>{var P,R;m&&(m.textContent=h.value),(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{blur_strength:Number(h.value)})}));let f=(S=this.root)==null?void 0:S.querySelector("#loading-show-btn"),b=(I=this.root)==null?void 0:I.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onShowLoadingScreen)==null||R.call(P)}),b==null||b.addEventListener("click",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onHideLoadingScreen)==null||R.call(P)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Graphics as Tr,Point as Os}from"pixi.js";import{Point as Sr}from"pixi.js";var $e=()=>window.debugConfig||{},Er=()=>window.resolveAnchorVec2||(s=>({x:.5,y:.5})),Ar=()=>window.resolveScreenAnchorPoint||(()=>new Sr),Cr=()=>window.resolveScreenRatioPoint||(()=>new Sr);function Lr(s){xi(s)&&(s.objectDebugRaf||(s.objectDebugRaf=window.requestAnimationFrame(()=>Si(s))))}function kr(s){s.objectDebugRaf&&(window.cancelAnimationFrame(s.objectDebugRaf),s.objectDebugRaf=null),At(s)}function xi(s){return s.isDebugOpen}function Si(s){var a,r,o;if(!xi(s)){s.objectDebugRaf=null;return}s.objectDebugRaf=window.requestAnimationFrame(()=>Si(s));let e=hn(s);if(!e){Et(s,null),At(s);return}let t=mn(s,e);if(!t){Et(s,null),At(s);return}let i=new Os;(a=t.getGlobalPosition)==null||a.call(t,i);let n=fn(s,t);Et(s,{instanceId:e,worldX:i.x,worldY:i.y,configX:(r=n==null?void 0:n.x)!=null?r:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),s.highlightObject?wn(s,t):Sn(s),s.highlightAnchor&&n?xn(s,n):En(s)}function hn(s){var n;let e=s.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function mn(s,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function Ct(s){let e=s.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function fn(s,e){var r,o;let t=Ct(s);if(!t)return null;let i=(r=t.transform)!=null?r:{},n=bn(s);if(!n)return null;if(i.position_ratio!=null)return Cr()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return Ar()(n.width,n.height,a)}function bn(s){var a;let e=(a=s.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function vn(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectBoundsGfx&&s.objectBoundsGfx.parent!==e.stage&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectBoundsGfx||(s.objectBoundsGfx=new Tr,s.objectBoundsGfx.zIndex=999999,e.stage.addChild(s.objectBoundsGfx)),s.objectBoundsGfx):null}function yn(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectAnchorGfx&&s.objectAnchorGfx.parent!==e.stage&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null),s.objectAnchorGfx||(s.objectAnchorGfx=new Tr,s.objectAnchorGfx.zIndex=1e6,e.stage.addChild(s.objectAnchorGfx)),s.objectAnchorGfx):null}function wn(s,e){var n;let t=vn(s);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function xn(s,e){let t=yn(s);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function Sn(s){s.objectBoundsGfx&&s.objectBoundsGfx.clear()}function En(s){s.objectAnchorGfx&&s.objectAnchorGfx.clear()}function At(s){s.objectBoundsGfx&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectAnchorGfx&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null)}function Et(s,e){s.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function Pr(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function Mr(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;for(let o of i)a[o]=(r=a[o])!=null?r:{},a=a[o];a[n]=t}function An(s){var i,n,a,r,o;if(!s)return!1;if((i=s.transform)!=null&&i.offset)return!0;let e=((a=(n=s.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(r=s.identity)==null?void 0:r.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Ai(s){let e=$e();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function Ir(s){window.location.reload()}function Ci(s){let e=JSON.stringify($e(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function jr(s,e){var t,i,n;if(!(!s.configViewer||!s.container))try{let a=window.getEditableObjectConfig,r=typeof a=="function"?a(e):null;if(!r){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-3JDCJ3GB.js"),p=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!p)return;let u=await l(p.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),Ei(s,u),(i=s.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,r),Ei(s,r),(n=s.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function Ei(s,e){var p,u,g,h,m,f,b,v,w,y;if(!s.container)return;let t=s.container.querySelector("#config-pos-x"),i=s.container.querySelector("#config-pos-y"),n=s.container.querySelector("#config-scale"),a=s.container.querySelector("#config-anchor-x"),r=s.container.querySelector("#config-anchor-y"),l=An(e)?(p=e.transform)==null?void 0:p.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((h=l==null?void 0:l.y)!=null?h:0)),n&&(n.value=String((f=(m=e.transform)==null?void 0:m.scale)!=null?f:1));let c=(y=(w=(b=e.transform)==null?void 0:b.anchor)!=null?w:(v=e.render)==null?void 0:v.anchor)!=null?y:{x:.5,y:.5},d=Er()(c);a&&(a.value=String(d.x)),r&&(r.value=String(d.y))}function _r(s){var l,c,d,p,u,g,h,m,f,b;let e=s.selectedObjectId;if(!e||!s.container)return;let t=(c=(l=s.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=s.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=s.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(m=(h=s.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?m:"0.5",r=(b=(f=s.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?b:"0.5",o=`${e}:
1755
+ `}initialize(e,t){var v,w,y,x,M,j,L,O,_,T,A,k,C,E,S,I;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var z;let P=window.getEditableEngineConfig;if(typeof P=="function"){let D=P();return(z=D==null?void 0:D.loading)!=null?z:{}}return{}})(),a=(v=this.root)==null?void 0:v.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var P,z;(z=(P=this.options)==null?void 0:P.onUpdateLoading)==null||z.call(P,{type:a.value}),this.updateFieldVisibility(a.value)}));let r=(w=this.root)==null?void 0:w.querySelector("#loading-background-color");r&&(r.value=n.background_color||"#160a17",r.addEventListener("input",()=>{var P,z;(z=(P=this.options)==null?void 0:P.onUpdateLoading)==null||z.call(P,{background_color:r.value})}));let o=(y=this.root)==null?void 0:y.querySelector("#loading-overlay-alpha"),l=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((M=n.overlay_alpha)!=null?M:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var z,D;let P=Number(o.value);l&&(l.textContent=P.toFixed(2)),(D=(z=this.options)==null?void 0:z.onUpdateLoading)==null||D.call(z,{overlay_alpha:P})}));let c=(j=this.root)==null?void 0:j.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var P,z;(z=(P=this.options)==null?void 0:P.onUpdateLoading)==null||z.call(P,{text:c.value})}));let d=(L=this.root)==null?void 0:L.querySelector("#loading-text-scale"),p=(O=this.root)==null?void 0:O.querySelector("#loading-text-scale-value");d&&(d.value=String((_=n.text_scale)!=null?_:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var z,D;let P=Number(d.value);p&&(p.textContent=P.toFixed(2)),(D=(z=this.options)==null?void 0:z.onUpdateLoading)==null||D.call(z,{text_scale:P})}));let u=(T=this.root)==null?void 0:T.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var P,z;(z=(P=this.options)==null?void 0:P.onUpdateLoading)==null||z.call(P,{enabled:u.checked})}));let g=(A=this.root)==null?void 0:A.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var P,z;(z=(P=this.options)==null?void 0:P.onUpdateLoading)==null||z.call(P,{blur_enabled:g.checked})}));let h=(k=this.root)==null?void 0:k.querySelector("#loading-blur-strength"),m=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength-value");h&&(h.value=String((E=n.blur_strength)!=null?E:8),m&&(m.textContent=h.value),h.addEventListener("input",()=>{var P,z;m&&(m.textContent=h.value),(z=(P=this.options)==null?void 0:P.onUpdateLoading)==null||z.call(P,{blur_strength:Number(h.value)})}));let f=(S=this.root)==null?void 0:S.querySelector("#loading-show-btn"),b=(I=this.root)==null?void 0:I.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var P,z;(z=(P=this.options)==null?void 0:P.onShowLoadingScreen)==null||z.call(P)}),b==null||b.addEventListener("click",()=>{var P,z;(z=(P=this.options)==null?void 0:P.onHideLoadingScreen)==null||z.call(P)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Graphics as Tr,Point as _s}from"pixi.js";import{Point as Sr}from"pixi.js";var $e=()=>window.debugConfig||{},Er=()=>window.resolveAnchorVec2||(s=>({x:.5,y:.5})),Ar=()=>window.resolveScreenAnchorPoint||(()=>new Sr),Cr=()=>window.resolveScreenRatioPoint||(()=>new Sr);function Lr(s){xi(s)&&(s.objectDebugRaf||(s.objectDebugRaf=window.requestAnimationFrame(()=>Si(s))))}function kr(s){s.objectDebugRaf&&(window.cancelAnimationFrame(s.objectDebugRaf),s.objectDebugRaf=null),At(s)}function xi(s){return s.isDebugOpen}function Si(s){var a,r,o;if(!xi(s)){s.objectDebugRaf=null;return}s.objectDebugRaf=window.requestAnimationFrame(()=>Si(s));let e=hn(s);if(!e){Et(s,null),At(s);return}let t=mn(s,e);if(!t){Et(s,null),At(s);return}let i=new _s;(a=t.getGlobalPosition)==null||a.call(t,i);let n=fn(s,t);Et(s,{instanceId:e,worldX:i.x,worldY:i.y,configX:(r=n==null?void 0:n.x)!=null?r:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),s.highlightObject?wn(s,t):Sn(s),s.highlightAnchor&&n?xn(s,n):En(s)}function hn(s){var n;let e=s.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function mn(s,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function Ct(s){let e=s.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function fn(s,e){var r,o;let t=Ct(s);if(!t)return null;let i=(r=t.transform)!=null?r:{},n=bn(s);if(!n)return null;if(i.position_ratio!=null)return Cr()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return Ar()(n.width,n.height,a)}function bn(s){var a;let e=(a=s.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function vn(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectBoundsGfx&&s.objectBoundsGfx.parent!==e.stage&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectBoundsGfx||(s.objectBoundsGfx=new Tr,s.objectBoundsGfx.zIndex=999999,e.stage.addChild(s.objectBoundsGfx)),s.objectBoundsGfx):null}function yn(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectAnchorGfx&&s.objectAnchorGfx.parent!==e.stage&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null),s.objectAnchorGfx||(s.objectAnchorGfx=new Tr,s.objectAnchorGfx.zIndex=1e6,e.stage.addChild(s.objectAnchorGfx)),s.objectAnchorGfx):null}function wn(s,e){var n;let t=vn(s);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function xn(s,e){let t=yn(s);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function Sn(s){s.objectBoundsGfx&&s.objectBoundsGfx.clear()}function En(s){s.objectAnchorGfx&&s.objectAnchorGfx.clear()}function At(s){s.objectBoundsGfx&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectAnchorGfx&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null)}function Et(s,e){s.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function Pr(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function Mr(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;for(let o of i)a[o]=(r=a[o])!=null?r:{},a=a[o];a[n]=t}function An(s){var i,n,a,r,o;if(!s)return!1;if((i=s.transform)!=null&&i.offset)return!0;let e=((a=(n=s.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(r=s.identity)==null?void 0:r.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Ai(s){let e=$e();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function Ir(s){window.location.reload()}function Ci(s){let e=JSON.stringify($e(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function jr(s,e){var t,i,n;if(!(!s.configViewer||!s.container))try{let a=window.getEditableObjectConfig,r=typeof a=="function"?a(e):null;if(!r){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-3JDCJ3GB.js"),p=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!p)return;let u=await l(p.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),Ei(s,u),(i=s.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,r),Ei(s,r),(n=s.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function Ei(s,e){var p,u,g,h,m,f,b,v,w,y;if(!s.container)return;let t=s.container.querySelector("#config-pos-x"),i=s.container.querySelector("#config-pos-y"),n=s.container.querySelector("#config-scale"),a=s.container.querySelector("#config-anchor-x"),r=s.container.querySelector("#config-anchor-y"),l=An(e)?(p=e.transform)==null?void 0:p.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((h=l==null?void 0:l.y)!=null?h:0)),n&&(n.value=String((f=(m=e.transform)==null?void 0:m.scale)!=null?f:1));let c=(y=(w=(b=e.transform)==null?void 0:b.anchor)!=null?w:(v=e.render)==null?void 0:v.anchor)!=null?y:{x:.5,y:.5},d=Er()(c);a&&(a.value=String(d.x)),r&&(r.value=String(d.y))}function Or(s){var l,c,d,p,u,g,h,m,f,b;let e=s.selectedObjectId;if(!e||!s.container)return;let t=(c=(l=s.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=s.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=s.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(m=(h=s.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?m:"0.5",r=(b=(f=s.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?b:"0.5",o=`${e}:
1755
1756
  position: (${t}, ${i})
1756
1757
  scale: ${n}
1757
- anchor: (${a}, ${r})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(v=>console.error("[DEBUG] Failed to copy config values:",v))}async function Cn(s,e){var p,u,g,h,m,f,b,v,w,y,x;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!s.container)return;let t=s.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=s.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((h=(g=s.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?h:0),a=Number((f=(m=s.container.querySelector("#config-scale"))==null?void 0:m.value)!=null?f:1),r=Number((v=(b=s.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?v:.5),o=Number((y=(w=s.container.querySelector("#config-anchor-y"))==null?void 0:w.value)!=null?y:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:r,anchorY:o});let{applyConfigOverride:l}=await import("./ConfigOverride-V7DLPL5I.js");l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:r,y:o}},{silent:e==null?void 0:e.silent});let c=Ct(s);An(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let d=window.applyEditableObjectConfig;if(typeof d=="function"){let M=(x=window.getEditableObjectConfig)==null?void 0:x.call(window,t);M?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,M)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Or(s,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-V7DLPL5I.js");Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let m=0;m<g.length-1;m++){let f=g[m];h[f]=(u=h[f])!=null?u:{},h=h[f]}h[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),r=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;r&&(o!=null&&o.refresh)&&o.refresh()}function Rr(s){s.selectedObjectId&&(s.objectAutoApplyTimer&&window.clearTimeout(s.objectAutoApplyTimer),s.objectAutoApplyTimer=window.setTimeout(()=>{s.objectAutoApplyTimer=null,Cn(s,{silent:!0})},150))}var Rs=3e3;function Ye(s,e,t){let i=t!=null?t:s.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,r=0,o=0,l=0,c=0,d=0,p=g=>{if(!n)return;let h=i.getBoundingClientRect();s.style.left=`${g.clientX-h.left-c}px`,s.style.top=`${g.clientY-h.top-d}px`},u=()=>{n&&(n=!1,s.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let m=s.getBoundingClientRect(),f=i.getBoundingClientRect();console.log("[DRAG] Panel:",s.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] containerRect:",{left:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-m.left,d=g.clientY-m.top,console.log("[DRAG] offset:",{x:c,y:d});let b=m.left-f.left,v=m.top-f.top;console.log("[DRAG] targetPosition:",{left:b,top:v}),s.style.left=`${b}px`,s.style.top=`${v}px`,s.style.right="auto",s.style.bottom="auto",s.style.zIndex=String(++Rs),n=!0,s.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function Ti(s,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,r=0,o=0,l=0,c=!1,d=u=>{var v;if(!c)return;let g=u.clientX-o,h=u.clientY-l,m=Math.max(i,a+g),f=Math.max(n,r+h);s.style.width=`${m}px`,(v=s.closest(".preview-shell"))!=null&&v.classList.contains("layout-fixed")||(s.style.height=`${f}px`),t==null||t(m,f)},p=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=s.getBoundingClientRect();a=g.width,r=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function Tn(s,e){var m,f,b,v;let t=(b=(f=(m=s.container)==null?void 0:m.querySelector("#debug-overlay"))!=null?f:s.debugOverlay)!=null?b:e.offsetParent;if(!t||(v=s.container)!=null&&v.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,r=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>r&&(e.style.width=`${r}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),p),h=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function st(s){var i,n;if(!s.container)return;let e=s.container.querySelector("#debug-workbench");if(!e)return;if(Tn(s,e),(i=s.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),r={activeTab:s.activeTab};if(a)try{r={...JSON.parse(a),activeTab:s.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(r));return}let t={activeTab:s.activeTab,width:e.style.width,height:(n=s.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function Li(s){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(s.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=s.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let r=(a=s.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!r?i.style.height=t.height:r&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),Tn(s,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function Ln(s,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",Tn(s,e),st(s))}function zr(s){var n,a,r;if(!s.container)return;let e=s.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=s.toggleDebug)==null||o.call(s)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=s.toggleDebug)==null?void 0:o.call(s,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>Ai(s)),(r=e.querySelector("#debug-export"))==null||r.addEventListener("click",()=>Ci(s)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;s.activeTab=l,kn(s),st(s)})}),Mn(s,e),Pn(s,e)}function kn(s){if(!s.container)return;let e=s.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===s.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===s.activeTab)})}function Pn(s,e){fe(s,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),fe(s,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),fe(s,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),fe(s,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),fe(s,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),fe(s,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),fe(s,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),fe(s,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),fe(s,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=$e();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),r=$e();r.layout&&(r.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Dr(s){if(!s.container||!s.debugOverlay)return;let e=s.container.querySelector("#debug-workbench"),t=s.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Ye(e,t,s.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{st(s),Ln(s,e)},10)}));let i=s.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),Ye(i,n,s.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{Ln(s,i)},10)})),i&&a&&Ti(i,a);let r=s.container.querySelector('[data-panel="scene-tools-corner"]'),o=r==null?void 0:r.querySelector("[data-panel-handle]");r&&o&&Ye(r,o,s.debugOverlay);let l=s.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ye(l,c,s.debugOverlay),Li(s)}function Mn(s,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function fe(s,e,t,i,n){let a=e.querySelector(`#${t}`),r=e.querySelector(n);if(!a||!r)return;let o=Pr($e(),i);typeof o=="number"&&(a.value=String(o),r.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);r.textContent=String(l),Mr($e(),i,l)})}var ki=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{await fetch("/api/sync-screens",{method:"POST"})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=Qe(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let p=d.objectId||"Engine";a[p]||(a[p]=[]),a[p].push(d)}let r=localStorage.getItem("handler_last_applied"),o=r?new Date(parseInt(r)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1758
+ anchor: (${a}, ${r})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(v=>console.error("[DEBUG] Failed to copy config values:",v))}async function Cn(s,e){var p,u,g,h,m,f,b,v,w,y,x;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!s.container)return;let t=s.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=s.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((h=(g=s.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?h:0),a=Number((f=(m=s.container.querySelector("#config-scale"))==null?void 0:m.value)!=null?f:1),r=Number((v=(b=s.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?v:.5),o=Number((y=(w=s.container.querySelector("#config-anchor-y"))==null?void 0:w.value)!=null?y:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:r,anchorY:o});let{applyConfigOverride:l}=await import("./ConfigOverride-V7DLPL5I.js");l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:r,y:o}},{silent:e==null?void 0:e.silent});let c=Ct(s);An(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let d=window.applyEditableObjectConfig;if(typeof d=="function"){let M=(x=window.getEditableObjectConfig)==null?void 0:x.call(window,t);M?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,M)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function _r(s,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-V7DLPL5I.js");Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let m=0;m<g.length-1;m++){let f=g[m];h[f]=(u=h[f])!=null?u:{},h=h[f]}h[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),r=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;r&&(o!=null&&o.refresh)&&o.refresh()}function zr(s){s.selectedObjectId&&(s.objectAutoApplyTimer&&window.clearTimeout(s.objectAutoApplyTimer),s.objectAutoApplyTimer=window.setTimeout(()=>{s.objectAutoApplyTimer=null,Cn(s,{silent:!0})},150))}var zs=3e3;function Ye(s,e,t){let i=t!=null?t:s.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,r=0,o=0,l=0,c=0,d=0,p=g=>{if(!n)return;let h=i.getBoundingClientRect();s.style.left=`${g.clientX-h.left-c}px`,s.style.top=`${g.clientY-h.top-d}px`},u=()=>{n&&(n=!1,s.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let m=s.getBoundingClientRect(),f=i.getBoundingClientRect();console.log("[DRAG] Panel:",s.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] containerRect:",{left:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-m.left,d=g.clientY-m.top,console.log("[DRAG] offset:",{x:c,y:d});let b=m.left-f.left,v=m.top-f.top;console.log("[DRAG] targetPosition:",{left:b,top:v}),s.style.left=`${b}px`,s.style.top=`${v}px`,s.style.right="auto",s.style.bottom="auto",s.style.zIndex=String(++zs),n=!0,s.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function Ti(s,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,r=0,o=0,l=0,c=!1,d=u=>{var v;if(!c)return;let g=u.clientX-o,h=u.clientY-l,m=Math.max(i,a+g),f=Math.max(n,r+h);s.style.width=`${m}px`,(v=s.closest(".preview-shell"))!=null&&v.classList.contains("layout-fixed")||(s.style.height=`${f}px`),t==null||t(m,f)},p=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=s.getBoundingClientRect();a=g.width,r=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function Tn(s,e){var m,f,b,v;let t=(b=(f=(m=s.container)==null?void 0:m.querySelector("#debug-overlay"))!=null?f:s.debugOverlay)!=null?b:e.offsetParent;if(!t||(v=s.container)!=null&&v.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,r=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>r&&(e.style.width=`${r}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),p),h=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function ot(s){var i,n;if(!s.container)return;let e=s.container.querySelector("#debug-workbench");if(!e)return;if(Tn(s,e),(i=s.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),r={activeTab:s.activeTab};if(a)try{r={...JSON.parse(a),activeTab:s.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(r));return}let t={activeTab:s.activeTab,width:e.style.width,height:(n=s.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function Li(s){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(s.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=s.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let r=(a=s.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!r?i.style.height=t.height:r&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),Tn(s,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function Ln(s,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",Tn(s,e),ot(s))}function Rr(s){var n,a,r;if(!s.container)return;let e=s.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=s.toggleDebug)==null||o.call(s)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=s.toggleDebug)==null?void 0:o.call(s,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>Ai(s)),(r=e.querySelector("#debug-export"))==null||r.addEventListener("click",()=>Ci(s)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;s.activeTab=l,kn(s),ot(s)})}),Mn(s,e),Pn(s,e)}function kn(s){if(!s.container)return;let e=s.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===s.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===s.activeTab)})}function Pn(s,e){fe(s,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),fe(s,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),fe(s,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),fe(s,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),fe(s,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),fe(s,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),fe(s,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),fe(s,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),fe(s,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=$e();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),r=$e();r.layout&&(r.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Dr(s){if(!s.container||!s.debugOverlay)return;let e=s.container.querySelector("#debug-workbench"),t=s.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Ye(e,t,s.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{ot(s),Ln(s,e)},10)}));let i=s.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),Ye(i,n,s.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{Ln(s,i)},10)})),i&&a&&Ti(i,a);let r=s.container.querySelector('[data-panel="scene-tools-corner"]'),o=r==null?void 0:r.querySelector("[data-panel-handle]");r&&o&&Ye(r,o,s.debugOverlay);let l=s.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ye(l,c,s.debugOverlay),Li(s)}function Mn(s,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function fe(s,e,t,i,n){let a=e.querySelector(`#${t}`),r=e.querySelector(n);if(!a||!r)return;let o=Pr($e(),i);typeof o=="number"&&(a.value=String(o),r.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);r.textContent=String(l),Mr($e(),i,l)})}var ki=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{await fetch("/api/sync-screens",{method:"POST"})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=et(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let p=d.objectId||"Engine";a[p]||(a[p]=[]),a[p].push(d)}let r=localStorage.getItem("handler_last_applied"),o=r?new Date(parseInt(r)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1758
1759
  <div class="config-persistence-panel">
1759
1760
  <!-- Status Footer (Always Visible) -->
1760
1761
  <div class="persistence-status-footer">
@@ -1918,7 +1919,7 @@ This will delete generated config JSON files in configs/objects that are not ref
1918
1919
 
1919
1920
  It will NOT touch library/base configs.
1920
1921
 
1921
- Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let m=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,f=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${m} configs, ${f} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!Qe().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
1922
+ Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let m=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,f=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${m} configs, ${f} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!et().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
1922
1923
 
1923
1924
  This will:
1924
1925
  \u2022 Create a new version snapshot
@@ -1928,7 +1929,7 @@ This will:
1928
1929
 
1929
1930
  This will write all staged changes to ${u}.
1930
1931
 
1931
- After applying, staged overrides will be cleared.`))try{i.textContent="\u23F3 Applying...",i.setAttribute("disabled","true");let h=Bt(),m={};for(let[v,w]of Object.entries(h.objects)){let y=w,x=v;/^(json\.|ui\.|effects\.|engine\.)/.test(x)||(x=`json.${v}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=x),m[`objects/${x}.json`]=y}h.engine&&(h.engine.runtime&&(m["engine/engine.runtime.json"]=h.engine.runtime),h.engine.assets&&(m["engine/engine.assets.json"]=h.engine.assets),h.engine.splash&&(m["engine/engine.splash.json"]=h.engine.splash),h.engine.loading&&(m["engine/engine.loading.json"]=h.engine.loading),h.engine.start&&(m["engine/engine.start.json"]=h.engine.start),h.engine.tutorial&&(m["engine/engine.tutorial.json"]=h.engine.tutorial),h.engine.endgame&&(m["engine/engine.endgame.json"]=h.engine.endgame),!h.engine.runtime&&!h.engine.assets&&(m["engine/engine.json"]=h.engine));for(let[v,w]of Object.entries(h.scenes)){let y=v.startsWith("scene.")?v:`scene.${v}`;m[`scenes/${y}.json`]=w}let f=this.currentVersion?"/api/apply-current":"/api/apply-direct",b=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:m,assets:{},hadCacheAtApply:!0})});if(!b.ok){let v=await b.json();throw new Error(v.error||"Apply to current source failed")}We(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(h){console.error("[ConfigPersistence] Apply current failed:",h),alert(`\u274C Apply to current source failed: ${h.message}`),i.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",i.removeAttribute("disabled")}});let n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1932
+ After applying, staged overrides will be cleared.`))try{i.textContent="\u23F3 Applying...",i.setAttribute("disabled","true");let h=Ft(),m={};for(let[v,w]of Object.entries(h.objects)){let y=w,x=v;/^(json\.|ui\.|effects\.|engine\.)/.test(x)||(x=`json.${v}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=x),m[`objects/${x}.json`]=y}h.engine&&(h.engine.runtime&&(m["engine/engine.runtime.json"]=h.engine.runtime),h.engine.assets&&(m["engine/engine.assets.json"]=h.engine.assets),h.engine.splash&&(m["engine/engine.splash.json"]=h.engine.splash),h.engine.loading&&(m["engine/engine.loading.json"]=h.engine.loading),h.engine.start&&(m["engine/engine.start.json"]=h.engine.start),h.engine.tutorial&&(m["engine/engine.tutorial.json"]=h.engine.tutorial),h.engine.endgame&&(m["engine/engine.endgame.json"]=h.engine.endgame),!h.engine.runtime&&!h.engine.assets&&(m["engine/engine.json"]=h.engine));for(let[v,w]of Object.entries(h.scenes)){let y=v.startsWith("scene.")?v:`scene.${v}`;m[`scenes/${y}.json`]=w}let f=this.currentVersion?"/api/apply-current":"/api/apply-direct",b=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:m,assets:{},hadCacheAtApply:!0})});if(!b.ok){let v=await b.json();throw new Error(v.error||"Apply to current source failed")}We(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(h){console.error("[ConfigPersistence] Apply current failed:",h),alert(`\u274C Apply to current source failed: ${h.message}`),i.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",i.removeAttribute("disabled")}});let n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1932
1933
 
1933
1934
  This will DIRECTLY MODIFY base configuration files.
1934
1935
 
@@ -1938,13 +1939,13 @@ This is ONLY for active development.
1938
1939
 
1939
1940
  Make sure your project is under Git version control.
1940
1941
 
1941
- Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Bt(),h={};for(let[f,b]of Object.entries(g.objects)){let v=b,w=f;/^(json\.|ui\.|effects\.|engine\.)/.test(w)||(w=`json.${f}`),v&&typeof v=="object"&&(v.identity||(v.identity={}),v.identity.id=w),h[`objects/${w}.json`]=v}g.engine&&(g.engine.runtime&&(h["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(h["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(h["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(h["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(h["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(h["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(h["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(h["engine/engine.json"]=g.engine));for(let[f,b]of Object.entries(g.scenes)){let v=f.startsWith("scene.")?f:`scene.${f}`;h[`scenes/${v}.json`]=b}let m=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{}})});if(!m.ok){let f=await m.json();throw new Error(f.error||"Apply to base failed")}We(),this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async u=>{let h=u.target.value;await this.switchVersion(h)}),this.container.querySelectorAll(".item-remove").forEach(u=>{u.addEventListener("click",()=>{let g=u.dataset.removePath,h=u.dataset.removeId;ba(h||void 0,g)})});let o=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(We(),Qi(),this.refreshPanel())};o==null||o.addEventListener("click",c),l==null||l.addEventListener("click",c);let d=this.container.querySelector("#reset-to-applied-btn");d==null||d.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&Qi()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await xa()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
1942
+ Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Ft(),h={};for(let[f,b]of Object.entries(g.objects)){let v=b,w=f;/^(json\.|ui\.|effects\.|engine\.)/.test(w)||(w=`json.${f}`),v&&typeof v=="object"&&(v.identity||(v.identity={}),v.identity.id=w),h[`objects/${w}.json`]=v}g.engine&&(g.engine.runtime&&(h["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(h["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(h["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(h["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(h["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(h["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(h["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(h["engine/engine.json"]=g.engine));for(let[f,b]of Object.entries(g.scenes)){let v=f.startsWith("scene.")?f:`scene.${f}`;h[`scenes/${v}.json`]=b}let m=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{}})});if(!m.ok){let f=await m.json();throw new Error(f.error||"Apply to base failed")}We(),this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async u=>{let h=u.target.value;await this.switchVersion(h)}),this.container.querySelectorAll(".item-remove").forEach(u=>{u.addEventListener("click",()=>{let g=u.dataset.removePath,h=u.dataset.removeId;ba(h||void 0,g)})});let o=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(We(),Qi(),this.refreshPanel())};o==null||o.addEventListener("click",c),l==null||l.addEventListener("click",c);let d=this.container.querySelector("#reset-to-applied-btn");d==null||d.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&Qi()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await xa()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
1942
1943
  <div class="notify-icon">\u2705</div>
1943
1944
  <div class="notify-content">
1944
1945
  <strong>${i}</strong>
1945
1946
  <span>Project files updated.</span>
1946
1947
  </div>
1947
- `,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,r;let t=Qe();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
1948
+ `,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,r;let t=et();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
1948
1949
 
1949
1950
  You have ${t.overrideCount} staged changes that will be discarded.
1950
1951
 
@@ -1956,7 +1957,7 @@ This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snaps
1956
1957
 
1957
1958
  This cannot be undone unless you have git commits or backups.
1958
1959
 
1959
- Are you absolutely sure?`))try{let t=Bt(),i={};for(let[a,r]of Object.entries(t.objects)){let o=r,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[a,r]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=r}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Direct apply failed")}We(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Pi=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new Xt;this.sceneToolsPanel=new Jt;this.nudgePanel=new Zt;this.inspectorPanel=new ui;this.libraryPanel=new St;this.libraryPanelDocked=new St;this.brandVisionPanel=new vi;this.customizeSettingsPanel=new yi;this.configPersistencePanel=new ki;this.loadingScreenPanel=new wi}applyAssetChange(e,t){return br(this,e,t)}resetAsset(e){return vr(this,e)}applySlotAsset(e,t,i){return fi(this,e,t,i)}resetSlotAsset(e,t,i){return yr(this,e,t,i)}startObjectVisuals(){return Lr(this)}stopObjectVisuals(){return kr(this)}shouldRunObjectVisuals(){return xi(this)}updateObjectVisuals(){return Si(this)}getSelectedInstanceId(){return hn(this)}getDisplayObjectById(e){return mn(this,e)}getSelectedObjectConfig(){return Ct(this)}getConfigAnchorWorldPoint(e){return fn(this,e)}getScreenSize(){return bn(this)}ensureBoundsGfx(){return vn(this)}ensureAnchorGfx(){return yn(this)}drawBounds(e){return wn(this,e)}drawAnchor(e){return xn(this,e)}clearBounds(){return Sn(this)}clearAnchor(){return En(this)}clearObjectVisuals(){return At(this)}updateObjectInfo(e){return Et(this,e)}resetDebugConfig(){return Ai(this)}applyDebugConfig(){return Ir(this)}exportDebugConfig(){return Ci(this)}loadObjectConfig(e){return jr(this,e)}fillConfigViewer(e){return Ei(this,e)}copyConfigValues(){return _r(this)}applyObjectConfig(e){return Cn(this,e)}applyCustomizeSettings(e,t){return Or(this,e,t)}scheduleObjectAutoApply(){return Rr(this)}setupDebugEventListeners(){return zr(this)}setupDebugInputListeners(e){return Pn(this,e)}setupPanelLayout(){return Dr(this)}setupCollapsiblePanels(e){return Mn(this,e)}setupRangeInput(e,t,i,n){return fe(this,e,t,i,n)}updateWorkbenchTabs(){return kn(this)}saveWorkbenchState(){return st(this)}loadWorkbenchState(){return Li(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let a=localStorage.getItem("preview_workbench_state");if(a){let r=JSON.parse(a);r.activeTab&&(this.activeTab=r.activeTab)}}catch(a){console.warn("[PREVIEW] Failed to load workbench tab state",a)}this.sceneObjectsPanel.initialize(e,{onSelect:a=>this.handleObjectSelect(a)}),this.libraryPanel.initialize(e,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,r,o)=>{console.log("[Inspector] Property changed:",a,r,o)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,r)=>this.applyCustomizeSettings(a,r)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:a=>{this.highlightObject=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:a=>{this.highlightAnchor=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(a,r)=>this.nudgeSelectedObject(a,r),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,r)=>{var g,h,m,f,b,v;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((h=l==null?void 0:l.x)!=null?h:0)+a,d=((m=l==null?void 0:l.y)!=null?m:0)+r,{applyConfigOverride:p}=await import("./ConfigOverride-V7DLPL5I.js");p({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:d}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let w=window.__editableConfig,y=(v=(b=(f=w==null?void 0:w.objects)==null?void 0:f.get)==null?void 0:b.call(f,this.selectedObjectId))!=null?v:o;await u(this.selectedObjectId,y)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var p,u,g,h,m;if(!this.selectedObjectId)return;let r=this.getSelectedObjectConfig();if(!r)return;let o=(u=(p=r.transform)==null?void 0:p.scale)!=null?u:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await import("./ConfigOverride-V7DLPL5I.js");c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let f=window.__editableConfig,b=(m=(h=(g=f==null?void 0:f.objects)==null?void 0:g.get)==null?void 0:h.call(g,this.selectedObjectId))!=null?m:r;await d(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let a=window;typeof a.__previewShowLoading=="function"?a.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let a=window;typeof a.__previewHideLoading=="function"?a.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({loading:a}),typeof r.__previewUpdateLoading=="function"?r.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,r,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,r,o,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var r,o;((r=a.detail)==null?void 0:r.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,r,o)=>this.applySlotAsset(a,r,o),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var r;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((r=o==null?void 0:o.engine)==null?void 0:r.splash)||null}return null},window.addAssetToRegistry=(a,r)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(d=>d.filename===r))){let d=r.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:r,displayName:d}),console.log(`[DEBUG] Added ${r} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,r)=>{this.libraryPanel.highlightSlot(a,r)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
1960
+ Are you absolutely sure?`))try{let t=Ft(),i={};for(let[a,r]of Object.entries(t.objects)){let o=r,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[a,r]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=r}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Direct apply failed")}We(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Pi=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new Xt;this.sceneToolsPanel=new Jt;this.nudgePanel=new Zt;this.inspectorPanel=new ui;this.libraryPanel=new St;this.libraryPanelDocked=new St;this.brandVisionPanel=new vi;this.customizeSettingsPanel=new yi;this.configPersistencePanel=new ki;this.loadingScreenPanel=new wi}applyAssetChange(e,t){return br(this,e,t)}resetAsset(e){return vr(this,e)}applySlotAsset(e,t,i){return fi(this,e,t,i)}resetSlotAsset(e,t,i){return yr(this,e,t,i)}startObjectVisuals(){return Lr(this)}stopObjectVisuals(){return kr(this)}shouldRunObjectVisuals(){return xi(this)}updateObjectVisuals(){return Si(this)}getSelectedInstanceId(){return hn(this)}getDisplayObjectById(e){return mn(this,e)}getSelectedObjectConfig(){return Ct(this)}getConfigAnchorWorldPoint(e){return fn(this,e)}getScreenSize(){return bn(this)}ensureBoundsGfx(){return vn(this)}ensureAnchorGfx(){return yn(this)}drawBounds(e){return wn(this,e)}drawAnchor(e){return xn(this,e)}clearBounds(){return Sn(this)}clearAnchor(){return En(this)}clearObjectVisuals(){return At(this)}updateObjectInfo(e){return Et(this,e)}resetDebugConfig(){return Ai(this)}applyDebugConfig(){return Ir(this)}exportDebugConfig(){return Ci(this)}loadObjectConfig(e){return jr(this,e)}fillConfigViewer(e){return Ei(this,e)}copyConfigValues(){return Or(this)}applyObjectConfig(e){return Cn(this,e)}applyCustomizeSettings(e,t){return _r(this,e,t)}scheduleObjectAutoApply(){return zr(this)}setupDebugEventListeners(){return Rr(this)}setupDebugInputListeners(e){return Pn(this,e)}setupPanelLayout(){return Dr(this)}setupCollapsiblePanels(e){return Mn(this,e)}setupRangeInput(e,t,i,n){return fe(this,e,t,i,n)}updateWorkbenchTabs(){return kn(this)}saveWorkbenchState(){return ot(this)}loadWorkbenchState(){return Li(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let a=localStorage.getItem("preview_workbench_state");if(a){let r=JSON.parse(a);r.activeTab&&(this.activeTab=r.activeTab)}}catch(a){console.warn("[PREVIEW] Failed to load workbench tab state",a)}this.sceneObjectsPanel.initialize(e,{onSelect:a=>this.handleObjectSelect(a)}),this.libraryPanel.initialize(e,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,r,o)=>{console.log("[Inspector] Property changed:",a,r,o)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,r)=>this.applyCustomizeSettings(a,r)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:a=>{this.highlightObject=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:a=>{this.highlightAnchor=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(a,r)=>this.nudgeSelectedObject(a,r),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,r)=>{var g,h,m,f,b,v;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((h=l==null?void 0:l.x)!=null?h:0)+a,d=((m=l==null?void 0:l.y)!=null?m:0)+r,{applyConfigOverride:p}=await import("./ConfigOverride-V7DLPL5I.js");p({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:d}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let w=window.__editableConfig,y=(v=(b=(f=w==null?void 0:w.objects)==null?void 0:f.get)==null?void 0:b.call(f,this.selectedObjectId))!=null?v:o;await u(this.selectedObjectId,y)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var p,u,g,h,m;if(!this.selectedObjectId)return;let r=this.getSelectedObjectConfig();if(!r)return;let o=(u=(p=r.transform)==null?void 0:p.scale)!=null?u:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await import("./ConfigOverride-V7DLPL5I.js");c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let f=window.__editableConfig,b=(m=(h=(g=f==null?void 0:f.objects)==null?void 0:g.get)==null?void 0:h.call(g,this.selectedObjectId))!=null?m:r;await d(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let a=window;typeof a.__previewShowLoading=="function"?a.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let a=window;typeof a.__previewHideLoading=="function"?a.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({loading:a}),typeof r.__previewUpdateLoading=="function"?r.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,r,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,r,o,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var r,o;((r=a.detail)==null?void 0:r.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,r,o)=>this.applySlotAsset(a,r,o),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var r;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((r=o==null?void 0:o.engine)==null?void 0:r.splash)||null}return null},window.addAssetToRegistry=(a,r)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(d=>d.filename===r))){let d=r.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:r,displayName:d}),console.log(`[DEBUG] Added ${r} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,r)=>{this.libraryPanel.highlightSlot(a,r)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
1960
1961
  <div class="debug-overlay hidden" id="debug-overlay">
1961
1962
  <div class="debug-workbench" id="debug-workbench">
1962
1963
  <div class="workbench-header" id="workbench-handle">
@@ -2003,7 +2004,7 @@ Are you absolutely sure?`))try{let t=Bt(),i={};for(let[a,r]of Object.entries(t.o
2003
2004
  ${this.sceneToolsPanel.render()}
2004
2005
  ${this.nudgePanel.render()}
2005
2006
  </div>
2006
- `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var o,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let p=this.container.querySelector("#config-pos-x"),u=this.container.querySelector("#config-pos-y");if(p&&u){let g=Number((o=p.value)!=null?o:0),h=Number((l=u.value)!=null?l:0),m=g+e*n,f=h+t*n;p.value=String(m),u.value=String(f),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=new ze;for(let p of i){let u=a(p);if(!u)continue;let g=((d=u.transform)==null?void 0:d.position)||[0,0],h=Array.isArray(g)?g[0]:g.x||0,m=Array.isArray(g)?g[1]:g.y||0,f=h+e*n,b=m+t*n;await r.updateProperty(p,"transform.position",[f,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function zs(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function Ds(s){var n;let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function $s(s){return`
2007
+ `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var o,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let p=this.container.querySelector("#config-pos-x"),u=this.container.querySelector("#config-pos-y");if(p&&u){let g=Number((o=p.value)!=null?o:0),h=Number((l=u.value)!=null?l:0),m=g+e*n,f=h+t*n;p.value=String(m),u.value=String(f),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=new Re;for(let p of i){let u=a(p);if(!u)continue;let g=((d=u.transform)==null?void 0:d.position)||[0,0],h=Array.isArray(g)?g[0]:g.x||0,m=Array.isArray(g)?g[1]:g.y||0,f=h+e*n,b=m+t*n;await r.updateProperty(p,"transform.position",[f,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function Rs(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function Ds(s){var n;let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function $s(s){return`
2007
2008
  Analyze these screenshots of a brand or game and extract its "Brand DNA".
2008
2009
 
2009
2010
  Provide a concise summary (2-3 sentences) covering:
@@ -2020,9 +2021,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
2020
2021
  ${s?`
2021
2022
  ADDITIONAL RULES/NOTES:
2022
2023
  ${s}`:""}
2023
- `.trim()}function $r(){let s=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let r=await zs(a),o=Ds(r),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:o.base64,mimeType:o.mimeType,dataUrl:r};s.push(l),n.push(l)}return n},getSources(){return s.slice()},async analyze(i,n,a){if(s.length===0)throw new Error("No screenshots to analyze.");let r=$s(n),o=s.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await hi(i,r,o,{model:a}),c=e,d=[],p=l.split(`
2024
+ `.trim()}function $r(){let s=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let r=await Rs(a),o=Ds(r),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:o.base64,mimeType:o.mimeType,dataUrl:r};s.push(l),n.push(l)}return n},getSources(){return s.slice()},async analyze(i,n,a){if(s.length===0)throw new Error("No screenshots to analyze.");let r=$s(n),o=s.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await hi(i,r,o,{model:a}),c=e,d=[],p=l.split(`
2024
2025
  `);for(let u of p)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let g=u.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(h=>{d.includes(h.toUpperCase())||d.push(h.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
2025
- Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Ke="handler_api_key_";var ot=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${Ke}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Ke}${e}`,i=localStorage.getItem(t);if(!i)return null;let n=JSON.parse(i);return n.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(n)),this.decryptKey(n.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${Ke}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Ke}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);if(i&&i.startsWith(Ke)){let n=i.substring(Ke.length),a=localStorage.getItem(i);if(a){let r=JSON.parse(a);e.push({service:n,label:r.label,created:r.created,lastUsed:r.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(Ke)&&e.push(i)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let i="handler_preview_salt_2024"+e;return btoa(i)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),i="handler_preview_salt_2024";return t.startsWith(i)?t.substring(i.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},In=()=>ot.getKey("gemini"),jn=(s,e)=>ot.setKey("gemini",s,e),Hs=()=>ot.hasKey("gemini");window.ApiKeyStorage=ot;window.getGeminiApiKey=In;window.setGeminiApiKey=jn;window.hasGeminiApiKey=Hs;var On=class{constructor(){this.modal=null;this.options=null;this.analyzer=$r();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
2026
+ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Ke="handler_api_key_";var lt=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${Ke}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Ke}${e}`,i=localStorage.getItem(t);if(!i)return null;let n=JSON.parse(i);return n.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(n)),this.decryptKey(n.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${Ke}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Ke}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);if(i&&i.startsWith(Ke)){let n=i.substring(Ke.length),a=localStorage.getItem(i);if(a){let r=JSON.parse(a);e.push({service:n,label:r.label,created:r.created,lastUsed:r.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(Ke)&&e.push(i)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let i="handler_preview_salt_2024"+e;return btoa(i)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),i="handler_preview_salt_2024";return t.startsWith(i)?t.substring(i.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},In=()=>lt.getKey("gemini"),jn=(s,e)=>lt.setKey("gemini",s,e),Hs=()=>lt.hasKey("gemini");window.ApiKeyStorage=lt;window.getGeminiApiKey=In;window.setGeminiApiKey=jn;window.hasGeminiApiKey=Hs;var _n=class{constructor(){this.modal=null;this.options=null;this.analyzer=$r();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
2026
2027
  <div class="ai-modal-card">
2027
2028
  <div class="ai-modal-header">
2028
2029
  <div class="ai-modal-actions">
@@ -2103,12 +2104,12 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0
2103
2104
  </div>
2104
2105
  `,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var n;this.currentPrompt=((n=this.promptInput)==null?void 0:n.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",n=>{var o;let a=n.target;switch(a.dataset.action||((o=a.closest("[data-action]"))==null?void 0:o.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",n=>{let a=n.target;if(a.classList.contains("ai-gallery-item")||a.closest(".ai-gallery-item")){let r=a.closest(".ai-gallery-item"),o=parseInt(r.dataset.index||"-1");o>=0&&this.selectImage(o)}}),this.modal.addEventListener("click",n=>{n.target===this.modal&&this.close()}),this.updateGenerateButton()}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var t;let e=(t=this.modal)==null?void 0:t.querySelector("#ai-use-dna");if(e!=null&&e.checked)try{let i=this.analyzer.getResult();if(i!=null&&i.summary&&this.promptInput){let n=`${this.currentPrompt}
2105
2106
 
2106
- Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let a=this.getApiKey();if(!a){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let r=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await gi(this.options.currentValue);c&&(r=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let o=await rt(a,this.currentPrompt,r,{aspectRatio:"1:1"}),l=await at(o);this.generatedImages.push(l||o),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(a){console.error("[AiEditorModal] Generation failed:",a),alert(`Generation failed: ${a instanceof Error?a.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(n=this.previewEl)==null||n.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,i)=>`
2107
+ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let a=this.getApiKey();if(!a){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let r=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await gi(this.options.currentValue);c&&(r=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let o=await st(a,this.currentPrompt,r,{aspectRatio:"1:1"}),l=await rt(o);this.generatedImages.push(l||o),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(a){console.error("[AiEditorModal] Generation failed:",a),alert(`Generation failed: ${a instanceof Error?a.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(n=this.previewEl)==null||n.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,i)=>`
2107
2108
  <div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
2108
2109
  <img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
2109
2110
  <div class="ai-gallery-label">#${i+1}</div>
2110
2111
  </div>
2111
- `).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=In();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return jn(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},_n=null;window.__openAiEditor=function(s,e,t,i){_n||(_n=new On),_n.open({objectId:s,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let a=window.updateManager;if(a)a.updateProperty(s,i.path,n);else{let r=window.getEditableObjectConfig,o=r==null?void 0:r(s);if(o){let l=i.path.split("."),c=o;for(let d=0;d<l.length-1;d++)c[l[d]]||(c[l[d]]={}),c=c[l[d]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var Rn=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
2112
+ `).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=In();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return jn(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},On=null;window.__openAiEditor=function(s,e,t,i){On||(On=new _n),On.open({objectId:s,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let a=window.updateManager;if(a)a.updateProperty(s,i.path,n);else{let r=window.getEditableObjectConfig,o=r==null?void 0:r(s);if(o){let l=i.path.split("."),c=o;for(let d=0;d<l.length-1;d++)c[l[d]]||(c[l[d]]={}),c=c[l[d]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var zn=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
2112
2113
  <div class="asset-preview-card">
2113
2114
  <div class="asset-preview-header">
2114
2115
  <div class="asset-preview-title">${n}</div>
@@ -2135,7 +2136,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2135
2136
  <source src="${n}" type="audio/wav">
2136
2137
  Your browser does not support the audio element.
2137
2138
  </audio>
2138
- `;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(s){new Rn().open(s)};var zn=class{constructor(){this.modal=null;this.canvas=null;this.ctx=null;this.image=null;this.options=null;this.cropX=0;this.cropY=0;this.cropWidth=100;this.cropHeight=100;this.scale=1;this.panX=0;this.panY=0;this.isDragging=!1;this.dragStartX=0;this.dragStartY=0;this.lastPanX=0;this.lastPanY=0}open(e){this.options=e,this.createModal(),this.loadImage(),document.body.appendChild(this.modal)}createModal(){let e=document.createElement("div");e.className="asset-crop-modal",e.innerHTML=`
2139
+ `;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(s){new zn().open(s)};var Rn=class{constructor(){this.modal=null;this.canvas=null;this.ctx=null;this.image=null;this.options=null;this.cropX=0;this.cropY=0;this.cropWidth=100;this.cropHeight=100;this.scale=1;this.panX=0;this.panY=0;this.isDragging=!1;this.dragStartX=0;this.dragStartY=0;this.lastPanX=0;this.lastPanY=0}open(e){this.options=e,this.createModal(),this.loadImage(),document.body.appendChild(this.modal)}createModal(){let e=document.createElement("div");e.className="asset-crop-modal",e.innerHTML=`
2139
2140
  <div class="asset-crop-card">
2140
2141
  <div class="asset-crop-header">
2141
2142
  <div>
@@ -2186,7 +2187,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2186
2187
  <button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
2187
2188
  </div>
2188
2189
  </div>
2189
- `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,r=Math.min(n,a),o=this.cropWidth*r,l=this.cropHeight*r,c=(i-o)/2,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(s){new zn().open(s)};import{Application as po,Container as lt,Graphics as Je,Point as re,Rectangle as uo,Text as go,TextStyle as ho}from"pixi.js";import{Sprite as Ns,Container as Hr}from"pixi.js";var Fs=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Dn=Fs;if(typeof window!="undefined")try{let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);e!=null&&e.buildMode&&(Dn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${Dn}`))}}catch{}function Bs(s){var t,i,n,a,r;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(s);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(s))return{x:(t=s[0])!=null?t:.5,y:(i=s[1])!=null?i:.5};if(s&&typeof s=="object"&&"x"in s&&"y"in s)return{x:(n=s.x)!=null?n:.5,y:(a=s.y)!=null?a:.5};if(typeof s=="string"){let o=s.trim().toLowerCase();return(r=e[o])!=null?r:{x:.5,y:.5}}return null}var xe=class{static async create(e,t,i){var l,c,d,p,u,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${Dn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let m=new Hr;return this.applyTransform(m,t==null?void 0:t.transform,t),m}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let r=await Ki.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=r==null?void 0:r.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",r,"for object:",e),o=new Ns(r),console.log("[ObjectFactory] Created object:",o,"type:",(p=o==null?void 0:o.constructor)==null?void 0:p.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=r==null?void 0:r.constructor)==null?void 0:u.name,r),r&&(((g=r.constructor)==null?void 0:g.name)==="Container"||r instanceof Hr)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let m=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],f=!1;for(let b of m)try{let v=await fetch(b);if(v.ok){o=await v.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=o==null?void 0:o.constructor)==null?void 0:h.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=r)}else o=r;else o=r,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,a,r,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((r=t.position.x)!=null?r:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=Bs(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};import{Graphics as Us,Point as Gs}from"pixi.js";var ke={width:400,height:600,designWidth:400,scaleFactor:1},Ii={scale:1,position:1},ji=[];function qs(s,e,t,i,n,a,r){ji.push({element:s,originalScale:a,positionHelper:e,heightPercent:n}),e(s,t,i,n,a,r,!1)}function Vs(){ji.forEach(({element:s,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*ke.scaleFactor;t(s,ke.width,ke.height,i,n,!0,!1)})}function Ws(){ji.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function $n(s,e){console.log(`[SCREEN] updateScreenState called: ${s}x${e}`),ke.width=s,ke.height=e,ke.scaleFactor=Math.min(s/ke.designWidth,1.15),Ii.scale=ke.scaleFactor,Ii.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Ii.scale.toFixed(3)}`),Vs()}var B={layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}};function Ys(s,e,t){let i=B[s];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${s}.${e} = ${t}`))}function Ks(){return B}var Xs={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Mi(s,e){return typeof s=="number"&&Number.isFinite(s)?s:e}function He(s,e={x:.5,y:.5}){var t;if(Array.isArray(s))return{x:Mi(s[0],e.x),y:Mi(s[1],e.y)};if(s&&typeof s=="object"){let i=s;return{x:Mi(i.x,e.x),y:Mi(i.y,e.y)}}if(typeof s=="string"){let i=s.trim().toLowerCase();return(t=Xs[i])!=null?t:e}return e}function Ne(s,e,t,i={}){var g,h,m,f,b,v;let n=He(t),a=(g=i.inset)!=null?g:{},r=(h=i.padding)!=null?h:{x:0,y:0},o=((m=a.left)!=null?m:0)+r.x,l=((f=a.right)!=null?f:0)+r.x,c=((b=a.top)!=null?b:0)+r.y,d=((v=a.bottom)!=null?v:0)+r.y,p=Math.max(0,s-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function Fe(s,e,t,i={}){var m,f,b,v,w,y;let n=(m=i.inset)!=null?m:{},a=(f=i.padding)!=null?f:{x:0,y:0},r=((b=n.left)!=null?b:0)+a.x,o=((v=n.right)!=null?v:0)+a.x,l=((w=n.top)!=null?w:0)+a.y,c=((y=n.bottom)!=null?y:0)+a.y,d=Math.max(0,s-r-o),p=Math.max(0,e-l-c),u=He(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:r+d*g,y:l+p*h}}function Hn(s,e,t,i={}){var d,p,u;if(!s)return;let n=i.positionRatio?Fe(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Ne(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(d=i.offset)!=null?d:{x:0,y:0},r=n.x+a.x,o=n.y+a.y;s.anchor&&i.renderAnchor&&s.anchor.set(i.renderAnchor.x,i.renderAnchor.y),be(s,r,o);let l=(p=i.scale)!=null?p:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&Se(s,l*c)}if(typeof window!="undefined"){let s=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==s||n!==e)&&(s=i,e=n,$n(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),$n(window.innerWidth,window.innerHeight),window.updateDebugConfig=Ys,window.getDebugConfig=Ks,window.copyConfig=oo,window.applyConfig=Tt,window.applyConfigForRatio=lo,window.positionAtBottom=Nr,window.positionAtTop=Qs,window.positionAtCenter=eo,window.positionAtLeft=to,window.positionAtRight=io,window.positionAtBottomLeft=no,window.positionAtBottomRight=ao,window.positionAtTopLeft=ro,window.positionAtTopRight=so,window.applyPositionContract=Zs,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function _i(s,e,t=0){return s*e+t}function Oi(s,e,t=0){return s*(1-e)+t}function Ri(s,e,t=0){return s*e+t}function zi(s,e,t=0){return s*(1-e)+t}function ge(s,e=0){return s/2+e}function Js(s,e){return s*e}function Zs(s,e,t,i){var r,o,l,c,d,p,u,g,h,m,f,b,v,w,y,x,M,j,L,_;let n=0,a=0;switch(i.type){case"top":n=ge(e,(o=(r=i.offset)==null?void 0:r.x)!=null?o:0),a=_i(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ge(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=Oi(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Ri(e,i.percent,(m=(h=i.offset)==null?void 0:h.x)!=null?m:0),a=ge(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":n=zi(e,i.percent,(w=(v=i.offset)==null?void 0:v.x)!=null?w:0),a=ge(t,(x=(y=i.offset)==null?void 0:y.y)!=null?x:0);break;case"center":n=ge(e,(j=(M=i.offset)==null?void 0:M.x)!=null?j:0),a=ge(t,(_=(L=i.offset)==null?void 0:L.y)!=null?_:0);break}s.position?s.position.set(n,a):(s.x=n,s.y=a),i.scale!==void 0&&i.scale!==1&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(i.scale,i.scale):(s.scale.x=i.scale,s.scale.y=i.scale))}function Nr(s,e,t,i=.2,n=1,a=!0,r=!1){let o=Js(t,i),l=Oi(t,i/2);be(s,ge(e),l);let c=a?n*ke.scaleFactor:n;Se(s,c),r&&!ji.find(d=>d.element===s)&&qs(s,Nr,e,t,i,n,a)}function Qs(s,e,t,i=.1,n=1){be(s,ge(e),_i(t,i)),Se(s,n)}function eo(s,e,t,i=0,n=0,a=1){be(s,ge(e,i),ge(t,n)),Se(s,a)}function to(s,e,t,i=.1,n=1){be(s,Ri(e,i),ge(t)),Se(s,n)}function io(s,e,t,i=.1,n=1){be(s,zi(e,i),ge(t)),Se(s,n)}function no(s,e,t,i=.05,n=.05,a=1){be(s,Ri(e,n),Oi(t,i)),Se(s,a)}function ao(s,e,t,i=.05,n=.05,a=1){be(s,zi(e,n),Oi(t,i)),Se(s,a)}function ro(s,e,t,i=.05,n=.05,a=1){be(s,Ri(e,n),_i(t,i)),Se(s,a)}function so(s,e,t,i=.05,n=.05,a=1){be(s,zi(e,n),_i(t,i)),Se(s,a)}function be(s,e,t){s&&s.position?typeof s.position.set=="function"?s.position.set(e,t):(s.position.x=e,s.position.y=t):s&&(s.x=e,s.y=t)}function Se(s,e){e!==1&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(e,e):s.scale.x!==void 0&&s.scale.y!==void 0&&(s.scale.x=e,s.scale.y=e))}var Xe={default:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}},wide:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.9,screen_scale_y:1.1},engine:{scale:1,background_scale:1.1,background_offset_y:0,background_alpha:.95,label_pulse_speed:3,label_pulse_intensity:.03}},square:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.85,screen_scale_y:.85},engine:{scale:1,background_scale:1,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}},tall:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1.1,screen_scale_y:.9},engine:{scale:1,background_scale:.95,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}}};function oo(s){return s&&Xe[s]?JSON.parse(JSON.stringify(Xe[s])):JSON.parse(JSON.stringify(B))}function Tt(s){Object.keys(s).forEach(e=>{let t=e;B[t]&&s[t]&&Object.assign(B[t],s[t])}),console.log("Config applied:",s)}function lo(s,e){let t=s/e;t>1.6?(Tt(Xe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Tt(Xe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Tt(Xe.square),console.log("Applied SQUARE config for ratio:",t)):(Tt(Xe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let s=window;s.configPresets=Xe,s.resolveAnchorVec2=s.resolveAnchorVec2||He,s.resolveScreenAnchorPoint=s.resolveScreenAnchorPoint||Ne,s.resolveScreenRatioPoint=s.resolveScreenRatioPoint||Fe}var oe=null;function co(s,e,t,i,n,a={}){var I,P,R,D,N,H,F,G,Y,Q,ie,le,$,Z,ce,he,de,ve,Ce,Te,q,ee,K,ae,_e,Ge,ca,da,pa,ua,ga,ha,ma,fa;let r=(I=a.enableDebugLogs)!=null?I:!1;r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== STARTING LAYOUT CALCULATION ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Screen dimensions:",{width:i.width,height:i.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Time:",t),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Options:",a));let{mainContainer:o,label:l,background:c,backgroundTexture:d,app:p}=s;if(!p||!p.renderer){r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] App renderer dimensions:",{width:p.renderer.width,height:p.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:p.screen.width,height:p.screen.height}));let u=i.width,g=i.height;r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:u,baseHeight:g});let h=u*B.layout.screen_scale_x,m=g*B.layout.screen_scale_y,f=u/2,b=e.engine.runtime||{},v=b.layout||{};r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:B.layout.screen_scale_x,screen_scale_y:B.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:h,height:m,midX:f}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",v));let w=v.design_width_portrait||400,y=h/w;y=Math.min(y,1.15);let x=y*((P=B.engine.scale)!=null?P:1),M=(R=a.skipMainContainerTransform)!=null?R:!1;!M&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(x):(o.scale.x=x,o.scale.y=x));let j=(D=v.main_container_anchor)!=null?D:"center",L=(N=v.main_container_position_ratio)!=null?N:{x:.5,y:.5},_=(H=v.main_container_offset)!=null?H:{x:0,y:0},O=v.main_container_position_ratio?Fe(u,g,L):Ne(u,g,j),T=O.x+_.x+B.layout.position_offset.x,A=O.y+_.y+B.layout.position_offset.y;if(!M&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(T,A):(o.position.x=T,o.position.y=A)),n&&(o!=null&&o.toLocal))for(let[se,ne]of e.objects.entries()){let V=ne==null?void 0:ne.transform;if(!V||((F=V.position_mode)!=null?F:"static")!=="static")continue;let U=(G=n.get)==null?void 0:G.call(n,se),ye=((Y=U==null?void 0:U.getDisplayObject)==null?void 0:Y.call(U))||(U==null?void 0:U.pixiObject)||U;if(!ye||ye.parent!==o)continue;let $t=V.position_ratio!=null?Fe(u,g,V.position_ratio):Ne(u,g,(Q=V.anchor)!=null?Q:"center"),Ht=o.toLocal(new Gs($t.x,$t.y)),Nt=(ie=V.position)!=null?ie:{x:0,y:0},qe=Ht.x+Nt.x,Yi=Ht.y+Nt.y;typeof(U==null?void 0:U.setPosition)=="function"?U.setPosition(qe,Yi):(be(ye,qe,Yi),(le=U==null?void 0:U.transform)!=null&&le.position&&(U.transform.position.x=qe,U.transform.position.y=Yi))}let k=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,E=((k==null?void 0:k.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(B.layout.debug_rect_visible&&E){(!oe||oe.parent!==p.stage)&&(oe==null||oe.destroy(),oe=new Us,oe.zIndex=9999,p.stage.addChild(oe)),oe.clear();let se=B.layout.debug_rect_scale_x,ne=B.layout.debug_rect_scale_y,V=(u-4)*se,Oe=(g-4)*ne,U=(u-V)/2,ye=(g-Oe)/2;r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:u,baseHeight:g,rectW:V,rectH:Oe,offsetX:U,offsetY:ye}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+U,y:2+ye,width:V,height:Oe})),oe.rect(2+U,2+ye,V,Oe).stroke({width:B.layout.debug_rect_thickness,color:B.layout.debug_rect_color})}else oe&&(oe.destroy(),oe=null);let S=(($=s.label)==null?void 0:$.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&S){let se=(ce=(Z=S==null?void 0:S.transform)==null?void 0:Z.anchor)!=null?ce:"center",ne=(he=S==null?void 0:S.transform)==null?void 0:he.position_ratio,V=((de=S==null?void 0:S.transform)==null?void 0:de.offset)||{x:0,y:0};Hn(l,u,g,{anchor:se,positionRatio:ne,offset:{x:V.x*x,y:V.y*x},renderAnchor:He(se)})}if(l&&l.alpha>0){let se=1+Math.sin(t*B.engine.label_pulse_speed)*B.engine.label_pulse_intensity,ne=(Ce=(ve=S==null?void 0:S.transform)==null?void 0:ve.scale)!=null?Ce:1,V=se*x*ne;l.scale&&(typeof l.scale.set=="function"?l.scale.set(V):(l.scale.x=V,l.scale.y=V))}if(r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING ====="),c){r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(Te=c.constructor)==null?void 0:Te.name)),c.alpha=((ee=(q=b.background)==null?void 0:q.alpha)!=null?ee:.98)*B.engine.background_alpha,r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let se=e.objects.get("background_1");r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",se);let ne=(se==null?void 0:se.transform)||{};r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ne);let V=ne.offset||{x:0,y:0},Oe=((ae=(K=b.background)==null?void 0:K.offset_y)!=null?ae:0)+B.engine.background_offset_y,U=(_e=ne.anchor)!=null?_e:"center",ye=ne.position_ratio;if(r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:V,bgRuntimeOffsetY:Oe,bgScreenAnchor:U,bgPositionRatio:ye,baseWidth:u,baseHeight:g,finalScale:x}),Hn(c,u,g,{anchor:U,positionRatio:ye,offset:{x:V.x*x,y:V.y*x+Oe},renderAnchor:He(U)}),r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(Ge=c.scale)==null?void 0:Ge.x,scaleY:(ca=c.scale)==null?void 0:ca.y,anchorX:(da=c.anchor)==null?void 0:da.x,anchorY:(pa=c.anchor)==null?void 0:pa.y,pivotX:(ua=c.pivot)==null?void 0:ua.x,pivotY:(ga=c.pivot)==null?void 0:ga.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:d==null?void 0:d.width,textureHeight:d==null?void 0:d.height})),d){let $t=Math.max(h/d.width,m/d.height),Ht=(ma=(ha=b.background)==null?void 0:ha.scale_multiplier)!=null?ma:1.05,Nt=(fa=ne.scale)!=null?fa:1,qe=$t*Ht*B.engine.background_scale*Nt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(qe):(c.scale.x=qe,c.scale.y=qe))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-h/2,-m/2,h,m).fill({color:1444375}))}}var Di=class{constructor(e){this.app=null;this.camera=new lt;this.mainContainer=new lt;this.gizmoLayer=new lt;this.screenFrame=new Je;this.objectMap=new Map;this.selectedId=null;this.dragMode=null;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotationDeg=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.gizmoOutline=new Je;this.moveHandle=new Je;this.scaleHandle=new Je;this.rotateHandle=new Je;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.updateLayout({width:t,height:i}),this.updateGizmos(),this.syncFromConfig())};this.handleActiveScreenChanged=()=>{this.isVisible&&this.syncFromConfig()};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.objectId,n=t.objectIds;if(i){this.syncFromConfig([i]);return}if(Array.isArray(n)&&n.length>0){this.syncFromConfig(n);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onDragMove=e=>{if(!this.dragMode||!this.selectedId||!this.app)return;let t=this.objectMap.get(this.selectedId);if(!t)return;let i=this.getPointerInCamera(e.clientX,e.clientY);if(!(!i||!this.dragStartPointer||!this.dragStartPos)){if(this.dragMode==="move"){let n=i.x-this.dragStartPointer.x,a=i.y-this.dragStartPointer.y,r=this.dragStartPos.x+n,o=this.dragStartPos.y+a;t.displayObject.position.set(r,o),this.updateLiveConfigPosition(r,o)}else if(this.dragMode==="scale"){let n=new re(this.dragStartPos.x,this.dragStartPos.y),a=Math.max(1,this.distance(i,n)),r=Math.max(.05,this.dragStartScale*(a/this.dragStartDistance));t.displayObject.scale.set(r),this.updateLiveConfigScale(r)}else if(this.dragMode==="rotate"){let n=new re(this.dragStartPos.x,this.dragStartPos.y),r=Math.atan2(i.y-n.y,i.x-n.x)-this.dragStartAngle,o=this.dragStartRotationDeg+r*180/Math.PI;t.displayObject.rotation=o*Math.PI/180,this.updateLiveConfigRotation(o)}this.updateGizmos(),this.queueLiveApply(this.selectedId)}};this.onDragEnd=()=>{var i,n,a,r,o,l,c;if(!this.dragMode||!this.selectedId)return;let e=this.selectedId,t=this.getEditableObjectConfig(e);if(t){let d=(i=t.transform)!=null?i:{};if(t.transform||(t.transform=d),this.dragMode==="move"&&this.dragStartValue){let p=d.position,u=Array.isArray(p)?[Number((n=p[0])!=null?n:0),Number((a=p[1])!=null?a:0)]:{x:Number((r=p==null?void 0:p.x)!=null?r:0),y:Number((o=p==null?void 0:p.y)!=null?o:0)};this.applyFinalOverride(e,"transform.position",u,this.dragStartValue)}else this.dragMode==="scale"?this.applyFinalOverride(e,"transform.scale",(l=d.scale)!=null?l:1,this.dragStartValue):this.dragMode==="rotate"&&this.applyFinalOverride(e,"transform.rotation",(c=d.rotation)!=null?c:0,this.dragStartValue);this.queueLiveApply(e)}window.dispatchEvent(new CustomEvent("inspector:refresh")),this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd)};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i));this.cameraScale=n,this.camera.scale.set(n),this.hasUserCamera=!0,this.updateGizmos()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(!this.isPanning||!this.panStart||!this.panStartCamera)return;let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i)};this.onPanEnd=()=>{this.isPanning=!1,this.panStart=null,this.panStartCamera=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new po,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.screenFrame),this.camera.addChild(this.mainContainer),this.camera.addChild(this.gizmoLayer),this.screenFrame.zIndex=-1,this.screenFrame.eventMode="none",this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.gizmoOutline.eventMode="none",this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.refresh(),!this.isVisible&&this.app.ticker&&this.app.ticker.stop())}destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("preview:select",this.handlePreviewSelect),this.app&&(this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,!(!this.app||!this.app.ticker)&&(e?(this.app.ticker.start(),this.refresh()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("preview:select",this.handlePreviewSelect),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.moveHandle.eventMode="static",this.moveHandle.cursor="move",this.scaleHandle.eventMode="static",this.scaleHandle.cursor="nwse-resize",this.rotateHandle.eventMode="static",this.rotateHandle.cursor="crosshair",this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t))}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos())}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let r=this.getEditableObjectConfig(a);if(!r){this.removeObject(a);continue}await this.upsertObject(a,r)}this.updateGizmos()}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e);if(!n||n.assetKey!==i){n&&this.removeObject(e);let r=await this.createDisplayObject(e,t);if(!r)return;this.mainContainer.addChild(r),this.objectMap.set(e,{id:e,displayObject:r,assetKey:i}),this.attachObjectInteraction(r,e)}let a=this.objectMap.get(e);a&&(this.applyVisualConfig(a.displayObject,t),this.updateObjectTransform(a.displayObject,t))}async createDisplayObject(e,t){var o,l,c,d,p,u,g,h,m,f,b,v,w,y,x;if((o=t==null?void 0:t.render)!=null&&o.asset)try{if(((c=(l=t==null?void 0:t.render)==null?void 0:l.asset)==null?void 0:c.type)!=="json"){let j=await xe.create(e,t,this.app);if(j instanceof lt)return j}}catch(M){console.warn("[SceneEditor] ObjectFactory failed for",e,M)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let M=this.getScreen(),j=(p=M==null?void 0:M.width)!=null?p:0,L=(u=M==null?void 0:M.height)!=null?u:0,_=new Je,O=this.parseColor(n.background_color,0),T=typeof n.background_alpha=="number"?n.background_alpha:1;j>0&&L>0&&_.rect(0,0,j,L).fill({color:O,alpha:T});let A=new lt;return A.addChild(_),A}if(a){let M=(h=(g=i==null?void 0:i.color)!=null?g:n==null?void 0:n.tint)!=null?h:"#ffffff",j=new ho({fontFamily:"Arial, sans-serif",fontSize:(m=i==null?void 0:i.fontSize)!=null?m:16,fill:M,align:(f=i==null?void 0:i.align)!=null?f:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new go({text:(v=i==null?void 0:i.text)!=null?v:"",style:j})}if((w=t==null?void 0:t.effects)!=null&&w.width||(y=t==null?void 0:t.effects)!=null&&y.height){let M=new Je,j=typeof t.effects.width=="number"?t.effects.width:100,L=typeof t.effects.height=="number"?t.effects.height:100,_=(x=t.effects.fill_color)!=null?x:"#ffffff",O=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,T=Number.parseInt(String(_).replace("#",""),16);return M.rect(0,0,j,L).fill({color:Number.isFinite(T)?T:16777215,alpha:O}),M}return new lt}attachObjectInteraction(e,t){if(e){if(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function"){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=i)}e.on("pointerdown",i=>{this.getPointerButton(i)===0&&(this.setSelected(t),this.startDrag("move",i))})}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}applyVisualConfig(e,t){var r,o,l,c,d,p,u;if(!e)return;let i=(r=t==null?void 0:t.render)!=null?r:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n=(d=(c=(o=t==null?void 0:t.render)==null?void 0:o.anchor)!=null?c:(l=t==null?void 0:t.transform)==null?void 0:l.anchor)!=null?d:"center",a=He(n,{x:.5,y:.5});if((p=e.anchor)!=null&&p.set)e.anchor.set(a.x,a.y);else if(e.pivot){let g=(u=e.getLocalBounds)==null?void 0:u.call(e);g&&e.pivot.set(g.width*a.x,g.height*a.y)}}updateObjectTransform(e,t){var l;if(!e)return;let i=(l=t==null?void 0:t.transform)!=null?l:{},n=this.getAnchorLocalPoint(i),a=this.getPositionOffset(i);n&&e.position.set(n.x+a.x,n.y+a.y);let r=typeof i.scale=="number"?i.scale:void 0;typeof r=="number"&&e.scale&&e.scale.set(r);let o=typeof i.rotation=="number"?i.rotation:0;typeof e.rotation=="number"&&(e.rotation=o*Math.PI/180)}getAnchorLocalPoint(e){var a;let t=this.getScreen();if(!(t!=null&&t.width)||!(t!=null&&t.height))return null;let i=(e==null?void 0:e.position_ratio)!=null?Fe(t.width,t.height,e.position_ratio):Ne(t.width,t.height,(a=e==null?void 0:e.anchor)!=null?a:"center"),n=new re;return this.mainContainer.toLocal(new re(i.x,i.y),void 0,n),n}getPositionOffset(e){var l,c,d,p,u,g,h,m;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset,n=Array.isArray(t)?Number((l=t[0])!=null?l:0):Number((c=t==null?void 0:t.x)!=null?c:0),a=Array.isArray(t)?Number((d=t[1])!=null?d:0):Number((p=t==null?void 0:t.y)!=null?p:0),r=Array.isArray(i)?Number((u=i[0])!=null?u:0):Number((g=i==null?void 0:i.x)!=null?g:0),o=Array.isArray(i)?Number((h=i[1])!=null?h:0):Number((m=i==null?void 0:i.y)!=null?m:0);return{x:n+r,y:a+o}}updateLayout(e){var m,f,b,v,w,y,x,M;let t=e!=null?e:this.getScreen();if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let n=(((f=(m=this.getEditableConfig())==null?void 0:m.engine)==null?void 0:f.runtime)||{}).layout||{},a=t.width*((b=B.layout.screen_scale_x)!=null?b:1),r=n.design_width_portrait||400,o=a/r;o=Math.min(o,1.15);let l=o*((v=B.engine.scale)!=null?v:1);this.mainContainer.scale.set(l);let c=(w=n.main_container_anchor)!=null?w:"center",d=(y=n.main_container_position_ratio)!=null?y:{x:.5,y:.5},p=(x=n.main_container_offset)!=null?x:{x:0,y:0},u=n.main_container_position_ratio?Fe(t.width,t.height,d):Ne(t.width,t.height,c),g=u.x+p.x+B.layout.position_offset.x,h=u.y+p.y+B.layout.position_offset.y;this.mainContainer.position.set(g,h),this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),(M=this.app)!=null&&M.stage&&(this.app.stage.hitArea=new uo(0,0,t.width,t.height)),this.hasUserCamera||this.centerCamera()}centerCamera(){if(!this.app)return;let e=this.getScreen(),t=this.app.renderer.width,i=this.app.renderer.height;this.cameraScale=1,this.camera.scale.set(this.cameraScale),this.camera.position.set((t-e.width)/2,(i-e.height)/2)}updateGizmos(){var d,p;if(!this.selectedId||!this.isVisible){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(p=(d=e.displayObject).getBounds)==null?void 0:p.call(d);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new re(t.x,t.y)),n=this.camera.toLocal(new re(t.x+t.width,t.y+t.height)),a=n.x-i.x,r=n.y-i.y,o=i.x+a/2,l=i.y+r/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,r),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});let c=10;this.moveHandle.clear(),this.moveHandle.circle(0,0,c/2),this.moveHandle.fill({color:16752394,alpha:.9}),this.moveHandle.position.set(o,l),this.scaleHandle.clear(),this.scaleHandle.rect(-c/2,-c/2,c,c),this.scaleHandle.fill({color:3900150,alpha:.9}),this.scaleHandle.position.set(n.x,n.y),this.rotateHandle.clear(),this.rotateHandle.circle(0,0,c/2),this.rotateHandle.fill({color:1096065,alpha:.9}),this.rotateHandle.position.set(o,i.y-20)}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}setSelected(e,t={}){if(this.selectedId!==e&&(this.selectedId=e,this.updateGizmos(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var d,p;if(!this.selectedId||!e||!this.app||this.getPointerButton(t)!==0)return;let n=this.objectMap.get(this.selectedId);if(!n)return;let a=this.getEventLocalPoint(t);if(!a)return;let r=n.displayObject;this.dragMode=e,this.dragStartPointer=new re(a.x,a.y),this.dragStartPos=new re(r.position.x,r.position.y),this.dragStartScale=typeof((d=r.scale)==null?void 0:d.x)=="number"?r.scale.x:1;let o=this.getEditableObjectConfig(this.selectedId),l=(p=o==null?void 0:o.transform)!=null?p:{};this.dragStartRotationDeg=typeof l.rotation=="number"?l.rotation:0,this.dragAnchorLocal=this.getAnchorLocalPoint(l),this.dragStartValue=this.getDragStartValue(e,l);let c=new re(r.position.x,r.position.y);this.dragStartAngle=Math.atan2(a.y-c.y,a.x-c.x),this.dragStartDistance=Math.max(1,this.distance(a,c)),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPosition(e,t){var p,u,g,h,m,f;if(!this.selectedId||!this.dragAnchorLocal)return;let i=e-this.dragAnchorLocal.x,n=t-this.dragAnchorLocal.y,a=this.getEditableObjectConfig(this.selectedId);if(!a)return;let r=(p=a.transform)!=null?p:{};a.transform||(a.transform=r);let o=(u=r.offset)!=null?u:{x:0,y:0},l=Array.isArray(o)?Number((g=o[0])!=null?g:0):Number((h=o==null?void 0:o.x)!=null?h:0),c=Array.isArray(o)?Number((m=o[1])!=null?m:0):Number((f=o==null?void 0:o.y)!=null?f:0),d=this.buildPositionValue(r,{x:i-l,y:n-c});this.setNestedValue(r,"position",d)}updateLiveConfigScale(e){var n;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(n=t.transform)!=null?n:{};t.transform||(t.transform=i),i.scale=e}updateLiveConfigRotation(e){var n;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(n=t.transform)!=null?n:{};t.transform||(t.transform=i),i.rotation=e}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),Ve({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&n(t,i)}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let r=0;r<n.length-1;r+=1){let o=n[r];(!a[o]||typeof a[o]!="object")&&(a[o]={}),a=a[o]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position;return Array.isArray(i)?[t.x,t.y]:{x:t.x,y:t.y}}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerButton(e){var t,i,n;return typeof(e==null?void 0:e.button)=="number"?e.button:typeof((t=e==null?void 0:e.data)==null?void 0:t.button)=="number"?e.data.button:typeof((n=(i=e==null?void 0:e.data)==null?void 0:i.originalEvent)==null?void 0:n.button)=="number"?e.data.originalEvent.button:0}getEventLocalPoint(e){var n,a;if(!this.app)return null;if(typeof(e==null?void 0:e.getLocalPosition)=="function"){let r=e.getLocalPosition(this.camera);return new re(r.x,r.y)}let t=(a=e==null?void 0:e.global)!=null?a:(n=e==null?void 0:e.data)==null?void 0:n.global;if(!t)return null;let i=new re;return this.camera.toLocal(new re(t.x,t.y),void 0,i),i}getPointerInCamera(e,t){if(!this.app)return null;let i=this.app.canvas.getBoundingClientRect(),n=(e-i.left)*(this.app.renderer.width/i.width),a=(t-i.top)*(this.app.renderer.height/i.height),r=new re;return this.camera.toLocal(new re(n,a),void 0,r),r}parseColor(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let i=e.trim().replace("#",""),n=Number.parseInt(i,16);if(Number.isFinite(n))return n}return t}};var Nn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[nt("playable-portrait"),nt("iphone-14"),nt("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=nt(e.defaultDevice||on.id),this.debugPanel=new Pi,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let t=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=t===null?!0:t==="true"}catch{}this.sceneEditor=new Di({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=nt(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),this.updateSceneVisibility(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let d=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:d})},r=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",r),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",r),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,r=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,d=Math.max(200,Math.min(600,a+c));e.style.width=`${d}px`;let p=this.container.querySelector(".preview-main");if(p){let g=i==="left"?`${d}px`:p.style.gridTemplateColumns.split(" ")[0]||"300px",h=i==="right"?`${d}px`:p.style.gridTemplateColumns.split(" ")[2]||"350px";p.style.gridTemplateColumns=`${g} 1fr ${h}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&Ye(this.scenePane,e,i!=null?i:this.previewContainer),t&&Ti(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let r=a.clientX,o=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=p=>{let u=p.clientX-r,g=Math.max(240,Math.min(l,o+u));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
2190
+ `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,r=Math.min(n,a),o=this.cropWidth*r,l=this.cropHeight*r,c=(i-o)/2,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(s){new Rn().open(s)};import{Application as po,Container as Je,Graphics as Ze,Point as re,Rectangle as uo,Text as go,TextStyle as ho}from"pixi.js";import{Sprite as Ns,Container as Hr}from"pixi.js";var Bs=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Dn=Bs;if(typeof window!="undefined")try{let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);e!=null&&e.buildMode&&(Dn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${Dn}`))}}catch{}function Fs(s){var t,i,n,a,r;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(s);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(s))return{x:(t=s[0])!=null?t:.5,y:(i=s[1])!=null?i:.5};if(s&&typeof s=="object"&&"x"in s&&"y"in s)return{x:(n=s.x)!=null?n:.5,y:(a=s.y)!=null?a:.5};if(typeof s=="string"){let o=s.trim().toLowerCase();return(r=e[o])!=null?r:{x:.5,y:.5}}return null}var xe=class{static async create(e,t,i){var l,c,d,p,u,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${Dn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let m=new Hr;return this.applyTransform(m,t==null?void 0:t.transform,t),m}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let r=await Ki.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=r==null?void 0:r.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",r,"for object:",e),o=new Ns(r),console.log("[ObjectFactory] Created object:",o,"type:",(p=o==null?void 0:o.constructor)==null?void 0:p.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=r==null?void 0:r.constructor)==null?void 0:u.name,r),r&&(((g=r.constructor)==null?void 0:g.name)==="Container"||r instanceof Hr)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let m=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],f=!1;for(let b of m)try{let v=await fetch(b);if(v.ok){o=await v.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=o==null?void 0:o.constructor)==null?void 0:h.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=r)}else o=r;else o=r,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,a,r,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((r=t.position.x)!=null?r:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=Fs(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};import{Graphics as Us,Point as Gs}from"pixi.js";var ke={width:400,height:600,designWidth:400,scaleFactor:1},Ii={scale:1,position:1},ji=[];function qs(s,e,t,i,n,a,r){ji.push({element:s,originalScale:a,positionHelper:e,heightPercent:n}),e(s,t,i,n,a,r,!1)}function Vs(){ji.forEach(({element:s,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*ke.scaleFactor;t(s,ke.width,ke.height,i,n,!0,!1)})}function Ws(){ji.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function $n(s,e){console.log(`[SCREEN] updateScreenState called: ${s}x${e}`),ke.width=s,ke.height=e,ke.scaleFactor=Math.min(s/ke.designWidth,1.15),Ii.scale=ke.scaleFactor,Ii.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Ii.scale.toFixed(3)}`),Vs()}var F={layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}};function Ys(s,e,t){let i=F[s];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${s}.${e} = ${t}`))}function Ks(){return F}var Xs={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Mi(s,e){return typeof s=="number"&&Number.isFinite(s)?s:e}function He(s,e={x:.5,y:.5}){var t;if(Array.isArray(s))return{x:Mi(s[0],e.x),y:Mi(s[1],e.y)};if(s&&typeof s=="object"){let i=s;return{x:Mi(i.x,e.x),y:Mi(i.y,e.y)}}if(typeof s=="string"){let i=s.trim().toLowerCase();return(t=Xs[i])!=null?t:e}return e}function Ne(s,e,t,i={}){var g,h,m,f,b,v;let n=He(t),a=(g=i.inset)!=null?g:{},r=(h=i.padding)!=null?h:{x:0,y:0},o=((m=a.left)!=null?m:0)+r.x,l=((f=a.right)!=null?f:0)+r.x,c=((b=a.top)!=null?b:0)+r.y,d=((v=a.bottom)!=null?v:0)+r.y,p=Math.max(0,s-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function Be(s,e,t,i={}){var m,f,b,v,w,y;let n=(m=i.inset)!=null?m:{},a=(f=i.padding)!=null?f:{x:0,y:0},r=((b=n.left)!=null?b:0)+a.x,o=((v=n.right)!=null?v:0)+a.x,l=((w=n.top)!=null?w:0)+a.y,c=((y=n.bottom)!=null?y:0)+a.y,d=Math.max(0,s-r-o),p=Math.max(0,e-l-c),u=He(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:r+d*g,y:l+p*h}}function Hn(s,e,t,i={}){var d,p,u;if(!s)return;let n=i.positionRatio?Be(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Ne(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(d=i.offset)!=null?d:{x:0,y:0},r=n.x+a.x,o=n.y+a.y;s.anchor&&i.renderAnchor&&s.anchor.set(i.renderAnchor.x,i.renderAnchor.y),be(s,r,o);let l=(p=i.scale)!=null?p:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&Se(s,l*c)}if(typeof window!="undefined"){let s=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==s||n!==e)&&(s=i,e=n,$n(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),$n(window.innerWidth,window.innerHeight),window.updateDebugConfig=Ys,window.getDebugConfig=Ks,window.copyConfig=oo,window.applyConfig=Tt,window.applyConfigForRatio=lo,window.positionAtBottom=Nr,window.positionAtTop=Qs,window.positionAtCenter=eo,window.positionAtLeft=to,window.positionAtRight=io,window.positionAtBottomLeft=no,window.positionAtBottomRight=ao,window.positionAtTopLeft=ro,window.positionAtTopRight=so,window.applyPositionContract=Zs,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function Oi(s,e,t=0){return s*e+t}function _i(s,e,t=0){return s*(1-e)+t}function zi(s,e,t=0){return s*e+t}function Ri(s,e,t=0){return s*(1-e)+t}function ge(s,e=0){return s/2+e}function Js(s,e){return s*e}function Zs(s,e,t,i){var r,o,l,c,d,p,u,g,h,m,f,b,v,w,y,x,M,j,L,O;let n=0,a=0;switch(i.type){case"top":n=ge(e,(o=(r=i.offset)==null?void 0:r.x)!=null?o:0),a=Oi(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ge(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=_i(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=zi(e,i.percent,(m=(h=i.offset)==null?void 0:h.x)!=null?m:0),a=ge(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":n=Ri(e,i.percent,(w=(v=i.offset)==null?void 0:v.x)!=null?w:0),a=ge(t,(x=(y=i.offset)==null?void 0:y.y)!=null?x:0);break;case"center":n=ge(e,(j=(M=i.offset)==null?void 0:M.x)!=null?j:0),a=ge(t,(O=(L=i.offset)==null?void 0:L.y)!=null?O:0);break}s.position?s.position.set(n,a):(s.x=n,s.y=a),i.scale!==void 0&&i.scale!==1&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(i.scale,i.scale):(s.scale.x=i.scale,s.scale.y=i.scale))}function Nr(s,e,t,i=.2,n=1,a=!0,r=!1){let o=Js(t,i),l=_i(t,i/2);be(s,ge(e),l);let c=a?n*ke.scaleFactor:n;Se(s,c),r&&!ji.find(d=>d.element===s)&&qs(s,Nr,e,t,i,n,a)}function Qs(s,e,t,i=.1,n=1){be(s,ge(e),Oi(t,i)),Se(s,n)}function eo(s,e,t,i=0,n=0,a=1){be(s,ge(e,i),ge(t,n)),Se(s,a)}function to(s,e,t,i=.1,n=1){be(s,zi(e,i),ge(t)),Se(s,n)}function io(s,e,t,i=.1,n=1){be(s,Ri(e,i),ge(t)),Se(s,n)}function no(s,e,t,i=.05,n=.05,a=1){be(s,zi(e,n),_i(t,i)),Se(s,a)}function ao(s,e,t,i=.05,n=.05,a=1){be(s,Ri(e,n),_i(t,i)),Se(s,a)}function ro(s,e,t,i=.05,n=.05,a=1){be(s,zi(e,n),Oi(t,i)),Se(s,a)}function so(s,e,t,i=.05,n=.05,a=1){be(s,Ri(e,n),Oi(t,i)),Se(s,a)}function be(s,e,t){s&&s.position?typeof s.position.set=="function"?s.position.set(e,t):(s.position.x=e,s.position.y=t):s&&(s.x=e,s.y=t)}function Se(s,e){e!==1&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(e,e):s.scale.x!==void 0&&s.scale.y!==void 0&&(s.scale.x=e,s.scale.y=e))}var Xe={default:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}},wide:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.9,screen_scale_y:1.1},engine:{scale:1,background_scale:1.1,background_offset_y:0,background_alpha:.95,label_pulse_speed:3,label_pulse_intensity:.03}},square:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.85,screen_scale_y:.85},engine:{scale:1,background_scale:1,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}},tall:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1.1,screen_scale_y:.9},engine:{scale:1,background_scale:.95,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}}};function oo(s){return s&&Xe[s]?JSON.parse(JSON.stringify(Xe[s])):JSON.parse(JSON.stringify(F))}function Tt(s){Object.keys(s).forEach(e=>{let t=e;F[t]&&s[t]&&Object.assign(F[t],s[t])}),console.log("Config applied:",s)}function lo(s,e){let t=s/e;t>1.6?(Tt(Xe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Tt(Xe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Tt(Xe.square),console.log("Applied SQUARE config for ratio:",t)):(Tt(Xe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let s=window;s.configPresets=Xe,s.resolveAnchorVec2=s.resolveAnchorVec2||He,s.resolveScreenAnchorPoint=s.resolveScreenAnchorPoint||Ne,s.resolveScreenRatioPoint=s.resolveScreenRatioPoint||Be}var oe=null;function co(s,e,t,i,n,a={}){var I,P,z,D,N,H,B,G,Y,Q,ie,le,$,Z,ce,he,de,ve,Ce,Te,q,ee,K,ae,Oe,Ge,ca,da,pa,ua,ga,ha,ma,fa;let r=(I=a.enableDebugLogs)!=null?I:!1;r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== STARTING LAYOUT CALCULATION ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Screen dimensions:",{width:i.width,height:i.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Time:",t),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Options:",a));let{mainContainer:o,label:l,background:c,backgroundTexture:d,app:p}=s;if(!p||!p.renderer){r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] App renderer dimensions:",{width:p.renderer.width,height:p.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:p.screen.width,height:p.screen.height}));let u=i.width,g=i.height;r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:u,baseHeight:g});let h=u*F.layout.screen_scale_x,m=g*F.layout.screen_scale_y,f=u/2,b=e.engine.runtime||{},v=b.layout||{};r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:F.layout.screen_scale_x,screen_scale_y:F.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:h,height:m,midX:f}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",v));let w=v.design_width_portrait||400,y=h/w;y=Math.min(y,1.15);let x=y*((P=F.engine.scale)!=null?P:1),M=(z=a.skipMainContainerTransform)!=null?z:!1;!M&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(x):(o.scale.x=x,o.scale.y=x));let j=(D=v.main_container_anchor)!=null?D:"center",L=(N=v.main_container_position_ratio)!=null?N:{x:.5,y:.5},O=(H=v.main_container_offset)!=null?H:{x:0,y:0},_=v.main_container_position_ratio?Be(u,g,L):Ne(u,g,j),T=_.x+O.x+F.layout.position_offset.x,A=_.y+O.y+F.layout.position_offset.y;if(!M&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(T,A):(o.position.x=T,o.position.y=A)),n&&(o!=null&&o.toLocal))for(let[se,ne]of e.objects.entries()){let V=ne==null?void 0:ne.transform;if(!V||((B=V.position_mode)!=null?B:"static")!=="static")continue;let U=(G=n.get)==null?void 0:G.call(n,se),ye=((Y=U==null?void 0:U.getDisplayObject)==null?void 0:Y.call(U))||(U==null?void 0:U.pixiObject)||U;if(!ye||ye.parent!==o)continue;let $t=V.position_ratio!=null?Be(u,g,V.position_ratio):Ne(u,g,(Q=V.anchor)!=null?Q:"center"),Ht=o.toLocal(new Gs($t.x,$t.y)),Nt=(ie=V.position)!=null?ie:{x:0,y:0},qe=Ht.x+Nt.x,Yi=Ht.y+Nt.y;typeof(U==null?void 0:U.setPosition)=="function"?U.setPosition(qe,Yi):(be(ye,qe,Yi),(le=U==null?void 0:U.transform)!=null&&le.position&&(U.transform.position.x=qe,U.transform.position.y=Yi))}let k=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,E=((k==null?void 0:k.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(F.layout.debug_rect_visible&&E){(!oe||oe.parent!==p.stage)&&(oe==null||oe.destroy(),oe=new Us,oe.zIndex=9999,p.stage.addChild(oe)),oe.clear();let se=F.layout.debug_rect_scale_x,ne=F.layout.debug_rect_scale_y,V=(u-4)*se,_e=(g-4)*ne,U=(u-V)/2,ye=(g-_e)/2;r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:u,baseHeight:g,rectW:V,rectH:_e,offsetX:U,offsetY:ye}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+U,y:2+ye,width:V,height:_e})),oe.rect(2+U,2+ye,V,_e).stroke({width:F.layout.debug_rect_thickness,color:F.layout.debug_rect_color})}else oe&&(oe.destroy(),oe=null);let S=(($=s.label)==null?void 0:$.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&S){let se=(ce=(Z=S==null?void 0:S.transform)==null?void 0:Z.anchor)!=null?ce:"center",ne=(he=S==null?void 0:S.transform)==null?void 0:he.position_ratio,V=((de=S==null?void 0:S.transform)==null?void 0:de.offset)||{x:0,y:0};Hn(l,u,g,{anchor:se,positionRatio:ne,offset:{x:V.x*x,y:V.y*x},renderAnchor:He(se)})}if(l&&l.alpha>0){let se=1+Math.sin(t*F.engine.label_pulse_speed)*F.engine.label_pulse_intensity,ne=(Ce=(ve=S==null?void 0:S.transform)==null?void 0:ve.scale)!=null?Ce:1,V=se*x*ne;l.scale&&(typeof l.scale.set=="function"?l.scale.set(V):(l.scale.x=V,l.scale.y=V))}if(r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING ====="),c){r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(Te=c.constructor)==null?void 0:Te.name)),c.alpha=((ee=(q=b.background)==null?void 0:q.alpha)!=null?ee:.98)*F.engine.background_alpha,r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let se=e.objects.get("background_1");r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",se);let ne=(se==null?void 0:se.transform)||{};r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ne);let V=ne.offset||{x:0,y:0},_e=((ae=(K=b.background)==null?void 0:K.offset_y)!=null?ae:0)+F.engine.background_offset_y,U=(Oe=ne.anchor)!=null?Oe:"center",ye=ne.position_ratio;if(r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:V,bgRuntimeOffsetY:_e,bgScreenAnchor:U,bgPositionRatio:ye,baseWidth:u,baseHeight:g,finalScale:x}),Hn(c,u,g,{anchor:U,positionRatio:ye,offset:{x:V.x*x,y:V.y*x+_e},renderAnchor:He(U)}),r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(Ge=c.scale)==null?void 0:Ge.x,scaleY:(ca=c.scale)==null?void 0:ca.y,anchorX:(da=c.anchor)==null?void 0:da.x,anchorY:(pa=c.anchor)==null?void 0:pa.y,pivotX:(ua=c.pivot)==null?void 0:ua.x,pivotY:(ga=c.pivot)==null?void 0:ga.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:d==null?void 0:d.width,textureHeight:d==null?void 0:d.height})),d){let $t=Math.max(h/d.width,m/d.height),Ht=(ma=(ha=b.background)==null?void 0:ha.scale_multiplier)!=null?ma:1.05,Nt=(fa=ne.scale)!=null?fa:1,qe=$t*Ht*F.engine.background_scale*Nt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(qe):(c.scale.x=qe,c.scale.y=qe))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-h/2,-m/2,h,m).fill({color:1444375}))}}var Di=class{constructor(e){this.app=null;this.camera=new Je;this.mainContainer=new Je;this.uiContainer=new Je;this.gizmoLayer=new Je;this.screenFrame=new Ze;this.objectMap=new Map;this.selectedId=null;this.dragMode=null;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotation=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.dragContainer=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.gizmoOutline=new Ze;this.moveHandle=new Ze;this.scaleHandle=new Ze;this.rotateHandle=new Ze;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.updateLayout({width:t,height:i}),this.updateGizmos(),this.syncFromConfig())};this.handleActiveScreenChanged=()=>{this.isVisible&&this.syncFromConfig()};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.objectId,n=t.objectIds;if(i){this.syncFromConfig([i]);return}if(Array.isArray(n)&&n.length>0){this.syncFromConfig(n);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onDragMove=e=>{var a;if(!this.dragMode||!this.selectedId||!this.app)return;let t=this.objectMap.get(this.selectedId);if(!t)return;let i=(a=this.dragContainer)!=null?a:this.mainContainer,n=this.getPointerInContainer(e.clientX,e.clientY,i);if(!(!n||!this.dragStartPointer||!this.dragStartPos)){if(this.dragMode==="move"){let r=n.x-this.dragStartPointer.x,o=n.y-this.dragStartPointer.y,l=this.dragStartPos.x+r,c=this.dragStartPos.y+o;t.displayObject.position.set(l,c),this.updateLiveConfigPosition(l,c)}else if(this.dragMode==="scale"){let r=new re(this.dragStartPos.x,this.dragStartPos.y),o=Math.max(1,this.distance(n,r)),l=Math.max(.05,this.dragStartScale*(o/this.dragStartDistance));t.displayObject.scale.set(l),this.updateLiveConfigScale(l)}else if(this.dragMode==="rotate"){let r=new re(this.dragStartPos.x,this.dragStartPos.y),l=Math.atan2(n.y-r.y,n.x-r.x)-this.dragStartAngle,c=this.dragStartRotation+l;t.displayObject.rotation=c,this.updateLiveConfigRotation(c)}this.updateGizmos(),this.queueLiveApply(this.selectedId)}};this.onDragEnd=()=>{var i,n,a,r,o,l,c;if(!this.dragMode||!this.selectedId)return;let e=this.selectedId,t=this.getEditableObjectConfig(e);if(t){let d=(i=t.transform)!=null?i:{};if(t.transform||(t.transform=d),this.dragMode==="move"&&this.dragStartValue){let p=d.position,u=Array.isArray(p)?[Number((n=p[0])!=null?n:0),Number((a=p[1])!=null?a:0)]:{x:Number((r=p==null?void 0:p.x)!=null?r:0),y:Number((o=p==null?void 0:p.y)!=null?o:0)};this.applyFinalOverride(e,"transform.position",u,this.dragStartValue)}else this.dragMode==="scale"?this.applyFinalOverride(e,"transform.scale",(l=d.scale)!=null?l:1,this.dragStartValue):this.dragMode==="rotate"&&this.applyFinalOverride(e,"transform.rotation",(c=d.rotation)!=null?c:0,this.dragStartValue);this.queueLiveApply(e)}window.dispatchEvent(new CustomEvent("inspector:refresh")),this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,this.dragContainer=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd)};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i));this.cameraScale=n,this.camera.scale.set(n),this.hasUserCamera=!0,this.updateGizmos()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(!this.isPanning||!this.panStart||!this.panStartCamera)return;let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i)};this.onPanEnd=()=>{this.isPanning=!1,this.panStart=null,this.panStartCamera=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new po,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.uiContainer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.screenFrame),this.camera.addChild(this.mainContainer),this.camera.addChild(this.uiContainer),this.camera.addChild(this.gizmoLayer),this.screenFrame.zIndex=-1,this.screenFrame.eventMode="none",this.mainContainer.zIndex=0,this.uiContainer.zIndex=5e4,this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.gizmoOutline.eventMode="none",this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.refresh(),!this.isVisible&&this.app.ticker&&this.app.ticker.stop())}destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("preview:select",this.handlePreviewSelect),this.app&&(this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,!(!this.app||!this.app.ticker)&&(e?(this.app.ticker.start(),this.refresh()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("preview:select",this.handlePreviewSelect),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.moveHandle.eventMode="static",this.moveHandle.cursor="move",this.scaleHandle.eventMode="static",this.scaleHandle.cursor="nwse-resize",this.rotateHandle.eventMode="static",this.rotateHandle.cursor="crosshair",this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t))}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos())}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let r=this.getEditableObjectConfig(a);if(!r){this.removeObject(a);continue}await this.upsertObject(a,r)}this.updateGizmos()}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e),a=this.isUiConfig(e,t);if(!n||n.assetKey!==i||n.isUi!==a){n&&this.removeObject(e);let o=await this.createDisplayObject(e,t);if(!o)return;(a?this.uiContainer:this.mainContainer).addChild(o),this.objectMap.set(e,{id:e,displayObject:o,assetKey:i,isUi:a}),this.attachObjectInteraction(o,e)}let r=this.objectMap.get(e);r&&(this.applyVisualConfig(r.displayObject,t),this.updateObjectTransform(r.displayObject,t))}async createDisplayObject(e,t){var o,l,c,d,p,u,g,h,m,f,b,v,w,y,x;if((o=t==null?void 0:t.render)!=null&&o.asset)try{if(((c=(l=t==null?void 0:t.render)==null?void 0:l.asset)==null?void 0:c.type)!=="json"){let j=await xe.create(e,t,this.app);if(j instanceof Je)return j}}catch(M){console.warn("[SceneEditor] ObjectFactory failed for",e,M)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let M=this.getScreen(),j=(p=M==null?void 0:M.width)!=null?p:0,L=(u=M==null?void 0:M.height)!=null?u:0,O=new Ze,_=this.parseColor(n.background_color,0),T=typeof n.background_alpha=="number"?n.background_alpha:1;j>0&&L>0&&O.rect(0,0,j,L).fill({color:_,alpha:T});let A=new Je;return A.addChild(O),A}if(a){let M=(h=(g=i==null?void 0:i.color)!=null?g:n==null?void 0:n.tint)!=null?h:"#ffffff",j=new ho({fontFamily:"Arial, sans-serif",fontSize:(m=i==null?void 0:i.fontSize)!=null?m:16,fill:M,align:(f=i==null?void 0:i.align)!=null?f:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new go({text:(v=i==null?void 0:i.text)!=null?v:"",style:j})}if((w=t==null?void 0:t.effects)!=null&&w.width||(y=t==null?void 0:t.effects)!=null&&y.height){let M=new Ze,j=typeof t.effects.width=="number"?t.effects.width:100,L=typeof t.effects.height=="number"?t.effects.height:100,O=(x=t.effects.fill_color)!=null?x:"#ffffff",_=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,T=Number.parseInt(String(O).replace("#",""),16);return M.rect(0,0,j,L).fill({color:Number.isFinite(T)?T:16777215,alpha:_}),M}return new Je}attachObjectInteraction(e,t){if(e){if(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function"){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=i)}e.on("pointerdown",i=>{this.getPointerButton(i)===0&&(this.setSelected(t),this.startDrag("move",i))})}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}isUiConfig(e,t){var a,r;let i=(((a=t==null?void 0:t.identity)==null?void 0:a.category)||"").toString().toLowerCase(),n=(((r=t==null?void 0:t.identity)==null?void 0:r.id)||e||"").toString().toLowerCase();return i.includes("ui")||n.startsWith("ui")||n.includes("label")}applyVisualConfig(e,t){var r,o,l,c,d,p,u;if(!e)return;let i=(r=t==null?void 0:t.render)!=null?r:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n=(d=(c=(o=t==null?void 0:t.render)==null?void 0:o.anchor)!=null?c:(l=t==null?void 0:t.transform)==null?void 0:l.anchor)!=null?d:"center",a=He(n,{x:.5,y:.5});if((p=e.anchor)!=null&&p.set)e.anchor.set(a.x,a.y);else if(e.pivot){let g=(u=e.getLocalBounds)==null?void 0:u.call(e);g&&e.pivot.set(g.width*a.x,g.height*a.y)}}updateObjectTransform(e,t){var c;if(!e)return;let i=(c=t==null?void 0:t.transform)!=null?c:{},n=e.parent===this.uiContainer?this.uiContainer:this.mainContainer,a=this.getAnchorLocalPoint(i,n),r=this.getPositionOffset(i);a&&e.position.set(a.x+r.x,a.y+r.y);let o=typeof i.scale=="number"?i.scale:void 0;typeof o=="number"&&e.scale&&e.scale.set(o);let l=typeof i.rotation=="number"?i.rotation:0;typeof e.rotation=="number"&&(e.rotation=l)}getAnchorLocalPoint(e,t=this.mainContainer){var r;let i=this.getScreen();if(!(i!=null&&i.width)||!(i!=null&&i.height))return null;let n=(e==null?void 0:e.position_ratio)!=null?Be(i.width,i.height,e.position_ratio):Ne(i.width,i.height,(r=e==null?void 0:e.anchor)!=null?r:"center"),a=new re;return t.toLocal(new re(n.x,n.y),void 0,a),a}getPositionOffset(e){var l,c,d,p,u,g,h,m;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset,n=Array.isArray(t)?Number((l=t[0])!=null?l:0):Number((c=t==null?void 0:t.x)!=null?c:0),a=Array.isArray(t)?Number((d=t[1])!=null?d:0):Number((p=t==null?void 0:t.y)!=null?p:0),r=Array.isArray(i)?Number((u=i[0])!=null?u:0):Number((g=i==null?void 0:i.x)!=null?g:0),o=Array.isArray(i)?Number((h=i[1])!=null?h:0):Number((m=i==null?void 0:i.y)!=null?m:0);return{x:n+r,y:a+o}}updateLayout(e){var m,f,b,v,w,y,x,M;let t=e!=null?e:this.getScreen();if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let n=(((f=(m=this.getEditableConfig())==null?void 0:m.engine)==null?void 0:f.runtime)||{}).layout||{},a=t.width*((b=F.layout.screen_scale_x)!=null?b:1),r=n.design_width_portrait||400,o=a/r;o=Math.min(o,1.15);let l=o*((v=F.engine.scale)!=null?v:1);this.mainContainer.scale.set(l),this.uiContainer.scale.set(l);let c=(w=n.main_container_anchor)!=null?w:"center",d=(y=n.main_container_position_ratio)!=null?y:{x:.5,y:.5},p=(x=n.main_container_offset)!=null?x:{x:0,y:0},u=n.main_container_position_ratio?Be(t.width,t.height,d):Ne(t.width,t.height,c),g=u.x+p.x+F.layout.position_offset.x,h=u.y+p.y+F.layout.position_offset.y;this.mainContainer.position.set(g,h),this.uiContainer.position.set(g,h),this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),(M=this.app)!=null&&M.stage&&(this.app.stage.hitArea=new uo(0,0,t.width,t.height)),this.hasUserCamera||this.centerCamera()}centerCamera(){if(!this.app)return;let e=this.getScreen(),t=this.app.renderer.width,i=this.app.renderer.height;this.cameraScale=1,this.camera.scale.set(this.cameraScale),this.camera.position.set((t-e.width)/2,(i-e.height)/2)}updateGizmos(){var d,p;if(!this.selectedId||!this.isVisible){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(p=(d=e.displayObject).getBounds)==null?void 0:p.call(d);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new re(t.x,t.y)),n=this.camera.toLocal(new re(t.x+t.width,t.y+t.height)),a=n.x-i.x,r=n.y-i.y,o=i.x+a/2,l=i.y+r/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,r),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});let c=10;this.moveHandle.clear(),this.moveHandle.circle(0,0,c/2),this.moveHandle.fill({color:16752394,alpha:.9}),this.moveHandle.position.set(o,l),this.scaleHandle.clear(),this.scaleHandle.rect(-c/2,-c/2,c,c),this.scaleHandle.fill({color:3900150,alpha:.9}),this.scaleHandle.position.set(n.x,n.y),this.rotateHandle.clear(),this.rotateHandle.circle(0,0,c/2),this.rotateHandle.fill({color:1096065,alpha:.9}),this.rotateHandle.position.set(o,i.y-20)}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}setSelected(e,t={}){if(this.selectedId!==e&&(this.selectedId=e,this.updateGizmos(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var d,p,u,g;if(!this.selectedId||!e||!this.app||this.getPointerButton(t)!==0)return;let n=this.objectMap.get(this.selectedId);if(!n)return;this.dragContainer=(p=(d=n.displayObject)==null?void 0:d.parent)!=null?p:this.mainContainer;let a=this.getEventLocalPoint(t,this.dragContainer);if(!a)return;let r=n.displayObject;this.dragMode=e,this.dragStartPointer=new re(a.x,a.y),this.dragStartPos=new re(r.position.x,r.position.y),this.dragStartScale=typeof((u=r.scale)==null?void 0:u.x)=="number"?r.scale.x:1;let o=this.getEditableObjectConfig(this.selectedId),l=(g=o==null?void 0:o.transform)!=null?g:{};this.dragStartRotation=typeof l.rotation=="number"?l.rotation:0,this.dragAnchorLocal=this.getAnchorLocalPoint(l,this.dragContainer),this.dragStartValue=this.getDragStartValue(e,l);let c=new re(r.position.x,r.position.y);this.dragStartAngle=Math.atan2(a.y-c.y,a.x-c.x),this.dragStartDistance=Math.max(1,this.distance(a,c)),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPosition(e,t){var p,u,g,h,m,f;if(!this.selectedId||!this.dragAnchorLocal)return;let i=e-this.dragAnchorLocal.x,n=t-this.dragAnchorLocal.y,a=this.getEditableObjectConfig(this.selectedId);if(!a)return;let r=(p=a.transform)!=null?p:{};a.transform||(a.transform=r);let o=(u=r.offset)!=null?u:{x:0,y:0},l=Array.isArray(o)?Number((g=o[0])!=null?g:0):Number((h=o==null?void 0:o.x)!=null?h:0),c=Array.isArray(o)?Number((m=o[1])!=null?m:0):Number((f=o==null?void 0:o.y)!=null?f:0),d=this.buildPositionValue(r,{x:i-l,y:n-c});this.setNestedValue(r,"position",d)}updateLiveConfigScale(e){var n;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(n=t.transform)!=null?n:{};t.transform||(t.transform=i),i.scale=e}updateLiveConfigRotation(e){var n;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(n=t.transform)!=null?n:{};t.transform||(t.transform=i),i.rotation=e}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),Ve({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&n(t,i)}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let r=0;r<n.length-1;r+=1){let o=n[r];(!a[o]||typeof a[o]!="object")&&(a[o]={}),a=a[o]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position;return Array.isArray(i)?[t.x,t.y]:{x:t.x,y:t.y}}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerButton(e){var t,i,n;return typeof(e==null?void 0:e.button)=="number"?e.button:typeof((t=e==null?void 0:e.data)==null?void 0:t.button)=="number"?e.data.button:typeof((n=(i=e==null?void 0:e.data)==null?void 0:i.originalEvent)==null?void 0:n.button)=="number"?e.data.originalEvent.button:0}getEventLocalPoint(e,t=this.mainContainer){var a,r;if(!this.app)return null;if(typeof(e==null?void 0:e.getLocalPosition)=="function"){let o=e.getLocalPosition(t);return new re(o.x,o.y)}let i=(r=e==null?void 0:e.global)!=null?r:(a=e==null?void 0:e.data)==null?void 0:a.global;if(!i)return null;let n=new re;return t.toLocal(new re(i.x,i.y),void 0,n),n}getPointerInContainer(e,t,i){if(!this.app)return null;let n=this.app.canvas.getBoundingClientRect(),a=(e-n.left)*(this.app.renderer.width/n.width),r=(t-n.top)*(this.app.renderer.height/n.height),o=new re;return i.toLocal(new re(a,r),void 0,o),o}parseColor(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let i=e.trim().replace("#",""),n=Number.parseInt(i,16);if(Number.isFinite(n))return n}return t}};var Nn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[at("playable-portrait"),at("iphone-14"),at("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=at(e.defaultDevice||on.id),this.debugPanel=new Pi,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let t=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=t===null?!0:t==="true"}catch{}this.sceneEditor=new Di({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=at(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),this.updateSceneVisibility(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let d=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:d})},r=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",r),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",r),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,r=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,d=Math.max(200,Math.min(600,a+c));e.style.width=`${d}px`;let p=this.container.querySelector(".preview-main");if(p){let g=i==="left"?`${d}px`:p.style.gridTemplateColumns.split(" ")[0]||"300px",h=i==="right"?`${d}px`:p.style.gridTemplateColumns.split(" ")[2]||"350px";p.style.gridTemplateColumns=`${g} 1fr ${h}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&Ye(this.scenePane,e,i!=null?i:this.previewContainer),t&&Ti(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let r=a.clientX,o=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=p=>{let u=p.clientX-r,g=Math.max(240,Math.min(l,o+u));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
2190
2191
  <div class="preview-toolbar">
2191
2192
  <div class="preview-toolbar-left">
2192
2193
  <span class="preview-logo">PREVIEWER</span>
@@ -2376,7 +2377,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2376
2377
  </div>
2377
2378
 
2378
2379
  </div>
2379
- `,this.setupEventListeners(e),e}setupEventListeners(e){var m,f,b,v,w,y,x,M;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",j=>{if(this.viewMode==="compare")return;let L=j.target.value;this.setDevice(L)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",j=>{let L=j.target.value;this.setTheme(L)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(j=>{j.addEventListener("click",()=>{let L=j.dataset.viewToggle;L&&this.setViewMode(L)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(j=>{j.addEventListener("click",()=>{let L=j.dataset.layoutToggle;L&&this.setLayoutMode(L)})});let r=e.querySelector("#scene-toggle");r==null||r.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let o=e.querySelector("#scene-hide-btn");o==null||o.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())}),(m=e.querySelector("#rotate-btn"))==null||m.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(b=e.querySelector("#zoom-out-btn"))==null||b.addEventListener("click",()=>this.adjustUserZoom(-.1)),(v=e.querySelector("#refresh-btn"))==null||v.addEventListener("click",()=>this.refresh());let l=e.querySelector("#bottom-dock"),c=e.querySelector("#bottom-dock-resize");l&&c&&this.makeBottomDockResizable(l,c);let d=Array.from(e.querySelectorAll(".bottom-dock-tab"));d.forEach(j=>{j.addEventListener("click",()=>{let L=j.dataset.dockTab;if(!L)return;d.forEach(O=>O.classList.remove("active")),j.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(O=>{let T=O.dataset.dockPanel;O.classList.toggle("active",T===L)})})}),(w=e.querySelector("#console-clear"))==null||w.addEventListener("click",()=>this.clearConsole()),(y=e.querySelector("#corner-zoom-in-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(.1)),(x=e.querySelector("#corner-zoom-out-btn"))==null||x.addEventListener("click",()=>this.adjustUserZoom(-.1)),(M=e.querySelector("#corner-grab-btn"))==null||M.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let p=e.querySelector(".scene-panel.scene-objects"),u=p==null?void 0:p.querySelector("[data-panel-resize-v]");p&&u&&this.makeSidebarResizable(p,u,"left");let g=e.querySelector(".debug-workbench"),h=g==null?void 0:g.querySelector("#workbench-resize-v");g&&h&&this.makeSidebarResizable(g,h,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let r=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(r,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.gameViewPane||this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),va();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),ya();return}})}setupUnsavedChangesIndicator(){let e=this.container.querySelector("#preview-save-shortcut-text");e&&(e.textContent=`(${this.getShortcutKey()} + S)`),window.addEventListener("config:changed",()=>{this.updateUnsavedChangesIndicator()}),this.updateUnsavedChangesIndicator();let t=this.container.querySelector("#preview-save-btn");t==null||t.addEventListener("click",()=>{let i=document.querySelector("#apply-current-btn");i&&i.getAttribute("disabled")===null&&i.click()})}updateUnsavedChangesIndicator(){let t=Qe().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.container.querySelector("#preview-unsaved-star"),n=this.container.querySelector("#preview-save-btn");i&&(i.style.display=t?"inline-block":"none"),n&&(n.style.display=t?"inline-flex":"none")}}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(r=>typeof r=="object"?this.safeStringify(r):String(r)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let r=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=r>0?`${r}!`:"0",a.classList.toggle("has-errors",r>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(p=>p.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),r=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!a||!r||!o||!l||(t.addEventListener("click",p=>{let u=p.target;if(u!=null&&u.closest("[data-compare-focus]")){p.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:r,wrapper:o,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,r;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(r=(a=this.options).onDeviceChange)==null||r.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,r=n/e.preset.height,o=Math.max(.01,Math.min(a,r));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,r=t.canvas.height,o=Math.min(a/i.width,r/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,p=(r-c)/2;n.clearRect(0,0,a,r),n.drawImage(i,d,p,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.clientHeight-40}}let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function Fr(s={}){let e=new Nn(s);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}function Fn(s){try{if(s&&typeof s.keys=="function")return Array.from(s.keys())}catch{}return[]}function Br(s){var e;return s?((e=s.getDisplayObject)==null?void 0:e.call(s))||s.pixiObject||s:null}function mo(s,e){if(!s||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);s.eventMode=i?"static":"none",s.interactive=i,i&&(s.cursor=t.draggable?"move":"pointer")}function Ur(s,e){var l,c,d;if(!s||!e)return;let t=e.transform||{};mo(s,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),r=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=s.position)!=null&&l.set?s.position.set(a,r):(typeof s.x=="number"&&(s.x=a),typeof s.y=="number"&&(s.y=r)),typeof t.scale=="number"&&((c=s.scale)!=null&&c.set?s.scale.set(t.scale):s.scale&&(s.scale.x=t.scale,s.scale.y=t.scale));let o=t.anchor;if(o&&((d=s.anchor)!=null&&d.set)){let p=null;typeof window!="undefined"&&window.resolveAnchorVec2?p=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?p=o:Array.isArray(o)&&o.length===2&&(p={x:o[0],y:o[1]}),p&&typeof p.x=="number"&&typeof p.y=="number"&&s.anchor.set(p.x,p.y)}}function Gr(s){if(typeof window=="undefined")return;let e=s==null?void 0:s.objects,t=Fn(e),i=a=>{try{let r=window.__HANDLER_ACTIVE_SCREEN;if(!r||r==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===r):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Gr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Fn((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Fn((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var d,p,u,g,h;let r=(g=(u=(p=(d=window.__editableConfig)==null?void 0:d.objects)==null?void 0:p.get)==null?void 0:u.call(p,a))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let l=window.__HANDLER_SCREEN_INDEX,c=(h=l==null?void 0:l.instanceToScreen)==null?void 0:h[a];return c&&c===o?r:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let r={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(r.assets||{})),r}return a}}function fo(){if(typeof window=="undefined")return;let s=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,r,o;let n=s(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),d=Date.now(),p=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),u=await l.load(p);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let h=window.gameObjectManager,m=(r=h==null?void 0:h.get)==null?void 0:r.call(h,t);if(m){let f=((o=m.getDisplayObject)==null?void 0:o.call(m))||m.pixiObject||m.pixi||m;if(f!=null&&f.texture)f.texture=u;else if(f!=null&&f.children){let b=f.children.find(v=>v==null?void 0:v.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Ji();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ft(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Ji();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ft(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,r]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:r});if(t.assets)for(let[a,r]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:r}),typeof r=="string"&&e(a,r);if(t.splash)for(let[a,r]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:r});if(t.loading)for(let[a,r]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:r});if(t.start)for(let[a,r]of Object.entries(t.start))n.push({path:`start.${a}`,value:r});n.length&&Ft(n,{silent:!0,persist:!0,emitEvent:!0})}}function Bn(s){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=s;t&&(t.onObjectRebuildRequired=async(a,r)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let p=window.gameApp,u=await xe.create(a,r,p);c&&(d!==void 0&&d!==-1?c.addChildAt(u,d):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(fo(),window.applyEditableObjectConfig=(a,r)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(a,r),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let p=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!p),p&&(console.log("[LIVE-EDIT] gameObject type:",(c=p.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof p.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof p.onConfigUpdate=="function")),p&&typeof p.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),p.updateConfig(r);else if(p&&typeof p.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),p.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=Br(p);Ur(u,r)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,r){var d,p;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(a,r),console.log("[BRIDGE] \u2705 Updated config"));let l=(p=t==null?void 0:t.get)==null?void 0:p.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(r);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=Br(l);Ur(u,r)}let c=[a];i==null||i(a,r,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,Gr(a))}};return n.rebuildIndexes(),n}import bo from"lottie-web";Vn(Za);typeof window!="undefined"&&!window.lottie&&(window.lottie=bo);var ct=null,vo=async()=>{if(!ct){let s=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(s==null?void 0:s["handler.config"])||(s==null?void 0:s["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);ct=JSON.parse(i)}else ct=JSON.parse(e);return ct}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}ct=await(await fetch("./handler.config.json")).json()}return ct},Wn,kt,Wr,dt,Gn,qn;function gp(s){Wn=s.initGame,kt=s.CustomAssets,Wr=s.updateScreenState,dt=s.globalResponsiveMultipliers,Gn=s.layout,qn=s.clearResponsiveElements}var $i="web_embed",Lt="https://example.com",qr={profile_id:$i},Be=null,Ee=null,Un={width:0,height:0},yo=!0,hp=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let s=await vo();qr={...s.ids||{},profile_id:$i},Lt=s.destination_url||((d=(c=s.export_profiles)==null?void 0:c[$i])==null?void 0:d.destination_url)||Lt,Pe.init({ids:qr,profile:$i,destinationUrl:Lt});let e=Pe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),Ee=Fr({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),Vr()},onRefresh:Vr});let g=Ee.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var w,y,x,M,j,L,_,O,T,A,k;let m=window.gameApp,f=window.gameObjectManager,{width:b,height:v}=h.detail;if(Un.width=b,Un.height=v,Wr(b,v),!(!m||!m.renderer)){f&&o(m,f);try{m.renderer.resize(b,v);let C=m.view;C&&(C.style.width="100%",C.style.height="100%",C.style.display="block")}catch(C){console.warn("[SCREEN] Error resizing renderer:",C);return}if(t&&f&&Gn)try{let C=(w=window.__mainContainer)!=null?w:m.stage,E=(_=(L=(M=window.__tutorialLabel)!=null?M:(x=(y=f.get("label_1"))==null?void 0:y.getDisplayObject)==null?void 0:x.call(y))!=null?L:(j=f.get("label_1"))==null?void 0:j.pixiObject)!=null?_:f.get("label_1"),S=f.get("background_1"),I=(k=(A=(T=window.__background)!=null?T:(O=S==null?void 0:S.getDisplayObject)==null?void 0:O.call(S))!=null?A:S==null?void 0:S.pixiObject)!=null?k:S;if(C){let P=C===m.stage;Gn({mainContainer:C,label:E,background:I,backgroundTexture:(I==null?void 0:I.texture)||null,app:m},t,0,Un,f,{skipMainContainerTransform:P})}}catch(C){console.warn("[SCREEN] Error in layout:",C)}}})}let t=await Ut("scene.main");window.__editableConfig=t,r(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Zi(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(p=t.engine.runtime)==null?void 0:p.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Ut("scene.main"));let i=await Wn(e,t,Lt,Ee);Be=i.app;let n=i.gameObjectManager;window.gameApp=Be,window.gameObjectManager=n;try{window.__liveEditBridge=Bn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:kt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}Ee&&Ee.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(dt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(Be,n);async function r(){try{let g=async v=>{let w=v.startsWith("/")?v:`/${v}`,y=await fetch(w,{cache:"no-cache"});if(!y.ok)return null;let x=await y.text();try{return JSON.parse(x)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let m=h.screens;if(!m||typeof m!="object")return;let f={},b={};for(let[v,w]of Object.entries(m)){let y=w==null?void 0:w.source;if(typeof y!="string")continue;let x=await g(y),M=x==null?void 0:x.elements;if(!Array.isArray(M))continue;let j=M.map(L=>L==null?void 0:L.instance_id).filter(L=>typeof L=="string");f[v]=j;for(let L of j)b[L]||(b[L]=v)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,h){if(yo){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${dt.scale.toFixed(3)}`),g.stage){let f=function(b,v=0){if(!b||!b.children)return;let w=" ".repeat(v);b.children.forEach((y,x)=>{if(y&&y.zIndex===9999){console.log(`${w}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(y&&y.scale){let M=y.scale.x||1,j=y.scale.y||1;y.__originalScale||(y.__originalScale={x:M,y:j},console.log(`${w}[RESPONSIVE] Stored original scale for child[${x}]: ${M.toFixed(3)}, ${j.toFixed(3)}`));let L=y.__originalScale.x*dt.scale,_=y.__originalScale.y*dt.scale;typeof y.scale.set=="function"?y.scale.set(L,_):(y.scale.x=L,y.scale.y=_),console.log(`${w}[RESPONSIVE] Child[${x}] scale: ${M.toFixed(3)}\u2192${y.scale.x.toFixed(3)} (type: ${y.constructor.name})`),f(y,v+1)}else y&&console.log(`${w}[RESPONSIVE] Child[${x}] has no scale (type: ${y.constructor.name})`)})};var m=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){dt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,m=window.gameObjectManager;h&&m?(o(h,m),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!m}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Pe.start()},Vr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let s=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(s){let a=((t=s.getDisplayObject)==null?void 0:t.call(s))||s;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(Ee){Ee.notifyGameDestroyed();try{qn&&qn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=Ee.getGameContainer(),r=window.gameObjectManager;if(r&&typeof r.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),r.clear()),Be){try{Be.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}Be=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof kt.resetScene=="function"&&kt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Ut("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Zi(o)),Wn(a,o,Lt).then(l=>{Be=l.app,window.gameApp=Be,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Bn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:kt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}Ee&&Ee.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Pe.start()}catch{}})})},100)},1e3)}};var Me={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},wo=1.25,xo={fontFamily:"Inter, system-ui, sans-serif"};var Yn=class{constructor(e={}){this.currentProgress=0;var t;this.currentProgress=(t=e.progress)!=null?t:0,this.container=this.createContainer()}createContainer(){let e=document.createElement("div");e.className="handler-loading-screen",e.style.cssText=`
2380
+ `,this.setupEventListeners(e),e}setupEventListeners(e){var m,f,b,v,w,y,x,M;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",j=>{if(this.viewMode==="compare")return;let L=j.target.value;this.setDevice(L)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",j=>{let L=j.target.value;this.setTheme(L)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(j=>{j.addEventListener("click",()=>{let L=j.dataset.viewToggle;L&&this.setViewMode(L)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(j=>{j.addEventListener("click",()=>{let L=j.dataset.layoutToggle;L&&this.setLayoutMode(L)})});let r=e.querySelector("#scene-toggle");r==null||r.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let o=e.querySelector("#scene-hide-btn");o==null||o.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())}),(m=e.querySelector("#rotate-btn"))==null||m.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(b=e.querySelector("#zoom-out-btn"))==null||b.addEventListener("click",()=>this.adjustUserZoom(-.1)),(v=e.querySelector("#refresh-btn"))==null||v.addEventListener("click",()=>this.refresh());let l=e.querySelector("#bottom-dock"),c=e.querySelector("#bottom-dock-resize");l&&c&&this.makeBottomDockResizable(l,c);let d=Array.from(e.querySelectorAll(".bottom-dock-tab"));d.forEach(j=>{j.addEventListener("click",()=>{let L=j.dataset.dockTab;if(!L)return;d.forEach(_=>_.classList.remove("active")),j.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(_=>{let T=_.dataset.dockPanel;_.classList.toggle("active",T===L)})})}),(w=e.querySelector("#console-clear"))==null||w.addEventListener("click",()=>this.clearConsole()),(y=e.querySelector("#corner-zoom-in-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(.1)),(x=e.querySelector("#corner-zoom-out-btn"))==null||x.addEventListener("click",()=>this.adjustUserZoom(-.1)),(M=e.querySelector("#corner-grab-btn"))==null||M.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let p=e.querySelector(".scene-panel.scene-objects"),u=p==null?void 0:p.querySelector("[data-panel-resize-v]");p&&u&&this.makeSidebarResizable(p,u,"left");let g=e.querySelector(".debug-workbench"),h=g==null?void 0:g.querySelector("#workbench-resize-v");g&&h&&this.makeSidebarResizable(g,h,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let r=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(r,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.gameViewPane||this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),va();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),ya();return}})}setupUnsavedChangesIndicator(){let e=this.container.querySelector("#preview-save-shortcut-text");e&&(e.textContent=`(${this.getShortcutKey()} + S)`),window.addEventListener("config:changed",()=>{this.updateUnsavedChangesIndicator()}),this.updateUnsavedChangesIndicator();let t=this.container.querySelector("#preview-save-btn");t==null||t.addEventListener("click",()=>{let i=document.querySelector("#apply-current-btn");i&&i.getAttribute("disabled")===null&&i.click()})}updateUnsavedChangesIndicator(){let t=et().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.container.querySelector("#preview-unsaved-star"),n=this.container.querySelector("#preview-save-btn");i&&(i.style.display=t?"inline-block":"none"),n&&(n.style.display=t?"inline-flex":"none")}}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(r=>typeof r=="object"?this.safeStringify(r):String(r)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let r=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=r>0?`${r}!`:"0",a.classList.toggle("has-errors",r>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(p=>p.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),r=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!a||!r||!o||!l||(t.addEventListener("click",p=>{let u=p.target;if(u!=null&&u.closest("[data-compare-focus]")){p.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:r,wrapper:o,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,r;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(r=(a=this.options).onDeviceChange)==null||r.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,r=n/e.preset.height,o=Math.max(.01,Math.min(a,r));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,r=t.canvas.height,o=Math.min(a/i.width,r/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,p=(r-c)/2;n.clearRect(0,0,a,r),n.drawImage(i,d,p,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.clientHeight-40}}let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function Br(s={}){let e=new Nn(s);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}function Bn(s){try{if(s&&typeof s.keys=="function")return Array.from(s.keys())}catch{}return[]}function Fr(s){var e;return s?((e=s.getDisplayObject)==null?void 0:e.call(s))||s.pixiObject||s:null}function mo(s,e){if(!s||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);s.eventMode=i?"static":"none",s.interactive=i,i&&(s.cursor=t.draggable?"move":"pointer")}function Ur(s,e){var l,c,d;if(!s||!e)return;let t=e.transform||{};mo(s,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),r=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=s.position)!=null&&l.set?s.position.set(a,r):(typeof s.x=="number"&&(s.x=a),typeof s.y=="number"&&(s.y=r)),typeof t.scale=="number"&&((c=s.scale)!=null&&c.set?s.scale.set(t.scale):s.scale&&(s.scale.x=t.scale,s.scale.y=t.scale));let o=t.anchor;if(o&&((d=s.anchor)!=null&&d.set)){let p=null;typeof window!="undefined"&&window.resolveAnchorVec2?p=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?p=o:Array.isArray(o)&&o.length===2&&(p={x:o[0],y:o[1]}),p&&typeof p.x=="number"&&typeof p.y=="number"&&s.anchor.set(p.x,p.y)}}function Gr(s){if(typeof window=="undefined")return;let e=s==null?void 0:s.objects,t=Bn(e),i=a=>{try{let r=window.__HANDLER_ACTIVE_SCREEN;if(!r||r==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===r):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Gr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Bn((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Bn((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var d,p,u,g,h;let r=(g=(u=(p=(d=window.__editableConfig)==null?void 0:d.objects)==null?void 0:p.get)==null?void 0:u.call(p,a))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let l=window.__HANDLER_SCREEN_INDEX,c=(h=l==null?void 0:l.instanceToScreen)==null?void 0:h[a];return c&&c===o?r:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let r={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(r.assets||{})),r}return a}}function fo(){if(typeof window=="undefined")return;let s=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,r,o;let n=s(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),d=Date.now(),p=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),u=await l.load(p);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let h=window.gameObjectManager,m=(r=h==null?void 0:h.get)==null?void 0:r.call(h,t);if(m){let f=((o=m.getDisplayObject)==null?void 0:o.call(m))||m.pixiObject||m.pixi||m;if(f!=null&&f.texture)f.texture=u;else if(f!=null&&f.children){let b=f.children.find(v=>v==null?void 0:v.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Ji();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Bt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Ji();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Bt(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,r]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:r});if(t.assets)for(let[a,r]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:r}),typeof r=="string"&&e(a,r);if(t.splash)for(let[a,r]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:r});if(t.loading)for(let[a,r]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:r});if(t.start)for(let[a,r]of Object.entries(t.start))n.push({path:`start.${a}`,value:r});n.length&&Bt(n,{silent:!0,persist:!0,emitEvent:!0})}}function Fn(s){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=s;t&&(t.onObjectRebuildRequired=async(a,r)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let p=window.gameApp,u=await xe.create(a,r,p);c&&(d!==void 0&&d!==-1?c.addChildAt(u,d):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(fo(),window.applyEditableObjectConfig=(a,r)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(a,r),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let p=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!p),p&&(console.log("[LIVE-EDIT] gameObject type:",(c=p.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof p.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof p.onConfigUpdate=="function")),p&&typeof p.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),p.updateConfig(r);else if(p&&typeof p.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),p.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=Fr(p);Ur(u,r)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,r){var d,p;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(a,r),console.log("[BRIDGE] \u2705 Updated config"));let l=(p=t==null?void 0:t.get)==null?void 0:p.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(r);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=Fr(l);Ur(u,r)}let c=[a];i==null||i(a,r,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,Gr(a))}};return n.rebuildIndexes(),n}import bo from"lottie-web";Vn(Za);typeof window!="undefined"&&!window.lottie&&(window.lottie=bo);var ct=null,vo=async()=>{if(!ct){let s=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(s==null?void 0:s["handler.config"])||(s==null?void 0:s["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);ct=JSON.parse(i)}else ct=JSON.parse(e);return ct}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}ct=await(await fetch("./handler.config.json")).json()}return ct},Wn,kt,Wr,dt,Gn,qn;function gp(s){Wn=s.initGame,kt=s.CustomAssets,Wr=s.updateScreenState,dt=s.globalResponsiveMultipliers,Gn=s.layout,qn=s.clearResponsiveElements}var $i="web_embed",Lt="https://example.com",qr={profile_id:$i},Fe=null,Ee=null,Un={width:0,height:0},yo=!0,hp=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let s=await vo();qr={...s.ids||{},profile_id:$i},Lt=s.destination_url||((d=(c=s.export_profiles)==null?void 0:c[$i])==null?void 0:d.destination_url)||Lt,Pe.init({ids:qr,profile:$i,destinationUrl:Lt});let e=Pe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),Ee=Br({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),Vr()},onRefresh:Vr});let g=Ee.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var w,y,x,M,j,L,O,_,T,A,k;let m=window.gameApp,f=window.gameObjectManager,{width:b,height:v}=h.detail;if(Un.width=b,Un.height=v,Wr(b,v),!(!m||!m.renderer)){f&&o(m,f);try{m.renderer.resize(b,v);let C=m.view;C&&(C.style.width="100%",C.style.height="100%",C.style.display="block")}catch(C){console.warn("[SCREEN] Error resizing renderer:",C);return}if(t&&f&&Gn)try{let C=(w=window.__mainContainer)!=null?w:m.stage,E=(O=(L=(M=window.__tutorialLabel)!=null?M:(x=(y=f.get("label_1"))==null?void 0:y.getDisplayObject)==null?void 0:x.call(y))!=null?L:(j=f.get("label_1"))==null?void 0:j.pixiObject)!=null?O:f.get("label_1"),S=f.get("background_1"),I=(k=(A=(T=window.__background)!=null?T:(_=S==null?void 0:S.getDisplayObject)==null?void 0:_.call(S))!=null?A:S==null?void 0:S.pixiObject)!=null?k:S;if(C){let P=C===m.stage;Gn({mainContainer:C,label:E,background:I,backgroundTexture:(I==null?void 0:I.texture)||null,app:m},t,0,Un,f,{skipMainContainerTransform:P})}}catch(C){console.warn("[SCREEN] Error in layout:",C)}}})}let t=await Ut("scene.main");window.__editableConfig=t,r(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Zi(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(p=t.engine.runtime)==null?void 0:p.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Ut("scene.main"));let i=await Wn(e,t,Lt,Ee);Fe=i.app;let n=i.gameObjectManager;window.gameApp=Fe,window.gameObjectManager=n;try{window.__liveEditBridge=Fn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:kt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}Ee&&Ee.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(dt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(Fe,n);async function r(){try{let g=async v=>{let w=v.startsWith("/")?v:`/${v}`,y=await fetch(w,{cache:"no-cache"});if(!y.ok)return null;let x=await y.text();try{return JSON.parse(x)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let m=h.screens;if(!m||typeof m!="object")return;let f={},b={};for(let[v,w]of Object.entries(m)){let y=w==null?void 0:w.source;if(typeof y!="string")continue;let x=await g(y),M=x==null?void 0:x.elements;if(!Array.isArray(M))continue;let j=M.map(L=>L==null?void 0:L.instance_id).filter(L=>typeof L=="string");f[v]=j;for(let L of j)b[L]||(b[L]=v)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,h){if(yo){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${dt.scale.toFixed(3)}`),g.stage){let f=function(b,v=0){if(!b||!b.children)return;let w=" ".repeat(v);b.children.forEach((y,x)=>{if(y&&y.zIndex===9999){console.log(`${w}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(y&&y.scale){let M=y.scale.x||1,j=y.scale.y||1;y.__originalScale||(y.__originalScale={x:M,y:j},console.log(`${w}[RESPONSIVE] Stored original scale for child[${x}]: ${M.toFixed(3)}, ${j.toFixed(3)}`));let L=y.__originalScale.x*dt.scale,O=y.__originalScale.y*dt.scale;typeof y.scale.set=="function"?y.scale.set(L,O):(y.scale.x=L,y.scale.y=O),console.log(`${w}[RESPONSIVE] Child[${x}] scale: ${M.toFixed(3)}\u2192${y.scale.x.toFixed(3)} (type: ${y.constructor.name})`),f(y,v+1)}else y&&console.log(`${w}[RESPONSIVE] Child[${x}] has no scale (type: ${y.constructor.name})`)})};var m=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){dt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,m=window.gameObjectManager;h&&m?(o(h,m),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!m}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Pe.start()},Vr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let s=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(s){let a=((t=s.getDisplayObject)==null?void 0:t.call(s))||s;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(Ee){Ee.notifyGameDestroyed();try{qn&&qn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=Ee.getGameContainer(),r=window.gameObjectManager;if(r&&typeof r.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),r.clear()),Fe){try{Fe.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}Fe=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof kt.resetScene=="function"&&kt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Ut("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Zi(o)),Wn(a,o,Lt).then(l=>{Fe=l.app,window.gameApp=Fe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Fn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:kt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}Ee&&Ee.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Pe.start()}catch{}})})},100)},1e3)}};var Me={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},wo=1.25,xo={fontFamily:"Inter, system-ui, sans-serif"};var Yn=class{constructor(e={}){this.currentProgress=0;var t;this.currentProgress=(t=e.progress)!=null?t:0,this.container=this.createContainer()}createContainer(){let e=document.createElement("div");e.className="handler-loading-screen",e.style.cssText=`
2380
2381
  position: fixed;
2381
2382
  inset: 0;
2382
2383
  display: flex;
@@ -2575,7 +2576,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2575
2576
  0%, 100% { opacity: 1; }
2576
2577
  50% { opacity: 0.3; }
2577
2578
  }
2578
- `,document.head.appendChild(e)}setProgress(e){this.currentProgress=Math.max(0,Math.min(100,e)),this.progressBar.style.width=`${this.currentProgress}%`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`}mount(e=document.body){e.appendChild(this.container)}unmount(){this.container.parentElement&&this.container.parentElement.removeChild(this.container)}getElement(){return this.container}};var Kn=ja.version,So=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);Ia();var es={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},ts=Math.random().toString(36).slice(2),gt=null,pt={...es},is="web_embed",Qn={},Mt,Xn=!1,Pt=!1,jt=!1,ns=!1,na=1,Ni=0,Ui=!1,Ie=!1,ut="",ht=Math.floor(window.innerWidth),mt=Math.floor(window.innerHeight),ea=ht>mt,je=!1,It=!1,Yr=!1,Kr=!1,Jn=!1,Fi=null,Ze=null,ta=!1,ia=!1,Hi=new Map;function as(){if(!Ze)return null;let s=Date.now()-Ze;return!Number.isFinite(s)||s<0?null:s}function Zn(s){if(ta)return;let e=as();e!==null&&(ta=!0,z("session_time",{duration_ms:e,reason:s}))}function Xr(){if(gt)return gt;let s=document.createElement("div");return s.id="handler-root",s.setAttribute("data-handler-root","true"),document.body.appendChild(s),gt=s,s}function Bi(s){switch(s){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return s}}function rs(s,e){return{event_name:s,ts:Date.now(),session_id:ts,deployment_id:pt.deployment_id,variant_id:pt.variant_id,export_profile_id:pt.profile_id,instance_id:pt.instance_id||"default",env:is==="mraid"?"mraid":"web",attribution:Mt,payload:e}}function z(s,e){let t=Bi(s),i=rs(t,e);tn(i,!!Qn.analytics),qt(t,i),t!==s&&qt(s,i)}function _t(){Fi&&(Fi(ht,mt),Fi=null)}function ft(s){na=s,z("volume",s)}function bt(s){s&&(ns=!0),!jt&&(jt=!0,z("pause"),ft(0))}function Ot(s){!s&&ns||jt&&(jt=!1,z("resume"),ft(na))}function Ue(s,e){ht=Math.floor(s||window.innerWidth),mt=Math.floor(e||window.innerHeight),ea=ht>mt,z("resize",{width:ht,height:mt})}function Eo(){if(Ga())try{let s=mraid.getMaxSize();Ue(s.width,s.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Ot():bt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Ue(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();ft(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&ft(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Ui=!0,mraid.isViewable()&&mraid.getState()!=="hidden")je=!0,z("boot"),z("view"),z("ready"),Ie=!0,_t();else{let t=()=>{je=!0,z("boot"),z("view"),z("ready"),Ie=!0,_t()};mraid.addEventListener("ready",t)}}catch(s){console.warn("MRAID hook skipped",s)}}function Ao(){if(qa())try{let s=dapi.getScreenSize();Ue(s.width,s.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Ot():bt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Ue(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(ft(e?1:0),dapi.addEventListener("audioVolumeChange",t=>ft(t?1:0)),Ui=!0,dapi.isViewable())je=!0,z("boot"),z("view"),z("ready"),Ie=!0,_t();else{let t=()=>{je=!0,z("boot"),z("view"),z("ready"),Ie=!0,_t()};dapi.addEventListener("ready",t)}}catch(s){console.warn("DAPI hook skipped",s)}}function Jr(){let s=()=>{je||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(je=!0,z("boot"),z("view"),z("ready"),Ie=!0,_t(),It&&(It=!1,Ae.start()))};window.addEventListener("resize",()=>Ue()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Ot(),s()):bt()}),document.readyState==="complete"||document.readyState==="interactive"?s():window.addEventListener("load",s),Ui=!0}function Co(){let s=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Yr=!0),!(Yr&&e instanceof MouseEvent)&&(Ni+=1,ia||(ia=!0,z("first_interaction",{count:Ni})),z("interaction",Ni))};document.addEventListener("mousedown",s),document.addEventListener("touchstart",s)}function Zr(s){var i,n,a,r,o,l,c,d,p,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(s||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(it())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(Va())(o=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||o.call(r);else if(Xa())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ka())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(m){console.warn("Smadex redirect failed",m)}else if(Wa()){let m=window.ExitApi;m&&typeof m.exit=="function"?m.exit(s||ut||""):s&&window.open(s)}else tt()?(u=window.install)==null||u.call(window):Ya()?(g=window.openAppStore)==null||g.call(window):nn()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):s&&window.open(s)}function To(){let s=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(s==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;pe("view",()=>e(t.mraid_viewable)),pe("start",()=>e(t.game_viewable)),pe("engagement",()=>e(t.engagement));let i=()=>e(t.complete);pe("complete",i),Gt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),pe("cta_click",()=>e(t.click))}else if(s==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;pe("view",()=>e(t.Ad_Load_Start)),pe("start",()=>e(t.Ad_Viewable)),pe("engagement",()=>e(t.First_Engagement)),pe("complete",()=>e(t.Gameplay_Complete)),pe("cta_click",()=>e(t.DSP_Click)),pe("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Lo(){if(!it())return;let s=window.TJ_API;s&&s.setPlayableAPI&&s.setPlayableAPI({skipAd:()=>{try{Ae.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Qr(){var e,t,i;let s=window.TJ_API;(e=s==null?void 0:s.objectiveComplete)==null||e.call(s),(t=s==null?void 0:s.playableFinished)==null||t.call(s),(i=s==null?void 0:s.gameplayFinished)==null||i.call(s)}function ko(){tt()&&(window.mintGameStart=()=>{Ot(!0),Ue()},window.mintGameClose=()=>{bt(!0)})}function Po(){if(!an())return;let s=window.NUC;!s||!s.trigger||(Ae.on("cta_click",()=>{var e,t;return(t=(e=s.trigger).convert)==null?void 0:t.call(e,ut)}),Ae.on("complete",()=>{var e,t;return(t=(e=s.trigger).tryAgain)==null?void 0:t.call(e)}))}var Ae={init(s={},e){var t;if(is=s.profile||"web_embed",Qn=s.consent||{},pt={...es,...s.ids||{}},gt=s.rootEl||gt,Mt=void 0,Aa((t=s.telemetry)!=null&&t.endpoint?s.telemetry:null),Ze=null,ta=!1,ia=!1,Hi.clear(),ut=s.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Fi=e),z("init"),document.body.oncontextmenu=()=>!1,Xr(),Io(gt),Ja(),Eo(),Ao(),!Ui){if(document.readyState==="complete")Jr();else if(!Kr){Kr=!0;let i=()=>{Jr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Co(),To(),Lo(),ko(),Po(),console.log(`%c @handler/playable-sdk %c v${Kn} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),je&&!Ie&&(z("boot"),z("view"),z("ready"),It&&(It=!1,Ae.start()),Ie=!0),Ie=je},getRoot(){return Xr()},get version(){return Kn},get maxWidth(){return ht},get maxHeight(){return mt},get isLandscape(){return ea},get isReady(){return Ie},get isStarted(){return Xn},get isPaused(){return jt},get isFinished(){return Pt},get volume(){return na},get interactions(){return Ni},on(s,e){Gt(Bi(s),e)},off(s,e){en(Bi(s),e)},start(){var s,e;if(!Xn){if(!je){It=!0;return}if(Xn=!0,Ze||(Ze=Date.now()),z("start"),Ue(),tt())bt(),(s=window.gameReady)==null||s.call(window);else if(it()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:ea?"landscape":"portrait",buildID:Kn})}}},finish(){var s,e;Pt||(Pt=!0,z("complete"),Zn("complete"),tt()?(s=window.gameEnd)==null||s.call(window):nn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):it()&&Qr())},install(s){if(!Pt){Pt=!0,it()?(Qr(),setTimeout(()=>Ae.install(s),300)):(z("complete"),setTimeout(()=>Ae.install(s),0));return}Jn||(Jn=!0,setTimeout(()=>Jn=!1,500),z("cta_click"),z("conversion"),Zn("cta"),Zr(s||ut))},emit(s,e){let t=Bi(s);if(!So.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${s} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=rs(t,e);tn(i,!!Qn.analytics),qt(t,i)},gameStart(){Ae.start()},gameEnd(){Ae.finish()},ctaClick(s,e){z("cta_click",{url:s||ut,manual:!0}),(e==null?void 0:e.open)!==!1&&Zr(s||ut)},ctaShow(s){z("cta_show",s)},ctaDismiss(s){z("cta_dismiss",s)},getGameTimeMs(){return as()},endSession(s="manual"){Zn(s)},setAttribution(s){Mt=s},abTest(s,e){if(!s)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(Mo(`${ts}:${s}`))%e.length,i=e[t];return Mt={...Mt||{},experiment_id:s},pt.variant_id=i,z("ab_assign",{experiment_id:s,variant_id:i}),i},levelStart(s,e){Ze||(Ze=Date.now()),z("level_start",{level_id:s,...e})},levelComplete(s,e){z("level_complete",{level_id:s,...e})},levelFail(s,e){z("level_fail",{level_id:s,...e})},checkpoint(s,e){z("checkpoint",{checkpoint_id:s,...e})},reward(s,e){z("reward",{reward_id:s,...e})},tutorialStart(s,e){z("tutorial_start",{step_id:s,...e})},tutorialComplete(s,e){z("tutorial_complete",{step_id:s,...e})},tutorialSkip(s,e){z("tutorial_skip",{step_id:s,...e})},timerStart(s){s&&Hi.set(s,Date.now())},timerEnd(s,e="custom",t){if(!s)return;let i=Hi.get(s);if(!i)return;Hi.delete(s);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){z("engagement",{action:"timer",key:s,duration_ms:n,...t});return}z(e,{key:s,duration_ms:n,...t})}},fps(s,e){z("fps",{value:s,...e})},memory(s,e){z("memory",{bytes:s,...e})},assetLoadStart(s,e){z("asset_load_start",{asset_id:s,...e})},assetLoadComplete(s,e){z("asset_load_complete",{asset_id:s,...e})},reportError(s,e,t){z("error",{code:s,message:e,...t})},retry(){var s,e,t;if(tt())(s=window.gameRetry)==null||s.call(window);else if(an()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}z("engagement",{action:"retry"})},pause(){bt(!0)},resume(){Ot(!0)},resize(s,e){Ue(s,e)}},Pe=Ae;function Mo(s){let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function Io(s){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2579
+ `,document.head.appendChild(e)}setProgress(e){this.currentProgress=Math.max(0,Math.min(100,e)),this.progressBar.style.width=`${this.currentProgress}%`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`}mount(e=document.body){e.appendChild(this.container)}unmount(){this.container.parentElement&&this.container.parentElement.removeChild(this.container)}getElement(){return this.container}};var Kn=ja.version,So=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);Ia();var es={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},ts=Math.random().toString(36).slice(2),gt=null,pt={...es},is="web_embed",Qn={},Mt,Xn=!1,Pt=!1,jt=!1,ns=!1,na=1,Ni=0,Ui=!1,Ie=!1,ut="",ht=Math.floor(window.innerWidth),mt=Math.floor(window.innerHeight),ea=ht>mt,je=!1,It=!1,Yr=!1,Kr=!1,Jn=!1,Bi=null,Qe=null,ta=!1,ia=!1,Hi=new Map;function as(){if(!Qe)return null;let s=Date.now()-Qe;return!Number.isFinite(s)||s<0?null:s}function Zn(s){if(ta)return;let e=as();e!==null&&(ta=!0,R("session_time",{duration_ms:e,reason:s}))}function Xr(){if(gt)return gt;let s=document.createElement("div");return s.id="handler-root",s.setAttribute("data-handler-root","true"),document.body.appendChild(s),gt=s,s}function Fi(s){switch(s){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return s}}function rs(s,e){return{event_name:s,ts:Date.now(),session_id:ts,deployment_id:pt.deployment_id,variant_id:pt.variant_id,export_profile_id:pt.profile_id,instance_id:pt.instance_id||"default",env:is==="mraid"?"mraid":"web",attribution:Mt,payload:e}}function R(s,e){let t=Fi(s),i=rs(t,e);tn(i,!!Qn.analytics),qt(t,i),t!==s&&qt(s,i)}function Ot(){Bi&&(Bi(ht,mt),Bi=null)}function ft(s){na=s,R("volume",s)}function bt(s){s&&(ns=!0),!jt&&(jt=!0,R("pause"),ft(0))}function _t(s){!s&&ns||jt&&(jt=!1,R("resume"),ft(na))}function Ue(s,e){ht=Math.floor(s||window.innerWidth),mt=Math.floor(e||window.innerHeight),ea=ht>mt,R("resize",{width:ht,height:mt})}function Eo(){if(Ga())try{let s=mraid.getMaxSize();Ue(s.width,s.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?_t():bt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Ue(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();ft(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&ft(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Ui=!0,mraid.isViewable()&&mraid.getState()!=="hidden")je=!0,R("boot"),R("view"),R("ready"),Ie=!0,Ot();else{let t=()=>{je=!0,R("boot"),R("view"),R("ready"),Ie=!0,Ot()};mraid.addEventListener("ready",t)}}catch(s){console.warn("MRAID hook skipped",s)}}function Ao(){if(qa())try{let s=dapi.getScreenSize();Ue(s.width,s.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?_t():bt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Ue(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(ft(e?1:0),dapi.addEventListener("audioVolumeChange",t=>ft(t?1:0)),Ui=!0,dapi.isViewable())je=!0,R("boot"),R("view"),R("ready"),Ie=!0,Ot();else{let t=()=>{je=!0,R("boot"),R("view"),R("ready"),Ie=!0,Ot()};dapi.addEventListener("ready",t)}}catch(s){console.warn("DAPI hook skipped",s)}}function Jr(){let s=()=>{je||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(je=!0,R("boot"),R("view"),R("ready"),Ie=!0,Ot(),It&&(It=!1,Ae.start()))};window.addEventListener("resize",()=>Ue()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(_t(),s()):bt()}),document.readyState==="complete"||document.readyState==="interactive"?s():window.addEventListener("load",s),Ui=!0}function Co(){let s=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Yr=!0),!(Yr&&e instanceof MouseEvent)&&(Ni+=1,ia||(ia=!0,R("first_interaction",{count:Ni})),R("interaction",Ni))};document.addEventListener("mousedown",s),document.addEventListener("touchstart",s)}function Zr(s){var i,n,a,r,o,l,c,d,p,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(s||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(nt())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(Va())(o=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||o.call(r);else if(Xa())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ka())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(m){console.warn("Smadex redirect failed",m)}else if(Wa()){let m=window.ExitApi;m&&typeof m.exit=="function"?m.exit(s||ut||""):s&&window.open(s)}else it()?(u=window.install)==null||u.call(window):Ya()?(g=window.openAppStore)==null||g.call(window):nn()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):s&&window.open(s)}function To(){let s=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(s==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;pe("view",()=>e(t.mraid_viewable)),pe("start",()=>e(t.game_viewable)),pe("engagement",()=>e(t.engagement));let i=()=>e(t.complete);pe("complete",i),Gt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),pe("cta_click",()=>e(t.click))}else if(s==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;pe("view",()=>e(t.Ad_Load_Start)),pe("start",()=>e(t.Ad_Viewable)),pe("engagement",()=>e(t.First_Engagement)),pe("complete",()=>e(t.Gameplay_Complete)),pe("cta_click",()=>e(t.DSP_Click)),pe("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Lo(){if(!nt())return;let s=window.TJ_API;s&&s.setPlayableAPI&&s.setPlayableAPI({skipAd:()=>{try{Ae.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Qr(){var e,t,i;let s=window.TJ_API;(e=s==null?void 0:s.objectiveComplete)==null||e.call(s),(t=s==null?void 0:s.playableFinished)==null||t.call(s),(i=s==null?void 0:s.gameplayFinished)==null||i.call(s)}function ko(){it()&&(window.mintGameStart=()=>{_t(!0),Ue()},window.mintGameClose=()=>{bt(!0)})}function Po(){if(!an())return;let s=window.NUC;!s||!s.trigger||(Ae.on("cta_click",()=>{var e,t;return(t=(e=s.trigger).convert)==null?void 0:t.call(e,ut)}),Ae.on("complete",()=>{var e,t;return(t=(e=s.trigger).tryAgain)==null?void 0:t.call(e)}))}var Ae={init(s={},e){var t;if(is=s.profile||"web_embed",Qn=s.consent||{},pt={...es,...s.ids||{}},gt=s.rootEl||gt,Mt=void 0,Aa((t=s.telemetry)!=null&&t.endpoint?s.telemetry:null),Qe=null,ta=!1,ia=!1,Hi.clear(),ut=s.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Bi=e),R("init"),document.body.oncontextmenu=()=>!1,Xr(),Io(gt),Ja(),Eo(),Ao(),!Ui){if(document.readyState==="complete")Jr();else if(!Kr){Kr=!0;let i=()=>{Jr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Co(),To(),Lo(),ko(),Po(),console.log(`%c @handler/playable-sdk %c v${Kn} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),je&&!Ie&&(R("boot"),R("view"),R("ready"),It&&(It=!1,Ae.start()),Ie=!0),Ie=je},getRoot(){return Xr()},get version(){return Kn},get maxWidth(){return ht},get maxHeight(){return mt},get isLandscape(){return ea},get isReady(){return Ie},get isStarted(){return Xn},get isPaused(){return jt},get isFinished(){return Pt},get volume(){return na},get interactions(){return Ni},on(s,e){Gt(Fi(s),e)},off(s,e){en(Fi(s),e)},start(){var s,e;if(!Xn){if(!je){It=!0;return}if(Xn=!0,Qe||(Qe=Date.now()),R("start"),Ue(),it())bt(),(s=window.gameReady)==null||s.call(window);else if(nt()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:ea?"landscape":"portrait",buildID:Kn})}}},finish(){var s,e;Pt||(Pt=!0,R("complete"),Zn("complete"),it()?(s=window.gameEnd)==null||s.call(window):nn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):nt()&&Qr())},install(s){if(!Pt){Pt=!0,nt()?(Qr(),setTimeout(()=>Ae.install(s),300)):(R("complete"),setTimeout(()=>Ae.install(s),0));return}Jn||(Jn=!0,setTimeout(()=>Jn=!1,500),R("cta_click"),R("conversion"),Zn("cta"),Zr(s||ut))},emit(s,e){let t=Fi(s);if(!So.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${s} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=rs(t,e);tn(i,!!Qn.analytics),qt(t,i)},gameStart(){Ae.start()},gameEnd(){Ae.finish()},ctaClick(s,e){R("cta_click",{url:s||ut,manual:!0}),(e==null?void 0:e.open)!==!1&&Zr(s||ut)},ctaShow(s){R("cta_show",s)},ctaDismiss(s){R("cta_dismiss",s)},getGameTimeMs(){return as()},endSession(s="manual"){Zn(s)},setAttribution(s){Mt=s},abTest(s,e){if(!s)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(Mo(`${ts}:${s}`))%e.length,i=e[t];return Mt={...Mt||{},experiment_id:s},pt.variant_id=i,R("ab_assign",{experiment_id:s,variant_id:i}),i},levelStart(s,e){Qe||(Qe=Date.now()),R("level_start",{level_id:s,...e})},levelComplete(s,e){R("level_complete",{level_id:s,...e})},levelFail(s,e){R("level_fail",{level_id:s,...e})},checkpoint(s,e){R("checkpoint",{checkpoint_id:s,...e})},reward(s,e){R("reward",{reward_id:s,...e})},tutorialStart(s,e){R("tutorial_start",{step_id:s,...e})},tutorialComplete(s,e){R("tutorial_complete",{step_id:s,...e})},tutorialSkip(s,e){R("tutorial_skip",{step_id:s,...e})},timerStart(s){s&&Hi.set(s,Date.now())},timerEnd(s,e="custom",t){if(!s)return;let i=Hi.get(s);if(!i)return;Hi.delete(s);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){R("engagement",{action:"timer",key:s,duration_ms:n,...t});return}R(e,{key:s,duration_ms:n,...t})}},fps(s,e){R("fps",{value:s,...e})},memory(s,e){R("memory",{bytes:s,...e})},assetLoadStart(s,e){R("asset_load_start",{asset_id:s,...e})},assetLoadComplete(s,e){R("asset_load_complete",{asset_id:s,...e})},reportError(s,e,t){R("error",{code:s,message:e,...t})},retry(){var s,e,t;if(it())(s=window.gameRetry)==null||s.call(window);else if(an()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}R("engagement",{action:"retry"})},pause(){bt(!0)},resume(){_t(!0)},resize(s,e){Ue(s,e)}},Pe=Ae;function Mo(s){let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function Io(s){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2579
2580
  (function(){
2580
2581
  var events = ['touchstart','touchend','mousedown','keydown'];
2581
2582
  function unlock(){
@@ -2591,7 +2592,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2591
2592
  }
2592
2593
  events.forEach(function(e){ document.addEventListener(e, unlock, false); });
2593
2594
  })();
2594
- `,s.appendChild(e)}async function aa(s,e={}){let t=new jo;await t.init({resizeTo:s,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=r=>{var p,u,g,h;if(!t.renderer)return;let o=(p=r==null?void 0:r.width)!=null?p:s.clientWidth,l=(u=r==null?void 0:r.height)!=null?u:s.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(h=window.innerHeight)!=null?h:480;t.renderer.resize(c,d)};s.appendChild(t.canvas),s.style.position="relative",s.style.display="flex",s.style.flexDirection="column",s.style.alignItems="stretch",s.style.width="100%",s.style.height="100dvh",s.style.minHeight="100vh",s.style.maxWidth="100%",s.style.maxHeight="100%",s.style.boxSizing="border-box",s.style.overflow="hidden",e.background&&(s.style.background=e.background),i();let n=document.createElement("div");return n.setAttribute("style",["position:absolute","inset:0","display:flex","flex-direction:column","align-items:center","justify-content:flex-start","gap:12px","pointer-events:none","font-family:Arial,sans-serif","padding:20px 16px","padding-bottom:clamp(24px, 6vh, 96px)","box-sizing:border-box","z-index:2"].join(";")),s.appendChild(n),Pe.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),Pe.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),Pe.on("resize",({payload:r})=>{i({width:r==null?void 0:r.width,height:r==null?void 0:r.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(r=>{let o=r[0];if(o&&o.contentRect.width>0&&o.contentRect.height>0){let l=Math.round(o.contentRect.width),c=Math.round(o.contentRect.height);if(i({width:l,height:c}),typeof window!="undefined"&&window.gameApp&&window.gameObjectManager){let d={width:l,height:c,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:"auto-resize",isLandscape:l>c};window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:d}))}}}).observe(s),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as ra,Ticker as vt,ColorMatrixFilter as _o}from"pixi.js";var Gi=class{constructor(e){var n,a;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset;this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0},this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0},this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y},this.scale=(n=e==null?void 0:e.scale)!=null?n:1,this.rotation=(a=e==null?void 0:e.rotation)!=null?a:0}update(e){let t=e.position,i=e.offset;t!==void 0&&(this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0}),i!==void 0&&(this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0}),(t!==void 0||i!==void 0)&&(this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y}),e.scale!==void 0&&(this.scale=e.scale),e.rotation!==void 0&&(this.rotation=e.rotation)}syncToPixi(e){e&&(e.position.set(this.position.x,this.position.y),e.scale.set(this.scale),e.rotation=this.rotation)}},qi=class{constructor(e){var t,i,n,a;this.z_index=(t=e==null?void 0:e.z_index)!=null?t:0,this.alpha=(i=e==null?void 0:e.alpha)!=null?i:1,this.visible=(n=e==null?void 0:e.visible)!=null?n:!0,this.tint=(a=e==null?void 0:e.tint)!=null?a:null}update(e){e.z_index!==void 0&&(this.z_index=e.z_index),e.alpha!==void 0&&(this.alpha=e.alpha),e.visible!==void 0&&(this.visible=e.visible),e.tint!==void 0&&(this.tint=e.tint)}syncToPixi(e,t){if(!e)return;if(e.zIndex=this.z_index,t!=null&&t.startsWith("ui_endgame_")||(e.alpha=this.alpha),e.visible=this.visible,this.tint!==null&&"tint"in e&&(e.tint=this.tint),t&&"texture"in e)try{let{AssetTextures:n}=ps("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},Vi=class{constructor(e,t,i,n){this._tickerCleanup=null;this.onRebuildRequired=null;this.instanceId=e,this.objectConfig=t,this.pixiObject=i,this._config=n,this.transform=new Gi(n.transform),this.renderer=new qi(n.render),this.sync()}sync(){this.transform.syncToPixi(this.pixiObject),this.renderer.syncToPixi(this.pixiObject,this.instanceId),this.applyAnchor(),this.applyEffectsScale(),this.applyEffects(),this.syncTextProperties(),(!this._initialized||this._shouldReplayIntro)&&(this.applyIntro(),this._initialized=!0,this._shouldReplayIntro=!1),this.applyMotion()}syncTextProperties(){var t;if(!this.pixiObject||!("text"in this.pixiObject))return;let e=(t=this._config)==null?void 0:t.ui;e&&(e.text!==void 0&&this.pixiObject.text!==e.text&&(this.pixiObject.text=e.text),this.pixiObject.style&&(e.fontSize!==void 0&&(this.pixiObject.style.fontSize=e.fontSize),e.color!==void 0&&(this.pixiObject.style.fill=e.color),e.align!==void 0&&(this.pixiObject.style.align=e.align)))}destroy(){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null),this._introTicker&&(vt.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,d,p,u,g,h,m,f,b,v;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(d=e==null?void 0:e.motion)==null?void 0:d.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(u=(p=this._config)==null?void 0:p.render)==null?void 0:u.asset)==null?void 0:g.type,a=(m=(h=e==null?void 0:e.render)==null?void 0:h.asset)==null?void 0:m.type,r=(b=(f=this._config)==null?void 0:f.ui)==null?void 0:b.renderMode,o=(v=e==null?void 0:e.ui)==null?void 0:v.renderMode;if((n!==a||r!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${r} to ${a}/${o}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,a,r,o;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(a=(n=this._config)==null?void 0:n.render)==null?void 0:a.anchor,t=(o=(r=this._config)==null?void 0:r.transform)==null?void 0:o.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var a,r,o;if(!((a=this.pixiObject)!=null&&a.scale))return;let e=(r=this._config)==null?void 0:r.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(o=this.transform.scale)!=null?o:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,a,r,o,l,c,d,p;if(!this.pixiObject)return;let e=(i=this._config)==null?void 0:i.effects;if(!e||e.enabled===!1){this.pixiObject.filters=null;return}let t=[];if((n=e.blur)!=null&&n.enabled){let u=new ra;u.blur=(a=e.blur.strength)!=null?a:4,t.push(u)}if((r=e.shadow)!=null&&r.enabled){let u=e.shadow,g=new ra;g.blur=(o=u.blur)!=null?o:4,g.blendMode="multiply",t.push(g),(u.offsetX!==0||u.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let u=e.glow,g=new ra;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let h=new _o,m=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;h.tint(m),t.push(h)}}(d=e.stroke)!=null&&d.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(p=e.distortion)!=null&&p.enabled&&console.warn("[Effects] Distortion effect requires pixi-filters or a displacement map. Install: npm install pixi-filters"),this.pixiObject.filters=t.length>0?t:null}applyIntro(){var d,p,u,g,h,m,f;let e=(d=this._config)==null?void 0:d.motion;if(!e||!((p=e.intro)!=null&&p.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,a=this.transform.position.y,r=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_y)||1);if(this.pixiObject.alpha=(f=t.startAlpha)!=null?f:0,t.startScale!==void 0&&this.pixiObject.scale.set(r*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=a+(t.startYOffset||0)),this._introTicker&&vt.shared.remove(this._introTicker),i<=0&&n<=0){this.pixiObject.alpha=this.renderer.alpha,this.pixiObject.y=this.transform.position.y,this.pixiObject.scale.set(r,o);return}let l=0,c=b=>{var _,O,T,A,k,C;if(l+=b.deltaTime/60,l<n)return;let v=i>0?Math.min(1,(l-n)/i):1,w=1-Math.pow(1-v,3),y=this.renderer.alpha,x=this.transform.scale*(((O=(_=this._config)==null?void 0:_.effects)==null?void 0:O.scale_x)||1),M=this.transform.scale*(((A=(T=this._config)==null?void 0:T.effects)==null?void 0:A.scale_y)||1),j=this.transform.position.y,L=this.transform.position.x;if(this.pixiObject.alpha=((k=t.startAlpha)!=null?k:0)+(y-((C=t.startAlpha)!=null?C:0))*w,t.startScale!==void 0){let E=t.startScale+(1-t.startScale)*w;this.pixiObject.scale.set(x*E,M*E)}t.startYOffset!==void 0&&(this.pixiObject.y=j+t.startYOffset+(j-(j+t.startYOffset))*w),v>=1&&(vt.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=y,this.pixiObject.x=L,this.pixiObject.y=j,this.pixiObject.scale.set(x,M))};this._introTicker=c,vt.shared.add(c)}applyMotion(){var p,u,g,h,m,f;let e=(p=this._config)==null?void 0:p.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(this._lastMotionStr===i&&this._tickerCleanup)return;if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),!(((u=e.pulse)==null?void 0:u.enabled)||((g=e.swing)==null?void 0:g.enabled)||((h=e.continuousMove)==null?void 0:h.enabled)||((m=e.continuousRotate)==null?void 0:m.enabled)||((f=e.orbit)==null?void 0:f.enabled)))return;let a=0,r=0,o=0,l=0,c=1/60,d=b=>{var T,A,k,C,E,S,I,P,R,D,N,H,F,G,Y,Q,ie,le,$,Z,ce,he,de,ve,Ce,Te;let v=((T=b.deltaTime)!=null?T:1)*c;a+=b.deltaTime*.05;let w=this.transform.scale,y=w*(((k=(A=this._config)==null?void 0:A.effects)==null?void 0:k.scale_x)||1),x=w*(((E=(C=this._config)==null?void 0:C.effects)==null?void 0:E.scale_y)||1),M=this.transform.position.x,j=this.transform.position.y,L=this.transform.rotation,_=0,O=0;if((S=e.swing)!=null&&S.enabled){let q=(I=e.swing.amplitude)!=null?I:10,ee=(P=e.swing.speed)!=null?P:1,K=Math.sin(a*ee)*q;e.swing.axis==="vertical"?O+=K:e.swing.axis==="both"?(_+=K,O+=K):_+=K}if((R=e.continuousMove)!=null&&R.enabled){let q=(D=e.continuousMove.axis)!=null?D:"x",ee=Math.max(0,(N=e.continuousMove.speed)!=null?N:50),K=Math.sign((H=e.continuousMove.direction)!=null?H:1)||1,ae=Math.max(0,(F=e.continuousMove.lifetime)!=null?F:0);r+=v;let _e=ae>0?Math.min(r,ae):r,Ge=ee*K*_e;(q==="x"||q==="both")&&(_+=Ge),(q==="y"||q==="both")&&(O+=Ge)}if((G=e.orbit)!=null&&G.enabled){let q=Math.max(0,(Y=e.orbit.radius)!=null?Y:50),ee=Math.max(0,(Q=e.orbit.speed)!=null?Q:45),K=Math.sign((ie=e.orbit.direction)!=null?ie:1)||1,ae=ee*Math.PI/180;l+=ae*K*v;let _e=(le=e.orbit.pivotOffsetX)!=null?le:0,Ge=($=e.orbit.pivotOffsetY)!=null?$:0;_+=_e+q*Math.cos(l),O+=Ge+q*Math.sin(l)}if(this.pixiObject.x=M+_,this.pixiObject.y=j+O,(Z=e.pulse)!=null&&Z.enabled){let q=(ce=e.pulse.intensity)!=null?ce:.1,ee=(he=e.pulse.speed)!=null?he:1,ae=1+Math.sin(a*ee)*q;(de=this.pixiObject.scale)!=null&&de.set?this.pixiObject.scale.set(y*ae,x*ae):this.pixiObject.scale&&(this.pixiObject.scale.x=y*ae,this.pixiObject.scale.y=x*ae)}if((ve=e.continuousRotate)!=null&&ve.enabled){let q=Math.max(0,(Ce=e.continuousRotate.speed)!=null?Ce:90),ee=Math.sign((Te=e.continuousRotate.direction)!=null?Te:1)||1,K=q*Math.PI/180;o+=K*ee*v,this.pixiObject.rotation=L+o}};vt.shared.add(d),this._tickerCleanup=()=>{var b,v,w,y,x;if(vt.shared.remove(d),this.pixiObject){let M=this.transform.scale*(((v=(b=this._config)==null?void 0:b.effects)==null?void 0:v.scale_x)||1),j=this.transform.scale*(((y=(w=this._config)==null?void 0:w.effects)==null?void 0:y.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(x=this.pixiObject.scale)!=null&&x.set?this.pixiObject.scale.set(M,j):this.pixiObject.scale&&(this.pixiObject.scale.x=M,this.pixiObject.scale.y=j)}}}getComponent(e){return this._config[e]}getPosition(){return{...this.transform.position}}setPosition(e,t){this.transform.position={x:e,y:t},this.transform.syncToPixi(this.pixiObject)}getAlpha(){return this.renderer.alpha}setAlpha(e){this.renderer.alpha=e,this.renderer.syncToPixi(this.pixiObject)}getVisible(){return this.renderer.visible}setVisible(e){this.renderer.visible=e,this.renderer.syncToPixi(this.pixiObject)}},Rt=class{constructor(e){this.objects=new Map;this.onObjectRebuildRequired=null;this.config=e}create(e,t){let i=this.config.objects.get(e);if(!i)throw new Error(`Object config not found: ${e}`);let n=new Vi(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,r)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,r);o&&this.objects.get(e)===o&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),a.updateConfig(r)},n}get(e){return this.objects.get(e)}updateConfig(e){this.config=e;for(let[t,i]of this.objects.entries()){let n=e.objects.get(t);n&&i.updateConfig(n)}}getAll(){return Array.from(this.objects.values())}remove(e){let t=this.objects.get(e);t&&t.destroy(),this.objects.delete(e)}clear(){for(let e of this.objects.values())e.destroy();this.objects.clear()}};var Wi={"brand.primary":{family:"Arial, sans-serif",weight:"400"},"brand.warning":{family:"Arial Black, Arial, sans-serif",weight:"900"},"brand.heading":{family:"Arial Black, Arial, sans-serif",weight:"800"},"brand.body":{family:"Arial, sans-serif",weight:"400"}};function Oo(s){let e=Wi[s];return e?e.family:(console.warn(`Font ID "${s}" not found in registry, using fallback`),"Arial, sans-serif")}function Ro(s){var t;let e=Wi[s];return e&&(t=e.weight)!=null?t:"400"}function zo(s,e){Wi[s]=e}function Do(){return Object.keys(Wi)}var yt=null;function $o(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!yt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),yt||(typeof window!="undefined"&&window.lottie?(yt=window.lottie,console.log("[LottieOverlay] \u2705 Found window.lottie, cached it")):(console.warn("[LottieOverlay] \u274C lottie-web is not available globally. Make sure it is loaded before using Lottie animations."),console.log("[LottieOverlay] window keys:",typeof window!="undefined"?Object.keys(window).filter(s=>s.toLowerCase().includes("lottie")):"no window"),yt=null)),yt}function Ho(s){return!s||s.startsWith("http://")||s.startsWith("https://")||s.startsWith("/")?s:`/${s.replace(/^\.\//,"")}`}function No(s){try{let e=new XMLHttpRequest;return e.open("GET",Ho(s),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function ss(s){return!s||typeof s!="object"||!Array.isArray(s.layers)?null:(Array.isArray(s.assets)||(s.assets=[]),Array.isArray(s.chars)||(s.chars=[]),s)}function Vn(s){yt=s}function Fo(s,e,t,i){var M,j,L,_,O,T,A,k,C,E,S,I,P,R,D,N,H,F,G;let n=t.objects.get(s);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${s}`),null;let a=((M=n.effects)==null?void 0:M.lottie)||{},r=n.transform||{},o=n.render||{};if(a.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[s],c=ss(l);if(!c){let Y=(L=(j=n.render)==null?void 0:j.asset)==null?void 0:L.path;if(typeof Y=="string"&&Y.toLowerCase().endsWith(".json")){let Q=No(Y);if(c=ss(Q),c)try{i[s]=c}catch{}}}if(!c){let Y=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${s}`,{kind:Y}),null}let d=$o();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${s}`),null;let p=(_=a.width)!=null?_:300,u=(O=a.height)!=null?O:300,g=(T=r.scale)!=null?T:1,h=((k=(A=r.position)==null?void 0:A.x)!=null?k:0)+((E=(C=r.offset)==null?void 0:C.x)!=null?E:0),m=((I=(S=r.position)==null?void 0:S.y)!=null?I:0)+((R=(P=r.offset)==null?void 0:P.y)!=null?R:0),f=(D=r.rotation)!=null?D:0,b=(N=o.z_index)!=null?N:100,v=(H=o.alpha)!=null?H:1,w=document.createElement("div");w.style.cssText=`
2595
+ `,s.appendChild(e)}async function aa(s,e={}){let t=new jo;await t.init({resizeTo:s,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=r=>{var p,u,g,h;if(!t.renderer)return;let o=(p=r==null?void 0:r.width)!=null?p:s.clientWidth,l=(u=r==null?void 0:r.height)!=null?u:s.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(h=window.innerHeight)!=null?h:480;t.renderer.resize(c,d)};s.appendChild(t.canvas),s.style.position="relative",s.style.display="flex",s.style.flexDirection="column",s.style.alignItems="stretch",s.style.width="100%",s.style.height="100dvh",s.style.minHeight="100vh",s.style.maxWidth="100%",s.style.maxHeight="100%",s.style.boxSizing="border-box",s.style.overflow="hidden",e.background&&(s.style.background=e.background),i();let n=document.createElement("div");return n.setAttribute("style",["position:absolute","inset:0","display:flex","flex-direction:column","align-items:center","justify-content:flex-start","gap:12px","pointer-events:none","font-family:Arial,sans-serif","padding:20px 16px","padding-bottom:clamp(24px, 6vh, 96px)","box-sizing:border-box","z-index:2"].join(";")),s.appendChild(n),Pe.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),Pe.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),Pe.on("resize",({payload:r})=>{i({width:r==null?void 0:r.width,height:r==null?void 0:r.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(r=>{let o=r[0];if(o&&o.contentRect.width>0&&o.contentRect.height>0){let l=Math.round(o.contentRect.width),c=Math.round(o.contentRect.height);if(i({width:l,height:c}),typeof window!="undefined"&&window.gameApp&&window.gameObjectManager){let d={width:l,height:c,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:"auto-resize",isLandscape:l>c};window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:d}))}}}).observe(s),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as ra,Ticker as vt,ColorMatrixFilter as Oo}from"pixi.js";var Gi=class{constructor(e){var n,a;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset;this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0},this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0},this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y},this.scale=(n=e==null?void 0:e.scale)!=null?n:1,this.rotation=(a=e==null?void 0:e.rotation)!=null?a:0}update(e){let t=e.position,i=e.offset;t!==void 0&&(this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0}),i!==void 0&&(this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0}),(t!==void 0||i!==void 0)&&(this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y}),e.scale!==void 0&&(this.scale=e.scale),e.rotation!==void 0&&(this.rotation=e.rotation)}syncToPixi(e){e&&(e.position.set(this.position.x,this.position.y),e.scale.set(this.scale),e.rotation=this.rotation)}},qi=class{constructor(e){var t,i,n,a;this.z_index=(t=e==null?void 0:e.z_index)!=null?t:0,this.alpha=(i=e==null?void 0:e.alpha)!=null?i:1,this.visible=(n=e==null?void 0:e.visible)!=null?n:!0,this.tint=(a=e==null?void 0:e.tint)!=null?a:null}update(e){e.z_index!==void 0&&(this.z_index=e.z_index),e.alpha!==void 0&&(this.alpha=e.alpha),e.visible!==void 0&&(this.visible=e.visible),e.tint!==void 0&&(this.tint=e.tint)}syncToPixi(e,t){if(!e)return;if(e.zIndex=this.z_index,t!=null&&t.startsWith("ui_endgame_")||(e.alpha=this.alpha),e.visible=this.visible,this.tint!==null&&"tint"in e&&(e.tint=this.tint),t&&"texture"in e)try{let{AssetTextures:n}=ps("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},Vi=class{constructor(e,t,i,n){this._tickerCleanup=null;this.onRebuildRequired=null;this.instanceId=e,this.objectConfig=t,this.pixiObject=i,this._config=n,this.transform=new Gi(n.transform),this.renderer=new qi(n.render),this.sync()}sync(){this.transform.syncToPixi(this.pixiObject),this.renderer.syncToPixi(this.pixiObject,this.instanceId),this.applyAnchor(),this.applyEffectsScale(),this.applyEffects(),this.syncTextProperties(),(!this._initialized||this._shouldReplayIntro)&&(this.applyIntro(),this._initialized=!0,this._shouldReplayIntro=!1),this.applyMotion()}syncTextProperties(){var t;if(!this.pixiObject||!("text"in this.pixiObject))return;let e=(t=this._config)==null?void 0:t.ui;e&&(e.text!==void 0&&this.pixiObject.text!==e.text&&(this.pixiObject.text=e.text),this.pixiObject.style&&(e.fontSize!==void 0&&(this.pixiObject.style.fontSize=e.fontSize),e.color!==void 0&&(this.pixiObject.style.fill=e.color),e.align!==void 0&&(this.pixiObject.style.align=e.align)))}destroy(){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null),this._introTicker&&(vt.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,d,p,u,g,h,m,f,b,v;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(d=e==null?void 0:e.motion)==null?void 0:d.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(u=(p=this._config)==null?void 0:p.render)==null?void 0:u.asset)==null?void 0:g.type,a=(m=(h=e==null?void 0:e.render)==null?void 0:h.asset)==null?void 0:m.type,r=(b=(f=this._config)==null?void 0:f.ui)==null?void 0:b.renderMode,o=(v=e==null?void 0:e.ui)==null?void 0:v.renderMode;if((n!==a||r!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${r} to ${a}/${o}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,a,r,o;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(a=(n=this._config)==null?void 0:n.render)==null?void 0:a.anchor,t=(o=(r=this._config)==null?void 0:r.transform)==null?void 0:o.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var a,r,o;if(!((a=this.pixiObject)!=null&&a.scale))return;let e=(r=this._config)==null?void 0:r.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(o=this.transform.scale)!=null?o:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,a,r,o,l,c,d,p;if(!this.pixiObject)return;let e=(i=this._config)==null?void 0:i.effects;if(!e||e.enabled===!1){this.pixiObject.filters=null;return}let t=[];if((n=e.blur)!=null&&n.enabled){let u=new ra;u.blur=(a=e.blur.strength)!=null?a:4,t.push(u)}if((r=e.shadow)!=null&&r.enabled){let u=e.shadow,g=new ra;g.blur=(o=u.blur)!=null?o:4,g.blendMode="multiply",t.push(g),(u.offsetX!==0||u.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let u=e.glow,g=new ra;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let h=new Oo,m=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;h.tint(m),t.push(h)}}(d=e.stroke)!=null&&d.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(p=e.distortion)!=null&&p.enabled&&console.warn("[Effects] Distortion effect requires pixi-filters or a displacement map. Install: npm install pixi-filters"),this.pixiObject.filters=t.length>0?t:null}applyIntro(){var d,p,u,g,h,m,f;let e=(d=this._config)==null?void 0:d.motion;if(!e||!((p=e.intro)!=null&&p.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,a=this.transform.position.y,r=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_y)||1);if(this.pixiObject.alpha=(f=t.startAlpha)!=null?f:0,t.startScale!==void 0&&this.pixiObject.scale.set(r*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=a+(t.startYOffset||0)),this._introTicker&&vt.shared.remove(this._introTicker),i<=0&&n<=0){this.pixiObject.alpha=this.renderer.alpha,this.pixiObject.y=this.transform.position.y,this.pixiObject.scale.set(r,o);return}let l=0,c=b=>{var O,_,T,A,k,C;if(l+=b.deltaTime/60,l<n)return;let v=i>0?Math.min(1,(l-n)/i):1,w=1-Math.pow(1-v,3),y=this.renderer.alpha,x=this.transform.scale*(((_=(O=this._config)==null?void 0:O.effects)==null?void 0:_.scale_x)||1),M=this.transform.scale*(((A=(T=this._config)==null?void 0:T.effects)==null?void 0:A.scale_y)||1),j=this.transform.position.y,L=this.transform.position.x;if(this.pixiObject.alpha=((k=t.startAlpha)!=null?k:0)+(y-((C=t.startAlpha)!=null?C:0))*w,t.startScale!==void 0){let E=t.startScale+(1-t.startScale)*w;this.pixiObject.scale.set(x*E,M*E)}t.startYOffset!==void 0&&(this.pixiObject.y=j+t.startYOffset+(j-(j+t.startYOffset))*w),v>=1&&(vt.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=y,this.pixiObject.x=L,this.pixiObject.y=j,this.pixiObject.scale.set(x,M))};this._introTicker=c,vt.shared.add(c)}applyMotion(){var p,u,g,h,m,f;let e=(p=this._config)==null?void 0:p.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(this._lastMotionStr===i&&this._tickerCleanup)return;if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),!(((u=e.pulse)==null?void 0:u.enabled)||((g=e.swing)==null?void 0:g.enabled)||((h=e.continuousMove)==null?void 0:h.enabled)||((m=e.continuousRotate)==null?void 0:m.enabled)||((f=e.orbit)==null?void 0:f.enabled)))return;let a=0,r=0,o=0,l=0,c=1/60,d=b=>{var T,A,k,C,E,S,I,P,z,D,N,H,B,G,Y,Q,ie,le,$,Z,ce,he,de,ve,Ce,Te;let v=((T=b.deltaTime)!=null?T:1)*c;a+=b.deltaTime*.05;let w=this.transform.scale,y=w*(((k=(A=this._config)==null?void 0:A.effects)==null?void 0:k.scale_x)||1),x=w*(((E=(C=this._config)==null?void 0:C.effects)==null?void 0:E.scale_y)||1),M=this.transform.position.x,j=this.transform.position.y,L=this.transform.rotation,O=0,_=0;if((S=e.swing)!=null&&S.enabled){let q=(I=e.swing.amplitude)!=null?I:10,ee=(P=e.swing.speed)!=null?P:1,K=Math.sin(a*ee)*q;e.swing.axis==="vertical"?_+=K:e.swing.axis==="both"?(O+=K,_+=K):O+=K}if((z=e.continuousMove)!=null&&z.enabled){let q=(D=e.continuousMove.axis)!=null?D:"x",ee=Math.max(0,(N=e.continuousMove.speed)!=null?N:50),K=Math.sign((H=e.continuousMove.direction)!=null?H:1)||1,ae=Math.max(0,(B=e.continuousMove.lifetime)!=null?B:0);r+=v;let Oe=ae>0?Math.min(r,ae):r,Ge=ee*K*Oe;(q==="x"||q==="both")&&(O+=Ge),(q==="y"||q==="both")&&(_+=Ge)}if((G=e.orbit)!=null&&G.enabled){let q=Math.max(0,(Y=e.orbit.radius)!=null?Y:50),ee=Math.max(0,(Q=e.orbit.speed)!=null?Q:45),K=Math.sign((ie=e.orbit.direction)!=null?ie:1)||1,ae=ee*Math.PI/180;l+=ae*K*v;let Oe=(le=e.orbit.pivotOffsetX)!=null?le:0,Ge=($=e.orbit.pivotOffsetY)!=null?$:0;O+=Oe+q*Math.cos(l),_+=Ge+q*Math.sin(l)}if(this.pixiObject.x=M+O,this.pixiObject.y=j+_,(Z=e.pulse)!=null&&Z.enabled){let q=(ce=e.pulse.intensity)!=null?ce:.1,ee=(he=e.pulse.speed)!=null?he:1,ae=1+Math.sin(a*ee)*q;(de=this.pixiObject.scale)!=null&&de.set?this.pixiObject.scale.set(y*ae,x*ae):this.pixiObject.scale&&(this.pixiObject.scale.x=y*ae,this.pixiObject.scale.y=x*ae)}if((ve=e.continuousRotate)!=null&&ve.enabled){let q=Math.max(0,(Ce=e.continuousRotate.speed)!=null?Ce:90),ee=Math.sign((Te=e.continuousRotate.direction)!=null?Te:1)||1,K=q*Math.PI/180;o+=K*ee*v,this.pixiObject.rotation=L+o}};vt.shared.add(d),this._tickerCleanup=()=>{var b,v,w,y,x;if(vt.shared.remove(d),this.pixiObject){let M=this.transform.scale*(((v=(b=this._config)==null?void 0:b.effects)==null?void 0:v.scale_x)||1),j=this.transform.scale*(((y=(w=this._config)==null?void 0:w.effects)==null?void 0:y.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(x=this.pixiObject.scale)!=null&&x.set?this.pixiObject.scale.set(M,j):this.pixiObject.scale&&(this.pixiObject.scale.x=M,this.pixiObject.scale.y=j)}}}getComponent(e){return this._config[e]}getPosition(){return{...this.transform.position}}setPosition(e,t){this.transform.position={x:e,y:t},this.transform.syncToPixi(this.pixiObject)}getAlpha(){return this.renderer.alpha}setAlpha(e){this.renderer.alpha=e,this.renderer.syncToPixi(this.pixiObject)}getVisible(){return this.renderer.visible}setVisible(e){this.renderer.visible=e,this.renderer.syncToPixi(this.pixiObject)}},zt=class{constructor(e){this.objects=new Map;this.onObjectRebuildRequired=null;this.config=e}create(e,t){let i=this.config.objects.get(e);if(!i)throw new Error(`Object config not found: ${e}`);let n=new Vi(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,r)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,r);o&&this.objects.get(e)===o&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),a.updateConfig(r)},n}get(e){return this.objects.get(e)}updateConfig(e){this.config=e;for(let[t,i]of this.objects.entries()){let n=e.objects.get(t);n&&i.updateConfig(n)}}getAll(){return Array.from(this.objects.values())}remove(e){let t=this.objects.get(e);t&&t.destroy(),this.objects.delete(e)}clear(){for(let e of this.objects.values())e.destroy();this.objects.clear()}};var Wi={"brand.primary":{family:"Arial, sans-serif",weight:"400"},"brand.warning":{family:"Arial Black, Arial, sans-serif",weight:"900"},"brand.heading":{family:"Arial Black, Arial, sans-serif",weight:"800"},"brand.body":{family:"Arial, sans-serif",weight:"400"}};function _o(s){let e=Wi[s];return e?e.family:(console.warn(`Font ID "${s}" not found in registry, using fallback`),"Arial, sans-serif")}function zo(s){var t;let e=Wi[s];return e&&(t=e.weight)!=null?t:"400"}function Ro(s,e){Wi[s]=e}function Do(){return Object.keys(Wi)}var yt=null;function $o(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!yt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),yt||(typeof window!="undefined"&&window.lottie?(yt=window.lottie,console.log("[LottieOverlay] \u2705 Found window.lottie, cached it")):(console.warn("[LottieOverlay] \u274C lottie-web is not available globally. Make sure it is loaded before using Lottie animations."),console.log("[LottieOverlay] window keys:",typeof window!="undefined"?Object.keys(window).filter(s=>s.toLowerCase().includes("lottie")):"no window"),yt=null)),yt}function Ho(s){return!s||s.startsWith("http://")||s.startsWith("https://")||s.startsWith("/")?s:`/${s.replace(/^\.\//,"")}`}function No(s){try{let e=new XMLHttpRequest;return e.open("GET",Ho(s),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function ss(s){return!s||typeof s!="object"||!Array.isArray(s.layers)?null:(Array.isArray(s.assets)||(s.assets=[]),Array.isArray(s.chars)||(s.chars=[]),s)}function Vn(s){yt=s}function Bo(s,e,t,i){var M,j,L,O,_,T,A,k,C,E,S,I,P,z,D,N,H,B,G;let n=t.objects.get(s);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${s}`),null;let a=((M=n.effects)==null?void 0:M.lottie)||{},r=n.transform||{},o=n.render||{};if(a.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[s],c=ss(l);if(!c){let Y=(L=(j=n.render)==null?void 0:j.asset)==null?void 0:L.path;if(typeof Y=="string"&&Y.toLowerCase().endsWith(".json")){let Q=No(Y);if(c=ss(Q),c)try{i[s]=c}catch{}}}if(!c){let Y=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${s}`,{kind:Y}),null}let d=$o();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${s}`),null;let p=(O=a.width)!=null?O:300,u=(_=a.height)!=null?_:300,g=(T=r.scale)!=null?T:1,h=((k=(A=r.position)==null?void 0:A.x)!=null?k:0)+((E=(C=r.offset)==null?void 0:C.x)!=null?E:0),m=((I=(S=r.position)==null?void 0:S.y)!=null?I:0)+((z=(P=r.offset)==null?void 0:P.y)!=null?z:0),f=(D=r.rotation)!=null?D:0,b=(N=o.z_index)!=null?N:100,v=(H=o.alpha)!=null?H:1,w=document.createElement("div");w.style.cssText=`
2595
2596
  position: absolute;
2596
2597
  top: calc(50% + ${m}px);
2597
2598
  left: calc(50% + ${h}px);
@@ -2601,4 +2602,4 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2601
2602
  pointer-events: none;
2602
2603
  z-index: ${b};
2603
2604
  opacity: ${v};
2604
- `,e.appendChild(w);let y;try{y=d.loadAnimation({container:w,renderer:a.renderer||"svg",loop:(F=a.loop)!=null?F:!1,autoplay:(G=a.autoplay)!=null?G:!0,animationData:c})}catch(Y){return w.parentNode&&w.parentNode.removeChild(w),console.warn(`[LottieOverlay] Failed to start animation: ${s}`,Y),null}a.speed!==void 0&&y.setSpeed(a.speed);let x=()=>{y.destroy(),w.parentNode&&w.parentNode.removeChild(w)};return a.loop||y.addEventListener("complete",x),{animation:y,cleanup:x}}var sa=class{constructor(e,t,i){this.systems=[];this.totalTime=0;this.context=null;this.root=e,this.config=t,this.destinationUrl=i}async createApp(e){if(this.context)return{app:this.app,gameObjectManager:this.gameObjectManager};let{app:t,stage:i}=await aa(this.root,{background:e.background_color,text:e.text_color,primary:e.cta_background,cta_text:e.cta_text});this.app=t,this.stage=i,this.gameObjectManager=new Rt(this.config),this.stage.eventMode="passive",this.stage.interactive=!1,this.stage.interactiveChildren=!0,this.stage.sortableChildren=!0,this.context={app:this.app,stage:this.stage,config:this.config,gameObjectManager:this.gameObjectManager,destinationUrl:this.destinationUrl,root:this.root,engine:this};for(let n of this.systems)n.setContext(this.context);return{app:this.app,gameObjectManager:this.gameObjectManager}}async initSystems(){if(!this.context)throw new Error("[GameEngine] createApp() must be called before initSystems()");for(let e of this.systems)e.init&&await e.init()}async init(e){return await this.createApp(e),await this.initSystems(),{app:this.app,gameObjectManager:this.gameObjectManager}}registerSystems(e){this.systems.push(...e)}async start(){for(let e of this.systems)e.onStart&&await e.onStart();this.app.ticker.add(this.update.bind(this)),window.addEventListener("handler-preview:screen",e=>{let{width:t,height:i}=e.detail;this.resize(t,i)})}update(e){let t=e.deltaTime/60;this.totalTime+=t;for(let i of this.systems)i.update&&i.update(t,this.totalTime)}resize(e,t){for(let i of this.systems)i.onResize&&i.onResize(e,t)}updateConfig(e){this.config=e;for(let t of this.systems)t.context.config=e,t.onConfigUpdate&&t.onConfigUpdate(e)}destroy(){for(let e of this.systems)e.onDestroy&&e.onDestroy();this.app.ticker.remove(this.update.bind(this)),this.app.destroy(!0,{children:!0,texture:!1})}getApp(){return this.app}getGameObjectManager(){return this.gameObjectManager}getTotalTime(){return this.totalTime}getSystem(e){let t=this.systems.find(i=>i instanceof e);if(!t)throw new Error(`System ${e.name} not found!`);return t}};var zt=class{setContext(e){this.context=e}};var Dt=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};import*as os from"pixi.js";var Bo=os;typeof window!="undefined"&&(window.__basePixi=os);import{Sprite as Uo,Text as Go,TextStyle as qo,Texture as ls}from"pixi.js";var cs=s=>s*Math.PI/180;function Vo(s,e){var r,o,l,c,d;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(r=e.render)!=null&&r.tint&&(i=e.render.tint);let n=new qo({fontFamily:(o=t.font)!=null?o:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(d=t.letterSpacing)!=null?d:0}),a=new Go({text:t.text,style:n});return a.label=s,a}function Wo(s){var d,p,u,g,h,m,f,b,v,w;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:r}=s,o={},l={},c={};t.sortableChildren=!0;for(let[y,x]of i.objects.entries()){if(r!=null&&r.has(y)||a&&!a.has(y)||(x==null?void 0:x.enabled)===!1)continue;let M=(p=(d=x==null?void 0:x.render)==null?void 0:d.asset)==null?void 0:p.path,j=(g=(u=x==null?void 0:x.render)==null?void 0:u.asset)==null?void 0:g.type,L=!!(M&&j==="image"),_=!!((h=x==null?void 0:x.ui)!=null&&h.text),O=_?(m=x==null?void 0:x.ui)==null?void 0:m.renderMode:void 0,T;if(O==="png"&&L?T="png":O==="text"&&_?T="text":L?T="png":_?T="text":T="skip",T!=="skip"){if(T==="text"){let A=Vo(y,x);if(!A)continue;let k=x.render;A.alpha=typeof(k==null?void 0:k.alpha)=="number"?k.alpha:1,A.visible=(k==null?void 0:k.visible)!==!1,A.zIndex=typeof(k==null?void 0:k.z_index)=="number"?k.z_index:0,k!=null&&k.anchor&&typeof k.anchor.x=="number"&&typeof k.anchor.y=="number"?A.anchor.set(k.anchor.x,k.anchor.y):A.anchor.set(.5,.5);let C=x.transform,E=(C==null?void 0:C.position)||(C==null?void 0:C.offset);E&&A.position.set((f=E.x)!=null?f:0,(b=E.y)!=null?b:0);let S=typeof(C==null?void 0:C.scale)=="number"?C.scale:1;A.scale.set(S,S);let I=typeof(C==null?void 0:C.rotation)=="number"?C.rotation:0;A.rotation=cs(I),A.parent||t.addChild(A);try{n.create(y,A)}catch{}o[y]=A,c[y]=A}else if(T==="png"){let A=we[y]||(typeof ls!="undefined"?ls.EMPTY:void 0),k=new Uo(A);k.label=y;let C=x.render;k.alpha=typeof(C==null?void 0:C.alpha)=="number"?C.alpha:1,k.visible=(C==null?void 0:C.visible)!==!1,k.zIndex=typeof(C==null?void 0:C.z_index)=="number"?C.z_index:0,C!=null&&C.anchor&&typeof C.anchor.x=="number"&&typeof C.anchor.y=="number"&&k.anchor.set(C.anchor.x,C.anchor.y);let E=x.transform,S=(E==null?void 0:E.position)||(E==null?void 0:E.offset);S&&k.position.set((v=S.x)!=null?v:0,(w=S.y)!=null?w:0);let I=typeof(E==null?void 0:E.scale)=="number"?E.scale:1;k.scale.set(I,I);let P=typeof(E==null?void 0:E.rotation)=="number"?E.rotation:0;k.rotation=cs(P),k.parent||t.addChild(k);try{n.create(y,k)}catch{}o[y]=k,l[y]=k}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var oa=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Dt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var o;let r=this.registry.get(a);if(!r){console.warn("[Assets] No config found for object:",a);return}try{let l=await xe.create(a,r,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await xe.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},ds=new oa,Yo=new Proxy(ds,{get(s,e){if(e in s&&typeof s[e]=="function")return s[e].bind(s);if(s.get(e))return s.get(e)}});function Ko(s,e){ds.init(s,e)}var la=class extends zt{async init(){Xi(this.context.config,this.context.app),await we.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};function Xo(s){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=s,r=((l=(o=n.engine)==null?void 0:o.runtime)==null?void 0:l.timeline)||{};e(a.showHook),setTimeout(()=>{t(1),i(1),e(a.waitInput),console.log("[GAME] \u23F3 Game ready for user input - tutorial shown")},(c=r.tutorial_delay_ms)!=null?c:1500)}export{Za as a,aa as b,Gi as c,qi as d,Vi as e,Rt as f,Oo as g,Ro as h,zo as i,Do as j,Vn as k,Fo as l,xe as m,sa as n,zt as o,Dt as p,Bo as q,Wo as r,Yo as s,Ko as t,la as u,Ii as v,Ws as w,$n as x,He as y,Ne as z,Fe as A,Hn as B,co as C,Xo as D,Qa as E,er as F,on as G,nt as H,cl as I,Pi as J,Nn as K,Fr as L,Bn as M,gp as N,hp as O,Me as P,wo as Q,xo as R,Yn as S,Ae as T,Pe as U};
2605
+ `,e.appendChild(w);let y;try{y=d.loadAnimation({container:w,renderer:a.renderer||"svg",loop:(B=a.loop)!=null?B:!1,autoplay:(G=a.autoplay)!=null?G:!0,animationData:c})}catch(Y){return w.parentNode&&w.parentNode.removeChild(w),console.warn(`[LottieOverlay] Failed to start animation: ${s}`,Y),null}a.speed!==void 0&&y.setSpeed(a.speed);let x=()=>{y.destroy(),w.parentNode&&w.parentNode.removeChild(w)};return a.loop||y.addEventListener("complete",x),{animation:y,cleanup:x}}var sa=class{constructor(e,t,i){this.systems=[];this.totalTime=0;this.context=null;this.root=e,this.config=t,this.destinationUrl=i}async createApp(e){if(this.context)return{app:this.app,gameObjectManager:this.gameObjectManager};let{app:t,stage:i}=await aa(this.root,{background:e.background_color,text:e.text_color,primary:e.cta_background,cta_text:e.cta_text});this.app=t,this.stage=i,this.gameObjectManager=new zt(this.config),this.stage.eventMode="passive",this.stage.interactive=!1,this.stage.interactiveChildren=!0,this.stage.sortableChildren=!0,this.context={app:this.app,stage:this.stage,config:this.config,gameObjectManager:this.gameObjectManager,destinationUrl:this.destinationUrl,root:this.root,engine:this};for(let n of this.systems)n.setContext(this.context);return{app:this.app,gameObjectManager:this.gameObjectManager}}async initSystems(){if(!this.context)throw new Error("[GameEngine] createApp() must be called before initSystems()");for(let e of this.systems)e.init&&await e.init()}async init(e){return await this.createApp(e),await this.initSystems(),{app:this.app,gameObjectManager:this.gameObjectManager}}registerSystems(e){this.systems.push(...e)}async start(){for(let e of this.systems)e.onStart&&await e.onStart();this.app.ticker.add(this.update.bind(this)),window.addEventListener("handler-preview:screen",e=>{let{width:t,height:i}=e.detail;this.resize(t,i)})}update(e){let t=e.deltaTime/60;this.totalTime+=t;for(let i of this.systems)i.update&&i.update(t,this.totalTime)}resize(e,t){for(let i of this.systems)i.onResize&&i.onResize(e,t)}updateConfig(e){this.config=e;for(let t of this.systems)t.context.config=e,t.onConfigUpdate&&t.onConfigUpdate(e)}destroy(){for(let e of this.systems)e.onDestroy&&e.onDestroy();this.app.ticker.remove(this.update.bind(this)),this.app.destroy(!0,{children:!0,texture:!1})}getApp(){return this.app}getGameObjectManager(){return this.gameObjectManager}getTotalTime(){return this.totalTime}getSystem(e){let t=this.systems.find(i=>i instanceof e);if(!t)throw new Error(`System ${e.name} not found!`);return t}};var Rt=class{setContext(e){this.context=e}};var Dt=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};import*as os from"pixi.js";var Fo=os;typeof window!="undefined"&&(window.__basePixi=os);import{Sprite as Uo,Text as Go,TextStyle as qo,Texture as ls}from"pixi.js";var cs=s=>s*Math.PI/180;function Vo(s,e){var r,o,l,c,d;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(r=e.render)!=null&&r.tint&&(i=e.render.tint);let n=new qo({fontFamily:(o=t.font)!=null?o:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(d=t.letterSpacing)!=null?d:0}),a=new Go({text:t.text,style:n});return a.label=s,a}function Wo(s){var d,p,u,g,h,m,f,b,v,w;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:r}=s,o={},l={},c={};t.sortableChildren=!0;for(let[y,x]of i.objects.entries()){if(r!=null&&r.has(y)||a&&!a.has(y)||(x==null?void 0:x.enabled)===!1)continue;let M=(p=(d=x==null?void 0:x.render)==null?void 0:d.asset)==null?void 0:p.path,j=(g=(u=x==null?void 0:x.render)==null?void 0:u.asset)==null?void 0:g.type,L=!!(M&&j==="image"),O=!!((h=x==null?void 0:x.ui)!=null&&h.text),_=O?(m=x==null?void 0:x.ui)==null?void 0:m.renderMode:void 0,T;if(_==="png"&&L?T="png":_==="text"&&O?T="text":L?T="png":O?T="text":T="skip",T!=="skip"){if(T==="text"){let A=Vo(y,x);if(!A)continue;let k=x.render;A.alpha=typeof(k==null?void 0:k.alpha)=="number"?k.alpha:1,A.visible=(k==null?void 0:k.visible)!==!1,A.zIndex=typeof(k==null?void 0:k.z_index)=="number"?k.z_index:0,k!=null&&k.anchor&&typeof k.anchor.x=="number"&&typeof k.anchor.y=="number"?A.anchor.set(k.anchor.x,k.anchor.y):A.anchor.set(.5,.5);let C=x.transform,E=(C==null?void 0:C.position)||(C==null?void 0:C.offset);E&&A.position.set((f=E.x)!=null?f:0,(b=E.y)!=null?b:0);let S=typeof(C==null?void 0:C.scale)=="number"?C.scale:1;A.scale.set(S,S);let I=typeof(C==null?void 0:C.rotation)=="number"?C.rotation:0;A.rotation=cs(I),A.parent||t.addChild(A);try{n.create(y,A)}catch{}o[y]=A,c[y]=A}else if(T==="png"){let A=we[y]||(typeof ls!="undefined"?ls.EMPTY:void 0),k=new Uo(A);k.label=y;let C=x.render;k.alpha=typeof(C==null?void 0:C.alpha)=="number"?C.alpha:1,k.visible=(C==null?void 0:C.visible)!==!1,k.zIndex=typeof(C==null?void 0:C.z_index)=="number"?C.z_index:0,C!=null&&C.anchor&&typeof C.anchor.x=="number"&&typeof C.anchor.y=="number"&&k.anchor.set(C.anchor.x,C.anchor.y);let E=x.transform,S=(E==null?void 0:E.position)||(E==null?void 0:E.offset);S&&k.position.set((v=S.x)!=null?v:0,(w=S.y)!=null?w:0);let I=typeof(E==null?void 0:E.scale)=="number"?E.scale:1;k.scale.set(I,I);let P=typeof(E==null?void 0:E.rotation)=="number"?E.rotation:0;k.rotation=cs(P),k.parent||t.addChild(k);try{n.create(y,k)}catch{}o[y]=k,l[y]=k}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var oa=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Dt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var o;let r=this.registry.get(a);if(!r){console.warn("[Assets] No config found for object:",a);return}try{let l=await xe.create(a,r,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await xe.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},ds=new oa,Yo=new Proxy(ds,{get(s,e){if(e in s&&typeof s[e]=="function")return s[e].bind(s);if(s.get(e))return s.get(e)}});function Ko(s,e){ds.init(s,e)}var la=class extends Rt{async init(){Xi(this.context.config,this.context.app),await we.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};function Xo(s){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=s,r=((l=(o=n.engine)==null?void 0:o.runtime)==null?void 0:l.timeline)||{};e(a.showHook),setTimeout(()=>{t(1),i(1),e(a.waitInput),console.log("[GAME] \u23F3 Game ready for user input - tutorial shown")},(c=r.tutorial_delay_ms)!=null?c:1500)}export{Za as a,aa as b,Gi as c,qi as d,Vi as e,zt as f,_o as g,zo as h,Ro as i,Do as j,Vn as k,Bo as l,xe as m,sa as n,Rt as o,Dt as p,Fo as q,Wo as r,Yo as s,Ko as t,la as u,Ii as v,Ws as w,$n as x,He as y,Ne as z,Be as A,Hn as B,co as C,Xo as D,Qa as E,er as F,on as G,at as H,cl as I,Pi as J,Nn as K,Br as L,Fn as M,gp as N,hp as O,Me as P,wo as Q,xo as R,Yn as S,Ae as T,Pe as U};