handler-playable-sdk 0.5.45 → 0.5.49

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 Fi,d as ve,e as Bi}from"./chunk-I5OOVR5U.js";import{i as Ht}from"./chunk-PW2FGMCO.js";import{c as gt,d as Dt,e as Be,g as da,h as Ui,j as pa,k as ua,n as Gi,o as $t,p as Ve,q as ga,r as qi,s as ha}from"./chunk-HVKF2KYL.js";import{a as as}from"./chunk-JXBG6UFL.js";import{Application as Zs}from"pixi.js";var Oe={};function Nt(r,e,t=!1){Oe[r]||(Oe[r]=[]),Oe[r].push({fn:e,once:t})}function Vi(r,e){if(Oe[r]){if(!e){delete Oe[r];return}Oe[r]=Oe[r].filter(t=>t.fn!==e)}}function Ft(r,...e){let t=Oe[r];if(t)for(let i of[...t])i.fn(...e),i.once&&Vi(r,i.fn)}function ce(r,e){Nt(r,e,!0)}var K=null,ge=[],Ye=null;function ba(r){K=r,ge=[],Ye!==null&&(clearTimeout(Ye),Ye=null)}function va(){var r,e,t;return{endpoint:(K==null?void 0:K.endpoint)||"",transport:(K==null?void 0:K.transport)||"beacon",batchSize:(r=K==null?void 0:K.batchSize)!=null?r:10,flushIntervalMs:(e=K==null?void 0:K.flushIntervalMs)!=null?e:300,maxQueue:(t=K==null?void 0:K.maxQueue)!=null?t:200,debug:!!(K!=null&&K.debug)}}async function ma(r,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(r,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(r,{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 Yi(r,e){let t=va();if(e&&t.endpoint){if(ge.push(r),ge.length>t.maxQueue&&(ge=ge.slice(ge.length-t.maxQueue)),ge.length>=t.batchSize){fa();return}Ye===null&&(Ye=window.setTimeout(()=>{Ye=null,fa()},t.flushIntervalMs))}}async function fa(){let r=va();if(!r.endpoint||ge.length===0)return;let e=ge.splice(0,r.batchSize);await ma(r.endpoint,{events:e},r.transport,r.debug),ge.length>0&&await ma(r.endpoint,{events:ge.splice(0,r.batchSize)},r.transport,r.debug)}function ya(r){return Math.max(0,Math.min(1,r))}function rs(r){let e=String(r!=null?r:"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 ht(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function ss(r,e){let t=r==null?void 0:r[e];return typeof t=="number"?t:0}function xa(r,e,t){try{r[e]=t}catch{}}function os(r){let e=r==null?void 0:r.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 wa(r,e){let t=r==null?void 0:r.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 Ea(r,e){let t=os(r);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 Sa(){let r=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),r.size>0&&i()})},n=d=>{var u;r.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{r.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},s=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var p,u;let d=ht();for(let g of Array.from(r)){if(g.killed||g.paused)continue;let f=d-g.startMs-g.delayMs;if(f<0)continue;let m=g.durationMs>0?f/g.durationMs:1,h=ya(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 A=m-v;h=ya(A)}let y=g.ease(h);g.yoyo&&v%2===1&&(y=1-y);for(let A of g.props)xa(g.target,A.key,A.from+(A.to-A.from)*y);g.scaleFrom&&g.scaleTo&&wa(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*y,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*y});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(m>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var A;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),f=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((A=u==null?void 0:u.delayMsOverride)!=null?A:0)),m=rs(p.ease),h=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"]),y=[];for(let I of Object.keys(p)){if(v.has(I))continue;let R=p[I];typeof R=="number"&&y.push({key:I,from:ss(d,I),to:R})}let E=Ea(d,p);return{target:d,startMs:ht(),delayMs:f,durationMs:g,ease:m,props:y,scaleFrom:E.from,scaleTo:E.to,repeat:h,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:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ht())},resume:()=>{var m;if(!u.paused)return;let g=(m=u.pauseAtMs)!=null?m:ht(),f=ht()-g;u.startMs+=f,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 f=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof f=="number"&&xa(d,g,f)}let u=Ea(d,p);u.to&&wa(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))s(u)},timeline(d={}){let p=[],u=0,g=!1,f=[],m=v=>{if(typeof v=="number")return Math.max(0,v*1e3);let y=typeof v=="string"?v.trim():"";return y.startsWith("+=")?u+Math.max(0,Number(y.slice(2))*1e3||0):y?Math.max(0,Number(y)*1e3||0):u},h=v=>{p.push(v);let y=Math.max(0,(typeof v.vars.duration=="number"?v.vars.duration:.5)*1e3);u=Math.max(u,v.atMs+y)},b={to(v,y,E){return h({kind:"to",target:v,vars:y,atMs:m(E)}),b},fromTo(v,y,E,A){return h({kind:"fromTo",target:v,vars:E,from:y,atMs:m(A)}),b},play(){var v,y;if(g)return b;g=!0,f=[];for(let E of p)E.kind==="fromTo"&&c.set(E.target,(v=E.from)!=null?v:{}),f.push(c.to(E.target,{...E.vars,delay:E.atMs/1e3+((y=E.vars.delay)!=null?y:0)}));return b},pause(){for(let v of f)v.pause();return b},kill(){for(let v of f)v.kill();f=[],g=!1}};return d.paused||b.play(),b}};return c}function Aa(){if(typeof window=="undefined")return;let r=window;if(!r.gsap)try{r.gsap=Sa()}catch{}}var Ca={name:"handler-playable-sdk",version:"0.5.45",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 de=0,cs=de++,Ta=de++,La=de++,ka=de++,Ma=de++,Pa=de++,Ia=de++,_a=de++,Oa=de++,ja=de++,Ra=de++,za=de++,q=cs;function Da(){return q===Ta}function $a(){return q===La}function Ha(){return q===ka}function Na(){return q===Ma}function We(){return q===Pa}function Ke(){return q===Ia}function Fa(){return q===_a}function Ba(){return q===Oa}function Ua(){return q===ja}function Wi(){return q===Ra}function Ki(){return q===za}function Ga(){let r=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(r==="mraid")try{mraid.getState(),q=Ta;return}catch{}else if(r==="dapi")try{dapi.isReady(),q=La;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(q=ka)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(q=Ma)}catch{}else if(e==="mintegral")window.gameReady&&(q=Pa);else if(e==="tapjoy")window.TJ_API&&(q=Ia);else if(e==="tiktok")window.openAppStore&&(q=_a);else if(e==="smadex")try{window.smxTracking&&(q=Oa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(q=ja)}catch{}else e==="vungle"?q=Ra:(r==="nucleo"||e==="nucleo")&&(q=za)}import Xi from"lottie-web";var qa=Xi;typeof window!="undefined"&&(window.lottie=Xi,window.__baseLottie=Xi);function X(r,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(r,e);return`${r/i}:${e/i}`}var Wo=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:X(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:X(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:X(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:X(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:X(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:X(360,780)}],Ko=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:X(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:X(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:X(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:X(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:X(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:X(412,915)}],Xo=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:X(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:X(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:X(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:X(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:X(800,1280)}],Ji=[{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:X(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:X(768,1024),mraidScale:.7}];var Va=[...Ji],Ya=[{category:"playable",label:"Playable Ad",devices:Ji}],Zi=Ji[0];function Xe(r){return Va.find(e=>e.id===r)||Zi}function Jo(r){return Va.filter(e=>e.category===r)}var je=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 s=a(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}gt({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:s;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 Qi(r){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 s=n.result,o=r.category||"misc",c=`${(r.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:s,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 r.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Bt=class{constructor(){this.updateManager=new je}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 s=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,s);break;case"ai-edit":this.openAIEditor(t,i,s);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,s);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 s=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}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 s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(n.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(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 s;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((s=n==null?void 0:n.identity)==null?void 0:s.category)||(t.split(".")[0]==="render"?"environment":"ui");Qi({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),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(n):typeof s.schemas=="object"&&(o=s.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 s=`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,s,"",{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 ds=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],ps=["environment","ui","character","system","backgrounds"],us=["bg","world","ui"],Wa={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}}},Ut=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 Fi,d as ve,e as Bi}from"./chunk-I5OOVR5U.js";import{i as Ht}from"./chunk-PW2FGMCO.js";import{c as gt,d as Dt,e as Be,g as da,h as Ui,j as pa,k as ua,n as Gi,o as $t,p as Ve,q as ga,r as qi,s as ha}from"./chunk-HVKF2KYL.js";import{a as as}from"./chunk-JXBG6UFL.js";import{Application as Zs}from"pixi.js";var Oe={};function Nt(r,e,t=!1){Oe[r]||(Oe[r]=[]),Oe[r].push({fn:e,once:t})}function Vi(r,e){if(Oe[r]){if(!e){delete Oe[r];return}Oe[r]=Oe[r].filter(t=>t.fn!==e)}}function Ft(r,...e){let t=Oe[r];if(t)for(let i of[...t])i.fn(...e),i.once&&Vi(r,i.fn)}function ce(r,e){Nt(r,e,!0)}var K=null,ge=[],Ye=null;function ba(r){K=r,ge=[],Ye!==null&&(clearTimeout(Ye),Ye=null)}function va(){var r,e,t;return{endpoint:(K==null?void 0:K.endpoint)||"",transport:(K==null?void 0:K.transport)||"beacon",batchSize:(r=K==null?void 0:K.batchSize)!=null?r:10,flushIntervalMs:(e=K==null?void 0:K.flushIntervalMs)!=null?e:300,maxQueue:(t=K==null?void 0:K.maxQueue)!=null?t:200,debug:!!(K!=null&&K.debug)}}async function ma(r,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(r,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(r,{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 Yi(r,e){let t=va();if(e&&t.endpoint){if(ge.push(r),ge.length>t.maxQueue&&(ge=ge.slice(ge.length-t.maxQueue)),ge.length>=t.batchSize){fa();return}Ye===null&&(Ye=window.setTimeout(()=>{Ye=null,fa()},t.flushIntervalMs))}}async function fa(){let r=va();if(!r.endpoint||ge.length===0)return;let e=ge.splice(0,r.batchSize);await ma(r.endpoint,{events:e},r.transport,r.debug),ge.length>0&&await ma(r.endpoint,{events:ge.splice(0,r.batchSize)},r.transport,r.debug)}function ya(r){return Math.max(0,Math.min(1,r))}function rs(r){let e=String(r!=null?r:"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 ht(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function ss(r,e){let t=r==null?void 0:r[e];return typeof t=="number"?t:0}function xa(r,e,t){try{r[e]=t}catch{}}function os(r){let e=r==null?void 0:r.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 wa(r,e){let t=r==null?void 0:r.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 Ea(r,e){let t=os(r);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 Sa(){let r=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),r.size>0&&i()})},n=d=>{var u;r.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{r.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},s=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var p,u;let d=ht();for(let g of Array.from(r)){if(g.killed||g.paused)continue;let f=d-g.startMs-g.delayMs;if(f<0)continue;let m=g.durationMs>0?f/g.durationMs:1,h=ya(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 A=m-v;h=ya(A)}let x=g.ease(h);g.yoyo&&v%2===1&&(x=1-x);for(let A of g.props)xa(g.target,A.key,A.from+(A.to-A.from)*x);g.scaleFrom&&g.scaleTo&&wa(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*x,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*x});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(m>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var A;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),f=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((A=u==null?void 0:u.delayMsOverride)!=null?A:0)),m=rs(p.ease),h=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"]),x=[];for(let P of Object.keys(p)){if(v.has(P))continue;let R=p[P];typeof R=="number"&&x.push({key:P,from:ss(d,P),to:R})}let S=Ea(d,p);return{target:d,startMs:ht(),delayMs:f,durationMs:g,ease:m,props:x,scaleFrom:S.from,scaleTo:S.to,repeat:h,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:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ht())},resume:()=>{var m;if(!u.paused)return;let g=(m=u.pauseAtMs)!=null?m:ht(),f=ht()-g;u.startMs+=f,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 f=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof f=="number"&&xa(d,g,f)}let u=Ea(d,p);u.to&&wa(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))s(u)},timeline(d={}){let p=[],u=0,g=!1,f=[],m=v=>{if(typeof v=="number")return Math.max(0,v*1e3);let x=typeof v=="string"?v.trim():"";return x.startsWith("+=")?u+Math.max(0,Number(x.slice(2))*1e3||0):x?Math.max(0,Number(x)*1e3||0):u},h=v=>{p.push(v);let x=Math.max(0,(typeof v.vars.duration=="number"?v.vars.duration:.5)*1e3);u=Math.max(u,v.atMs+x)},b={to(v,x,S){return h({kind:"to",target:v,vars:x,atMs:m(S)}),b},fromTo(v,x,S,A){return h({kind:"fromTo",target:v,vars:S,from:x,atMs:m(A)}),b},play(){var v,x;if(g)return b;g=!0,f=[];for(let S of p)S.kind==="fromTo"&&c.set(S.target,(v=S.from)!=null?v:{}),f.push(c.to(S.target,{...S.vars,delay:S.atMs/1e3+((x=S.vars.delay)!=null?x:0)}));return b},pause(){for(let v of f)v.pause();return b},kill(){for(let v of f)v.kill();f=[],g=!1}};return d.paused||b.play(),b}};return c}function Aa(){if(typeof window=="undefined")return;let r=window;if(!r.gsap)try{r.gsap=Sa()}catch{}}var Ca={name:"handler-playable-sdk",version:"0.5.49",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 de=0,cs=de++,Ta=de++,La=de++,ka=de++,Ma=de++,Pa=de++,Ia=de++,ja=de++,Oa=de++,_a=de++,Ra=de++,za=de++,q=cs;function Da(){return q===Ta}function $a(){return q===La}function Ha(){return q===ka}function Na(){return q===Ma}function We(){return q===Pa}function Ke(){return q===Ia}function Fa(){return q===ja}function Ba(){return q===Oa}function Ua(){return q===_a}function Wi(){return q===Ra}function Ki(){return q===za}function Ga(){let r=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(r==="mraid")try{mraid.getState(),q=Ta;return}catch{}else if(r==="dapi")try{dapi.isReady(),q=La;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(q=ka)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(q=Ma)}catch{}else if(e==="mintegral")window.gameReady&&(q=Pa);else if(e==="tapjoy")window.TJ_API&&(q=Ia);else if(e==="tiktok")window.openAppStore&&(q=ja);else if(e==="smadex")try{window.smxTracking&&(q=Oa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(q=_a)}catch{}else e==="vungle"?q=Ra:(r==="nucleo"||e==="nucleo")&&(q=za)}import Xi from"lottie-web";var qa=Xi;typeof window!="undefined"&&(window.lottie=Xi,window.__baseLottie=Xi);function X(r,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(r,e);return`${r/i}:${e/i}`}var Wo=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:X(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:X(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:X(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:X(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:X(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:X(360,780)}],Ko=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:X(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:X(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:X(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:X(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:X(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:X(412,915)}],Xo=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:X(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:X(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:X(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:X(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:X(800,1280)}],Ji=[{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:X(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:X(768,1024),mraidScale:.7}];var Va=[...Ji],Ya=[{category:"playable",label:"Playable Ad",devices:Ji}],Zi=Ji[0];function Xe(r){return Va.find(e=>e.id===r)||Zi}function Jo(r){return Va.filter(e=>e.category===r)}var _e=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 s=a(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}gt({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:s;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 Qi(r){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 s=n.result,o=r.category||"misc",c=`${(r.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:s,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 r.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Bt=class{constructor(){this.updateManager=new _e}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 s=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,s);break;case"ai-edit":this.openAIEditor(t,i,s);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,s);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 s=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}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 s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(n.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(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 s;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((s=n==null?void 0:n.identity)==null?void 0:s.category)||(t.split(".")[0]==="render"?"environment":"ui");Qi({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),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(n):typeof s.schemas=="object"&&(o=s.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 s=`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,s,"",{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 ds=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],ps=["environment","ui","character","system","backgrounds"],us=["bg","world","ui"],Wa={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}}},Ut=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">
@@ -285,6 +285,10 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
285
285
  <div class="context-menu-item" data-action="system" data-system-type="swerve-collect">SwerveCollect</div>
286
286
  <div class="context-menu-item" data-action="system" data-system-type="tap-destroy">TapDestroy</div>
287
287
  <div class="context-menu-item" data-action="system" data-system-type="scratch-card">ScratchCard</div>
288
+ <div class="context-menu-item" data-action="system" data-system-type="start-screen">StartScreen (Hand)</div>
289
+ <div class="context-menu-item" data-action="system" data-system-type="start-screen-no-hand">StartScreen (No Hand)</div>
290
+ <div class="context-menu-item" data-action="system" data-system-type="endgame-screen">EndgameScreen (Hand)</div>
291
+ <div class="context-menu-item" data-action="system" data-system-type="endgame-screen-no-hand">EndgameScreen (No Hand)</div>
288
292
  <div class="context-menu-item" data-action="system" data-system-type="bullet-system">BulletSystem</div>
289
293
  <div class="context-menu-item" data-action="system" data-system-type="spawner">Spawner</div>
290
294
  `,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,s=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),s>0&&(this.menu.style.top=`${i-s-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let t=e.target,i=t.dataset.action;if(!i)return;e.stopPropagation();let n=t.dataset.objectType,a=t.dataset.systemType,s=t.dataset.templateId;i==="object"&&n?this.handleCreateObject(n):i==="system"&&a?this.handleCreateSystem(a):i==="template"&&s&&this.handleCreateFromTemplate(s)}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}async promptScreen(e="Select Screen"){return new Promise(t=>{var c,d,p;let i=document.createElement("div");i.className="add-menu-modal-overlay",i.innerHTML=`
@@ -412,16 +416,18 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
412
416
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Create</button>
413
417
  </div>
414
418
  </div>
415
- `;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(),y=t.querySelector("#spawner-spawn-templates").value,E=t.querySelector("#spawner-position-source").value.trim(),A=t.querySelector("#spawner-point-mode").value.trim(),I=t.querySelector("#spawner-spawn-points").value,R=t.querySelector("#spawner-random-bounds").value,x=t.querySelector("#spawner-pattern").value.trim(),S=Number(t.querySelector("#spawner-rate").value.trim()),_=Number(t.querySelector("#spawner-pool").value.trim()),L=Number(t.querySelector("#spawner-lifetime").value.trim()),w=t.querySelector("#spawner-return-on-invisible").checked,T=t.querySelector("#spawner-movement").value.trim(),C=t.querySelector("#spawner-velocity").value.trim(),M=t.querySelector("#spawner-velocity-range").value,P=d(y),j=Array.isArray(P)&&P.length?P:null,k=typeof((B=j==null?void 0:j[0])==null?void 0:B.templateId)=="string"?String(j[0].templateId):v;if(!b){alert("Instance ID is required.");return}if(!k){alert("Template ID is required (or provide Spawn Templates JSON).");return}let O={templateId:k,spawnPattern:x,spawnRate:Number.isFinite(S)?S:650,poolSize:Number.isFinite(_)?_:18,returnOnInvisible:w,positionSource:E,spawnPointMode:A,movementMode:T,lifetime:Number.isFinite(L)?L:5e3};j&&(O.spawnTemplates=j);let D=d(I);Array.isArray(D)&&(O.spawnPoints=D);let F=d(R);if(F&&typeof F=="object"&&(O.randomBounds=F),C.includes(",")){let[Y,J]=C.split(",").map(Ee=>Ee.trim()),te=Number(Y),se=Number(J);Number.isFinite(te)&&Number.isFinite(se)&&(O.velocity={x:te,y:se})}let H=d(M);H&&typeof H=="object"&&(O.velocityRange=H),c(),e({templateId:k,instanceId:b,spawnerProps:O})},u=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",b=>b.stopPropagation()),(f=t.querySelector('[data-action="confirm"]'))==null||f.addEventListener("click",p),(m=t.querySelector('[data-action="cancel"]'))==null||m.addEventListener("click",u),(h=t.querySelector(".add-menu-modal-close"))==null||h.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){var o,l,c;this.close();let t=await this.promptScreen();if(!t)return;let i=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",n=await this.promptName(i);if(!n)return;let a=n,s=this.buildDefaultConfig(e,a,n);try{let d=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,instanceId:a,objectConfigId:s.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:s})}),p=await d.json().catch(()=>({}));if(!d.ok||(p==null?void 0:p.success)===!1){let g=((o=p==null?void 0:p.errors)==null?void 0:o.join(`
419
+ `;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(),x=t.querySelector("#spawner-spawn-templates").value,S=t.querySelector("#spawner-position-source").value.trim(),A=t.querySelector("#spawner-point-mode").value.trim(),P=t.querySelector("#spawner-spawn-points").value,R=t.querySelector("#spawner-random-bounds").value,k=t.querySelector("#spawner-pattern").value.trim(),j=Number(t.querySelector("#spawner-rate").value.trim()),O=Number(t.querySelector("#spawner-pool").value.trim()),T=Number(t.querySelector("#spawner-lifetime").value.trim()),E=t.querySelector("#spawner-return-on-invisible").checked,L=t.querySelector("#spawner-movement").value.trim(),y=t.querySelector("#spawner-velocity").value.trim(),w=t.querySelector("#spawner-velocity-range").value,C=d(x),_=Array.isArray(C)&&C.length?C:null,M=typeof((B=_==null?void 0:_[0])==null?void 0:B.templateId)=="string"?String(_[0].templateId):v;if(!b){alert("Instance ID is required.");return}if(!M){alert("Template ID is required (or provide Spawn Templates JSON).");return}let I={templateId:M,spawnPattern:k,spawnRate:Number.isFinite(j)?j:650,poolSize:Number.isFinite(O)?O:18,returnOnInvisible:E,positionSource:S,spawnPointMode:A,movementMode:L,lifetime:Number.isFinite(T)?T:5e3};_&&(I.spawnTemplates=_);let D=d(P);Array.isArray(D)&&(I.spawnPoints=D);let F=d(R);if(F&&typeof F=="object"&&(I.randomBounds=F),y.includes(",")){let[Y,J]=y.split(",").map(Ee=>Ee.trim()),te=Number(Y),se=Number(J);Number.isFinite(te)&&Number.isFinite(se)&&(I.velocity={x:te,y:se})}let H=d(w);H&&typeof H=="object"&&(I.velocityRange=H),c(),e({templateId:M,instanceId:b,spawnerProps:I})},u=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",b=>b.stopPropagation()),(f=t.querySelector('[data-action="confirm"]'))==null||f.addEventListener("click",p),(m=t.querySelector('[data-action="cancel"]'))==null||m.addEventListener("click",u),(h=t.querySelector(".add-menu-modal-close"))==null||h.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){var o,l,c;this.close();let t=await this.promptScreen();if(!t)return;let i=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",n=await this.promptName(i);if(!n)return;let a=n,s=this.buildDefaultConfig(e,a,n);try{let d=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,instanceId:a,objectConfigId:s.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:s})}),p=await d.json().catch(()=>({}));if(!d.ok||(p==null?void 0:p.success)===!1){let g=((o=p==null?void 0:p.errors)==null?void 0:o.join(`
416
420
  `))||(p==null?void 0:p.error)||"Failed to create object.";alert(g);return}let{trackObjectCreation:u}=await import("./ConfigOverride-V7DLPL5I.js");u(a,t,s),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(d){alert(`Failed to create object: ${d instanceof Error?d.message:String(d)}`)}}async handleCreateFromTemplate(e){var a,s,o;this.close();let t=await this.promptScreen();if(!t)return;let i=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",n=await this.promptName(i);if(n)try{let l=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:n,screenId:t})}),c=await l.json().catch(()=>({}));if(!l.ok||(c==null?void 0:c.success)===!1){let d=((a=c==null?void 0:c.errors)==null?void 0:a.join(`
417
- `))||(c==null?void 0:c.error)||"Failed to create from template.";alert(d);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(o=(s=this.options).onRefresh)==null||o.call(s)}catch(l){alert(`Failed to create from template: ${l instanceof Error?l.message:String(l)}`)}}async handleCreateSystem(e){var i,n,a,s,o,l,c,d,p,u,g,f,m,h,b,v,y,E,A,I,R;this.close();let t=await this.promptScreen();if(t){if(e==="collectable-system")try{let x=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let _=((i=S==null?void 0:S.errors)==null?void 0:i.join(`
418
- `))||(S==null?void 0:S.error)||"Failed to create collectable system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(a=(n=this.options).onRefresh)==null||a.call(n)}catch(x){alert(`Failed to create collectable system: ${x instanceof Error?x.message:String(x)}`)}if(e==="drag-snap-couples")try{let x=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let _=((s=S==null?void 0:S.errors)==null?void 0:s.join(`
419
- `))||(S==null?void 0:S.error)||"Failed to create drag-snap system.";alert(_);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(x){alert(`Failed to create drag-snap system: ${x instanceof Error?x.message:String(x)}`)}if(e==="swerve-collect")try{let x=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let _=((c=S==null?void 0:S.errors)==null?void 0:c.join(`
420
- `))||(S==null?void 0:S.error)||"Failed to create swerve collect system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(p=(d=this.options).onRefresh)==null||p.call(d)}catch(x){alert(`Failed to create swerve collect system: ${x instanceof Error?x.message:String(x)}`)}if(e==="tap-destroy")try{let x=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let _=((u=S==null?void 0:S.errors)==null?void 0:u.join(`
421
- `))||(S==null?void 0:S.error)||"Failed to create tap destroy system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(f=(g=this.options).onRefresh)==null||f.call(g)}catch(x){alert(`Failed to create tap destroy system: ${x instanceof Error?x.message:String(x)}`)}if(e==="scratch-card")try{let x=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let _=((m=S==null?void 0:S.errors)==null?void 0:m.join(`
422
- `))||(S==null?void 0:S.error)||"Failed to create scratch card system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(b=(h=this.options).onRefresh)==null||b.call(h)}catch(x){alert(`Failed to create scratch card system: ${x instanceof Error?x.message:String(x)}`)}if(e==="bullet-system")try{let x=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let _=((v=S==null?void 0:S.errors)==null?void 0:v.join(`
423
- `))||(S==null?void 0:S.error)||"Failed to create bullet system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(E=(y=this.options).onRefresh)==null||E.call(y)}catch(x){alert(`Failed to create bullet system: ${x instanceof Error?x.message:String(x)}`)}if(e==="spawner"){let x=await this.promptSpawnerConfig();if(!x)return;let{templateId:S,instanceId:_,spawnerProps:L}=x;try{let w=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,templateId:S,instanceId:_,spawnerProps:L})}),T=await w.json().catch(()=>({}));if(!w.ok||(T==null?void 0:T.success)===!1){let C=((A=T==null?void 0:T.errors)==null?void 0:A.join(`
424
- `))||(T==null?void 0:T.error)||"Failed to create spawner.";alert(C);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(R=(I=this.options).onRefresh)==null||R.call(I)}catch(w){alert(`Failed to create spawner: ${w instanceof Error?w.message:String(w)}`)}}}}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 Vt=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}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`
421
+ `))||(c==null?void 0:c.error)||"Failed to create from template.";alert(d);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(o=(s=this.options).onRefresh)==null||o.call(s)}catch(l){alert(`Failed to create from template: ${l instanceof Error?l.message:String(l)}`)}}async handleCreateSystem(e){var i,n,a,s,o,l,c,d,p,u,g,f,m,h,b,v,x,S,A,P,R,k,j,O,T,E,L;this.close();let t=await this.promptScreen();if(t){if(e==="collectable-system")try{let y=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await y.json().catch(()=>({}));if(!y.ok||(w==null?void 0:w.success)===!1){let C=((i=w==null?void 0:w.errors)==null?void 0:i.join(`
422
+ `))||(w==null?void 0:w.error)||"Failed to create collectable system.";alert(C);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(a=(n=this.options).onRefresh)==null||a.call(n)}catch(y){alert(`Failed to create collectable system: ${y instanceof Error?y.message:String(y)}`)}if(e==="drag-snap-couples")try{let y=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await y.json().catch(()=>({}));if(!y.ok||(w==null?void 0:w.success)===!1){let C=((s=w==null?void 0:w.errors)==null?void 0:s.join(`
423
+ `))||(w==null?void 0:w.error)||"Failed to create drag-snap system.";alert(C);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(y){alert(`Failed to create drag-snap system: ${y instanceof Error?y.message:String(y)}`)}if(e==="swerve-collect")try{let y=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await y.json().catch(()=>({}));if(!y.ok||(w==null?void 0:w.success)===!1){let C=((c=w==null?void 0:w.errors)==null?void 0:c.join(`
424
+ `))||(w==null?void 0:w.error)||"Failed to create swerve collect system.";alert(C);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(p=(d=this.options).onRefresh)==null||p.call(d)}catch(y){alert(`Failed to create swerve collect system: ${y instanceof Error?y.message:String(y)}`)}if(e==="tap-destroy")try{let y=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await y.json().catch(()=>({}));if(!y.ok||(w==null?void 0:w.success)===!1){let C=((u=w==null?void 0:w.errors)==null?void 0:u.join(`
425
+ `))||(w==null?void 0:w.error)||"Failed to create tap destroy system.";alert(C);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(f=(g=this.options).onRefresh)==null||f.call(g)}catch(y){alert(`Failed to create tap destroy system: ${y instanceof Error?y.message:String(y)}`)}if(e==="scratch-card")try{let y=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await y.json().catch(()=>({}));if(!y.ok||(w==null?void 0:w.success)===!1){let C=((m=w==null?void 0:w.errors)==null?void 0:m.join(`
426
+ `))||(w==null?void 0:w.error)||"Failed to create scratch card system.";alert(C);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(b=(h=this.options).onRefresh)==null||b.call(h)}catch(y){alert(`Failed to create scratch card system: ${y instanceof Error?y.message:String(y)}`)}if(e==="start-screen"||e==="start-screen-no-hand")try{let w=await fetch("/api/systems/start-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,withHand:e==="start-screen"})}),C=await w.json().catch(()=>({}));if(!w.ok||(C==null?void 0:C.success)===!1){let _=((v=C==null?void 0:C.errors)==null?void 0:v.join(`
427
+ `))||(C==null?void 0:C.error)||"Failed to create start screen template.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(S=(x=this.options).onRefresh)==null||S.call(x)}catch(y){alert(`Failed to create start screen template: ${y instanceof Error?y.message:String(y)}`)}if(e==="endgame-screen"||e==="endgame-screen-no-hand")try{let w=await fetch("/api/systems/endgame-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,withHand:e==="endgame-screen"})}),C=await w.json().catch(()=>({}));if(!w.ok||(C==null?void 0:C.success)===!1){let _=((A=C==null?void 0:C.errors)==null?void 0:A.join(`
428
+ `))||(C==null?void 0:C.error)||"Failed to create endgame screen template.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(R=(P=this.options).onRefresh)==null||R.call(P)}catch(y){alert(`Failed to create endgame screen template: ${y instanceof Error?y.message:String(y)}`)}if(e==="bullet-system")try{let y=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await y.json().catch(()=>({}));if(!y.ok||(w==null?void 0:w.success)===!1){let C=((k=w==null?void 0:w.errors)==null?void 0:k.join(`
429
+ `))||(w==null?void 0:w.error)||"Failed to create bullet system.";alert(C);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(O=(j=this.options).onRefresh)==null||O.call(j)}catch(y){alert(`Failed to create bullet system: ${y instanceof Error?y.message:String(y)}`)}if(e==="spawner"){let y=await this.promptSpawnerConfig();if(!y)return;let{templateId:w,instanceId:C,spawnerProps:_}=y;try{let M=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,templateId:w,instanceId:C,spawnerProps:_})}),I=await M.json().catch(()=>({}));if(!M.ok||(I==null?void 0:I.success)===!1){let D=((T=I==null?void 0:I.errors)==null?void 0:T.join(`
430
+ `))||(I==null?void 0:I.error)||"Failed to create spawner.";alert(D);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(L=(E=this.options).onRefresh)==null||L.call(E)}catch(M){alert(`Failed to create spawner: ${M instanceof Error?M.message:String(M)}`)}}}}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 Vt=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}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`
425
431
  <div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects">
426
432
  <div class="scene-panel-header" data-panel-handle>
427
433
  <div class="panel-title">
@@ -460,14 +466,16 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
460
466
  </div>
461
467
  <div class="panel-resize-handle-v" data-panel-resize-v></div>
462
468
  </div>
463
- `}initialize(e,t){var s,o,l,c,d,p,u,g;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(s=this.root)==null?void 0:s.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());let i=(c=this.root)==null?void 0:c.querySelector("[data-add-object]");i==null||i.addEventListener("click",f=>{f.stopPropagation();let m=i.getBoundingClientRect();this.openAddObjectMenu({x:m.left,y:m.bottom+4})});let n=(d=this.root)==null?void 0:d.querySelector("#scene-screen-filter");if(n){try{let f=window.localStorage.getItem(this.getScreenFilterStorageKey());f&&(this.screenFilter=f)}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 f=n.value||"all";this.screenFilter=f;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=(p=this.root)==null?void 0:p.querySelector("#scene-templates-toggle");if(a){try{let f=window.localStorage.getItem(this.getShowTemplatesStorageKey());this.showTemplates=f==="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()})}(u=this.root)==null||u.addEventListener("click",f=>{let m=f.target;if(!m||m.closest("[data-context-menu]"))return;let h=m.closest(".scene-object-checkbox");if(h||m.tagName==="INPUT"&&m.classList.contains("scene-object-checkbox")){let I=(h||m).dataset.objectId;if(!I)return;f.stopPropagation(),f.preventDefault(),this.toggleSelect(I);return}let b=m.closest("[data-object-id]");if(!b)return;let v=b.dataset.objectId;if(!v)return;let y=f.ctrlKey||f.metaKey;f.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,v):y?this.toggleSelect(v):this.select(v)}),(g=this.listContainer)==null||g.addEventListener("contextmenu",f=>{var A;let m=f.target,h=m==null?void 0:m.closest("[data-object-id]");if(!h)return;let b=h.dataset.objectId;if(!b)return;f.preventDefault();let v=window.getEditableObjectConfig,y=typeof v=="function"?v(b):null;if(!y){let I=window.__editableObjectConfigs;I&&typeof I.get=="function"&&(y=(A=I.get(b))!=null?A:null)}let E=this.inferScreen(b,y);this.showContextMenu(b,E,f.clientX,f.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,s,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;d.classList.toggle("selected",u);let g=d.querySelector(".scene-object-checkbox");g&&(g.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(s=this.root)==null?void 0:s.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),f={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(),h=this.formatDisplayName(m);i.textContent=f[g]||g,n.textContent=h,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var m;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let n=e();if(!Array.isArray(n)||n.length===0){let h=window.__editableObjectConfigs;h&&typeof h.keys=="function"&&(n=Array.from(h.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let a=(((m=this.searchInput)==null?void 0:m.value)||"").trim().toLowerCase(),s=["loading","start","gameplay","tutorial","endgame"],o=Object.fromEntries(s.map(h=>[h,[]])),l=Object.fromEntries(s.map(h=>[h,[]])),c=[],d=[];n.forEach(h=>{var M,P,j,k,O;let b=typeof t=="function"?t(h):null;if(!b){let D=window.__editableObjectConfigs;D&&typeof D.get=="function"&&(b=(M=D.get(h))!=null?M:null)}let v=(((P=b==null?void 0:b.identity)==null?void 0:P.category)||"scene").toString(),y=(((j=b==null?void 0:b.identity)==null?void 0:j.id)||h).toString(),E=v.toLowerCase(),A=y.toLowerCase(),I=E.includes("ui")||A.startsWith("ui")||A.includes("label"),R=E==="system",x=((k=b==null?void 0:b.identity)==null?void 0:k.is_template)===!0||A.includes(".template")||h.toLowerCase().includes(".template"),S=this.formatDisplayName(y||h),_=((O=b==null?void 0:b.render)==null?void 0:O.visible)===!1||(b==null?void 0:b.enabled)===!1,L=this.getObjectType(b),w={id:h,label:S,category:v,isUi:I,isTemplate:x,isUnused:_,objectType:L},T=this.inferScreen(w.id,b);if(!(this.screenFilter!=="all"&&T!==this.screenFilter||!(!a||w.id.toLowerCase().includes(a)||w.label.toLowerCase().includes(a)))){if(x){if(!this.showTemplates)return;d.push(w);return}R?c.push(w):(w.isUnused?l:o)[T].push(w)}});let p={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},u=c.length>0?this.renderSystemGroup(c):"",g=s.map(h=>this.renderGroup(p[h],[...o[h],...l[h]])).join(""),f=d.length>0?this.renderGroup("Templates",d):"";if(this.listContainer.innerHTML=u+g+f,this.objectEntries=[...c,...s.flatMap(h=>[...o[h],...l[h]]),...d],c.length>0){let h=this.listContainer.querySelector("[data-delete-system-group]");h==null||h.addEventListener("click",b=>{b.stopPropagation(),this.deleteSystemGroup(c)})}this.updateSelectionUI()}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var o,l;let i=window.__HANDLER_SCREEN_INDEX,n=(o=i==null?void 0:i.instanceToScreen)==null?void 0:o[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let a=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${a}`.toLowerCase();return s.includes("loading")?"loading":s.includes("start")?"start":s.includes("tutorial")?"tutorial":s.includes("endgame")||s.includes("end_card")||s.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,s,o,l,c,d;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.endsWith(".json")?"animation":((o=(s=e.render)==null?void 0:s.asset)==null?void 0:o.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(d=(c=e.gameplay)==null?void 0:c.tuning)!=null&&d.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(a=>{var u,g;let s=typeof i=="function"?i(a.id):null;if(!s){let f=window.__editableObjectConfigs;f&&typeof f.get=="function"&&(s=(u=f.get(a.id))!=null?u:null)}let o=this.getTypeIconByType(a.objectType),l=this.getAssetPreview(s),c=(g=s==null?void 0:s.ui)!=null&&g.text?`"${s.ui.text.substring(0,12)}${s.ui.text.length>12?"...":""}"`:"",d=a.isTemplate?'<span class="scene-object-badge template">template</span>':"",p=this.selectedIds.has(a.id);return`
464
- <button class="scene-object-item ${a.isUnused?"unused":""}" data-object-id="${a.id}">
465
- <input type="checkbox" class="scene-object-checkbox" ${p?"checked":""} data-object-id="${a.id}">
466
- <span class="scene-object-label">${a.label}</span>
467
- ${c?`<span class="scene-object-text-preview">${c}</span>`:""}
468
- ${d}
469
- <span class="scene-object-badge ${a.isUi?"ui":"scene"}">${a.category}</span>
470
- </button>
469
+ `}initialize(e,t){var s,o,l,c,d,p,u,g;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(s=this.root)==null?void 0:s.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());let i=(c=this.root)==null?void 0:c.querySelector("[data-add-object]");i==null||i.addEventListener("click",f=>{f.stopPropagation();let m=i.getBoundingClientRect();this.openAddObjectMenu({x:m.left,y:m.bottom+4})});let n=(d=this.root)==null?void 0:d.querySelector("#scene-screen-filter");if(n){try{let f=window.localStorage.getItem(this.getScreenFilterStorageKey());f&&(this.screenFilter=f)}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 f=n.value||"all";this.screenFilter=f;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=(p=this.root)==null?void 0:p.querySelector("#scene-templates-toggle");if(a){try{let f=window.localStorage.getItem(this.getShowTemplatesStorageKey());this.showTemplates=f==="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()})}(u=this.root)==null||u.addEventListener("click",f=>{let m=f.target;if(!m||m.closest("[data-context-menu]"))return;if(m.tagName==="INPUT"&&m.classList.contains("scene-object-checkbox")){let A=m.dataset.objectId;if(!A)return;f.stopPropagation(),this.toggleBatchSelect(A);return}let h=m.closest(".scene-object-item[data-object-id]");if(!h)return;let b=h.dataset.objectId;if(!b)return;let v=f.ctrlKey||f.metaKey;f.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,b):v?this.toggleBatchSelect(b):this.select(b)}),(g=this.listContainer)==null||g.addEventListener("contextmenu",f=>{var A;let m=f.target,h=m==null?void 0:m.closest("[data-object-id]");if(!h)return;let b=h.dataset.objectId;if(!b)return;f.preventDefault();let v=window.getEditableObjectConfig,x=typeof v=="function"?v(b):null;if(!x){let P=window.__editableObjectConfigs;P&&typeof P.get=="function"&&(x=(A=P.get(b))!=null?A:null)}let S=this.inferScreen(b,x);this.showContextMenu(b,S,f.clientX,f.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,s,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 f=d.closest(".scene-object-item-wrapper"),m=f==null?void 0:f.querySelector(".scene-object-checkbox");m&&(m.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(s=this.root)==null?void 0:s.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),f={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(),h=this.formatDisplayName(m);i.textContent=f[g]||g,n.textContent=h,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var m;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let n=e();if(!Array.isArray(n)||n.length===0){let h=window.__editableObjectConfigs;h&&typeof h.keys=="function"&&(n=Array.from(h.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let a=(((m=this.searchInput)==null?void 0:m.value)||"").trim().toLowerCase(),s=["loading","start","gameplay","tutorial","endgame"],o=Object.fromEntries(s.map(h=>[h,[]])),l=Object.fromEntries(s.map(h=>[h,[]])),c=[],d=[];n.forEach(h=>{var w,C,_,M,I;let b=typeof t=="function"?t(h):null;if(!b){let D=window.__editableObjectConfigs;D&&typeof D.get=="function"&&(b=(w=D.get(h))!=null?w:null)}let v=(((C=b==null?void 0:b.identity)==null?void 0:C.category)||"scene").toString(),x=(((_=b==null?void 0:b.identity)==null?void 0:_.id)||h).toString(),S=v.toLowerCase(),A=x.toLowerCase(),P=S.includes("ui")||A.startsWith("ui")||A.includes("label"),R=S==="system",k=((M=b==null?void 0:b.identity)==null?void 0:M.is_template)===!0||A.includes(".template")||h.toLowerCase().includes(".template"),j=this.formatDisplayName(x||h),O=((I=b==null?void 0:b.render)==null?void 0:I.visible)===!1||(b==null?void 0:b.enabled)===!1,T=this.getObjectType(b),E={id:h,label:j,category:v,isUi:P,isTemplate:k,isUnused:O,objectType:T},L=this.inferScreen(E.id,b);if(!(this.screenFilter!=="all"&&L!==this.screenFilter||!(!a||E.id.toLowerCase().includes(a)||E.label.toLowerCase().includes(a)))){if(k){if(!this.showTemplates)return;d.push(E);return}R?c.push(E):(E.isUnused?l:o)[L].push(E)}});let p={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},u=c.length>0?this.renderSystemGroup(c):"",g=s.map(h=>this.renderGroup(p[h],[...o[h],...l[h]])).join(""),f=d.length>0?this.renderGroup("Templates",d):"";if(this.listContainer.innerHTML=u+g+f,this.objectEntries=[...c,...s.flatMap(h=>[...o[h],...l[h]]),...d],c.length>0){let h=this.listContainer.querySelector("[data-delete-system-group]");h==null||h.addEventListener("click",b=>{b.stopPropagation(),this.deleteSystemGroup(c)})}this.updateSelectionUI()}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var o,l;let i=window.__HANDLER_SCREEN_INDEX,n=(o=i==null?void 0:i.instanceToScreen)==null?void 0:o[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let a=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${a}`.toLowerCase();return s.includes("loading")?"loading":s.includes("start")?"start":s.includes("tutorial")?"tutorial":s.includes("endgame")||s.includes("end_card")||s.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,s,o,l,c,d;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.endsWith(".json")?"animation":((o=(s=e.render)==null?void 0:s.asset)==null?void 0:o.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(d=(c=e.gameplay)==null?void 0:c.tuning)!=null&&d.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(a=>{var u,g;let s=typeof i=="function"?i(a.id):null;if(!s){let f=window.__editableObjectConfigs;f&&typeof f.get=="function"&&(s=(u=f.get(a.id))!=null?u:null)}let o=this.getTypeIconByType(a.objectType),l=this.getAssetPreview(s),c=(g=s==null?void 0:s.ui)!=null&&g.text?`"${s.ui.text.substring(0,12)}${s.ui.text.length>12?"...":""}"`:"",d=a.isTemplate?'<span class="scene-object-badge template">template</span>':"";return`
470
+ <div class="scene-object-item-wrapper">
471
+ <input type="checkbox" class="scene-object-checkbox" ${this.selectedIds.has(a.id)?"checked":""} data-object-id="${a.id}">
472
+ <button class="scene-object-item ${a.isUnused?"unused":""}" data-object-id="${a.id}">
473
+ <span class="scene-object-label">${a.label}</span>
474
+ ${c?`<span class="scene-object-text-preview">${c}</span>`:""}
475
+ ${d}
476
+ <span class="scene-object-badge ${a.isUi?"ui":"scene"}">${a.category}</span>
477
+ </button>
478
+ </div>
471
479
  `}).join("");return`
472
480
  <div class="scene-object-group">
473
481
  <div class="scene-object-group-title">${e} <span class="scene-object-count">${t.length}</span></div>
@@ -475,13 +483,15 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
475
483
  ${n}
476
484
  </div>
477
485
  </div>
478
- `}renderSystemGroup(e){if(!e.length)return"";let t=window.getEditableObjectConfig,i=e.map(n=>{var d,p;let a=typeof t=="function"?t(n.id):null;if(!a){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(a=(d=u.get(n.id))!=null?d:null)}let s=this.getTypeIconByType(n.objectType),o=this.getAssetPreview(a),l=(p=a==null?void 0:a.ui)!=null&&p.text?`"${a.ui.text.substring(0,12)}${a.ui.text.length>12?"...":""}"`:"",c=this.selectedIds.has(n.id);return`
479
- <button class="scene-object-item ${n.isUnused?"unused":""}" data-object-id="${n.id}">
480
- <input type="checkbox" class="scene-object-checkbox" ${c?"checked":""} data-object-id="${n.id}">
481
- <span class="scene-object-label">${n.label}</span>
482
- ${l?`<span class="scene-object-text-preview">${l}</span>`:""}
483
- <span class="scene-object-badge system">${n.category}</span>
484
- </button>
486
+ `}renderSystemGroup(e){if(!e.length)return"";let t=window.getEditableObjectConfig,i=e.map(n=>{var d,p;let a=typeof t=="function"?t(n.id):null;if(!a){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(a=(d=u.get(n.id))!=null?d:null)}let s=this.getTypeIconByType(n.objectType),o=this.getAssetPreview(a),l=(p=a==null?void 0:a.ui)!=null&&p.text?`"${a.ui.text.substring(0,12)}${a.ui.text.length>12?"...":""}"`:"";return`
487
+ <div class="scene-object-item-wrapper">
488
+ <input type="checkbox" class="scene-object-checkbox" ${this.selectedIds.has(n.id)?"checked":""} data-object-id="${n.id}">
489
+ <button class="scene-object-item ${n.isUnused?"unused":""}" data-object-id="${n.id}">
490
+ <span class="scene-object-label">${n.label}</span>
491
+ ${l?`<span class="scene-object-text-preview">${l}</span>`:""}
492
+ <span class="scene-object-badge system">${n.category}</span>
493
+ </button>
494
+ </div>
485
495
  `}).join("");return`
486
496
  <div class="scene-object-group scene-object-group-system">
487
497
  <div class="scene-object-group-title">
@@ -492,7 +502,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
492
502
  ${i}
493
503
  </div>
494
504
  </div>
495
- `}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var i,n,a,s,o,l;if(!e)return"\u{1F4E6}";if((i=e.render)!=null&&i.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((n=e.ui)!=null&&n.text)return"\u{1F4DD}";if(((a=e.identity)==null?void 0:a.category)==="ui")return"\u{1F3A8}";if(e.effects||(o=(s=e.identity)==null?void 0:s.id)!=null&&o.includes("effect"))return"\u2728";if(e.audio)return"\u{1F50A}";let t=((l=e.identity)==null?void 0:l.id)||"";return t.includes("background")?"\u{1F5BC}\uFE0F":t.includes("character")?"\u{1F464}":t.includes("key")?"\u{1F511}":t.includes("draggable")?"\u{1F3AF}":t.includes("machine")?"\u2699\uFE0F":t.includes("tutorial")||t.includes("hand")?"\u{1F446}":"\u{1F4E6}"}getAssetPreview(e){var i;if(!e)return null;let t=(i=e.render)==null?void 0:i.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var i,n,a,s;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((a=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:a.panel_bg_color)||((s=e.ui)==null?void 0:s.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var i,n,a,s;if(!e)return"";let t=[];return((i=e.render)==null?void 0:i.visible)===!1&&t.push("hidden"),((n=e.render)==null?void 0:n.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((a=e.interaction)!=null&&a.clickable||(s=e.ui)!=null&&s.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t,i,n;this.selectedIds.clear(),this.selectedIds.add(e),this.selectedId=e,this.updateLastSelectedIndex(e),this.updateSelectionUI(),(t=this.options)==null||t.onSelect(e),(n=(i=this.options)==null?void 0:i.onMultiSelect)==null||n.call(i,Array.from(this.selectedIds))}toggleSelect(e){var t,i,n;this.selectedIds.has(e)?(this.selectedIds.delete(e),this.selectedId===e&&(this.selectedId=this.selectedIds.size>0?Array.from(this.selectedIds)[0]:null)):(this.selectedIds.add(e),this.selectedId=e),this.updateLastSelectedIndex(e),this.updateSelectionUI(),this.selectedId&&((t=this.options)==null||t.onSelect(this.selectedId)),(n=(i=this.options)==null?void 0:i.onMultiSelect)==null||n.call(i,Array.from(this.selectedIds))}selectRange(e,t){var s,o,l;let i=this.objectEntries.findIndex(c=>c.id===t);if(i===-1)return;let n=Math.min(e,i),a=Math.max(e,i);for(let c=n;c<=a;c++)c>=0&&c<this.objectEntries.length&&this.selectedIds.add(this.objectEntries[c].id);this.selectedId=t,this.updateLastSelectedIndex(t),this.updateSelectionUI(),(s=this.options)==null||s.onSelect(this.selectedId),(l=(o=this.options)==null?void 0:o.onMultiSelect)==null||l.call(o,Array.from(this.selectedIds))}updateLastSelectedIndex(e){this.lastSelectedIndex=this.objectEntries.findIndex(t=>t.id===e)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectMenu(e){try{await new qt({onRefresh:()=>this.refreshObjects(),onClose:()=>{}}).open(e)}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectMenu:",t)}}async openAddObjectWizard(e){try{new Ut().open({screenId:e})}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectWizard:",t)}}async showContextMenu(e,t,i,n){if(!this.isContextMenuOpen){this.isContextMenuOpen=!0,this.selectedIds.has(e)||this.select(e);try{new Gt({objectId:e,screenId:t,onSelect:s=>{s&&this.select(s)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:s=>this.deleteObject(s),onMoveRequest:(s,o)=>this.moveObject(s,o)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var n;let t=this.getSelectedIds();if(t.length>1&&t.includes(e)){if(!window.confirm(`Delete ${t.length} selected object${t.length!==1?"s":""}? This removes them from the screen configuration.`))return;await this.deleteMultipleObjects(t)}else{if(!window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))return;try{let s=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e})}),o=await s.json().catch(()=>null);if(!s.ok||(o==null?void 0:o.success)===!1){let l=((n=o==null?void 0:o.errors)==null?void 0:n.join(`
505
+ `}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var i,n,a,s,o,l;if(!e)return"\u{1F4E6}";if((i=e.render)!=null&&i.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((n=e.ui)!=null&&n.text)return"\u{1F4DD}";if(((a=e.identity)==null?void 0:a.category)==="ui")return"\u{1F3A8}";if(e.effects||(o=(s=e.identity)==null?void 0:s.id)!=null&&o.includes("effect"))return"\u2728";if(e.audio)return"\u{1F50A}";let t=((l=e.identity)==null?void 0:l.id)||"";return t.includes("background")?"\u{1F5BC}\uFE0F":t.includes("character")?"\u{1F464}":t.includes("key")?"\u{1F511}":t.includes("draggable")?"\u{1F3AF}":t.includes("machine")?"\u2699\uFE0F":t.includes("tutorial")||t.includes("hand")?"\u{1F446}":"\u{1F4E6}"}getAssetPreview(e){var i;if(!e)return null;let t=(i=e.render)==null?void 0:i.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var i,n,a,s;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((a=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:a.panel_bg_color)||((s=e.ui)==null?void 0:s.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var i,n,a,s;if(!e)return"";let t=[];return((i=e.render)==null?void 0:i.visible)===!1&&t.push("hidden"),((n=e.render)==null?void 0:n.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((a=e.interaction)!=null&&a.clickable||(s=e.ui)!=null&&s.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t,i,n;this.selectedId=e,this.selectedIds.has(e)||this.selectedIds.add(e),this.updateLastSelectedIndex(e),this.updateSelectionUI(),(t=this.options)==null||t.onSelect(e),(n=(i=this.options)==null?void 0:i.onMultiSelect)==null||n.call(i,Array.from(this.selectedIds))}toggleBatchSelect(e){var t,i;this.selectedIds.has(e)?this.selectedIds.delete(e):this.selectedIds.add(e),this.updateSelectionUI(),(i=(t=this.options)==null?void 0:t.onMultiSelect)==null||i.call(t,Array.from(this.selectedIds))}toggleSelect(e){this.toggleBatchSelect(e)}selectRange(e,t){var s,o,l;let i=this.objectEntries.findIndex(c=>c.id===t);if(i===-1)return;let n=Math.min(e,i),a=Math.max(e,i);for(let c=n;c<=a;c++)c>=0&&c<this.objectEntries.length&&this.selectedIds.add(this.objectEntries[c].id);this.selectedId=t,this.updateLastSelectedIndex(t),this.updateSelectionUI(),(s=this.options)==null||s.onSelect(this.selectedId),(l=(o=this.options)==null?void 0:o.onMultiSelect)==null||l.call(o,Array.from(this.selectedIds))}updateLastSelectedIndex(e){this.lastSelectedIndex=this.objectEntries.findIndex(t=>t.id===e)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectMenu(e){try{await new qt({onRefresh:()=>this.refreshObjects(),onClose:()=>{}}).open(e)}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectMenu:",t)}}async openAddObjectWizard(e){try{new Ut().open({screenId:e})}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectWizard:",t)}}async showContextMenu(e,t,i,n){if(!this.isContextMenuOpen){this.isContextMenuOpen=!0,this.selectedIds.has(e)||this.select(e);try{new Gt({objectId:e,screenId:t,onSelect:s=>{s&&this.select(s)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:s=>this.deleteObject(s),onMoveRequest:(s,o)=>this.moveObject(s,o)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var n;let t=this.getSelectedIds();if(t.length>1&&t.includes(e)){if(!window.confirm(`Delete ${t.length} selected object${t.length!==1?"s":""}? This removes them from the screen configuration.`))return;await this.deleteMultipleObjects(t)}else{if(!window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))return;try{let s=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e})}),o=await s.json().catch(()=>null);if(!s.ok||(o==null?void 0:o.success)===!1){let l=((n=o==null?void 0:o.errors)==null?void 0:n.join(`
496
506
  `))||(o==null?void 0:o.error)||"Delete failed.";alert(l);return}await this.syncScreens(),this.selectedIds.delete(e),this.selectedId===e&&(this.selectedId=null),this.refreshObjects()}catch(s){alert(`Delete failed: ${s instanceof Error?s.message:String(s)}`)}}}async deleteMultipleObjects(e){var a;let t=0,i=0,n=[];for(let s of e)try{let o=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:s})}),l=await o.json().catch(()=>null);if(o.ok&&(l==null?void 0:l.success)!==!1)t++,this.selectedIds.delete(s);else{i++;let c=((a=l==null?void 0:l.errors)==null?void 0:a.join(`
497
507
  `))||(l==null?void 0:l.error)||"Delete failed.";n.push(`${s}: ${c}`)}}catch(o){i++,n.push(`${s}: ${o instanceof Error?o.message:String(o)}`)}if(i>0){let s=n.length>0?n.join(`
498
508
  `):`${i} object(s) failed to delete.`;alert(`Deleted ${t} object(s). Errors:
@@ -785,30 +795,30 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
785
795
  </select>
786
796
  </div>
787
797
  </div>
788
- `);for(let u in i){if(u==="id")continue;let g=i[u],f=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let h=[];for(let b in g){let v=g[b],y=`${f}.${b}`,E=o[b];if(b==="targetId"||b==="inputId"){let A=this.registry.getObjectIds(),I=typeof v=="string"?v:"",R=I&&!A.includes(I)?[I,...A]:A;h.push(`
798
+ `);for(let u in i){if(u==="id")continue;let g=i[u],f=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let h=[];for(let b in g){let v=g[b],x=`${f}.${b}`,S=o[b];if(b==="targetId"||b==="inputId"){let A=this.registry.getObjectIds(),P=typeof v=="string"?v:"",R=P&&!A.includes(P)?[P,...A]:A;h.push(`
789
799
  <div class="inspector-property inspector-property-text">
790
800
  <label class="inspector-property-label">${this.formatLabel(b)}</label>
791
801
  <div class="inspector-input-group">
792
802
  <select class="inspector-component-select inspector-input"
793
- data-property-path="${y}"
803
+ data-property-path="${x}"
794
804
  data-object-id="${e}">
795
- <option value="" ${I?"":"selected"}>None</option>
796
- ${R.map(x=>`<option value="${x}" ${x===I?"selected":""}>${x}</option>`).join("")}
805
+ <option value="" ${P?"":"selected"}>None</option>
806
+ ${R.map(k=>`<option value="${k}" ${k===P?"selected":""}>${k}</option>`).join("")}
797
807
  </select>
798
808
  </div>
799
809
  </div>
800
- `);continue}if(Array.isArray(E)&&E.length)h.push(`
810
+ `);continue}if(Array.isArray(S)&&S.length)h.push(`
801
811
  <div class="inspector-property inspector-property-text">
802
812
  <label class="inspector-property-label">${this.formatLabel(b)}</label>
803
813
  <div class="inspector-input-group">
804
814
  <select class="inspector-component-select inspector-input"
805
- data-property-path="${y}"
815
+ data-property-path="${x}"
806
816
  data-object-id="${e}">
807
- ${E.map(A=>`<option value="${String(A)}" ${String(A)===String(v)?"selected":""}>${String(A)}</option>`).join("")}
817
+ ${S.map(A=>`<option value="${String(A)}" ${String(A)===String(v)?"selected":""}>${String(A)}</option>`).join("")}
808
818
  </select>
809
819
  </div>
810
820
  </div>
811
- `);else{let A=this.registry.renderProperty(e,b,v,y);A&&h.push(A)}}h.length&&a.push(`
821
+ `);else{let A=this.registry.renderProperty(e,b,v,x);A&&h.push(A)}}h.length&&a.push(`
812
822
  <div class="inspector-property inspector-property-object">
813
823
  <div class="inspector-object-header">Props</div>
814
824
  <div class="inspector-object-body">
@@ -933,7 +943,7 @@ ${m}
933
943
  Add Logic
934
944
  </button>
935
945
  </div>
936
- `: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 f=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,f,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 f=this.getObjectIds(),m=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...f]);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"],h=i==null?"1":String(i);return this.selectRenderer.render(e,t,h,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 gs(r,e){let t;return function(...n){let a=()=>{clearTimeout(t),r(...n)};clearTimeout(t),t=setTimeout(a,e)}}var li=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 oi,this.updateManager=new je,this.quickActions=new Bt;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`
946
+ `: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 f=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,f,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 f=this.getObjectIds(),m=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...f]);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"],h=i==null?"1":String(i);return this.selectRenderer.render(e,t,h,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 gs(r,e){let t;return function(...n){let a=()=>{clearTimeout(t),r(...n)};clearTimeout(t),t=setTimeout(a,e)}}var li=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 oi,this.updateManager=new _e,this.quickActions=new Bt;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`
937
947
  <div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
938
948
  <div class="scene-panel-header" data-panel-handle>
939
949
  <div class="panel-title">
@@ -1022,7 +1032,7 @@ ${m}
1022
1032
  <button class="debug-btn debug-btn-sm ${this.motionSimpleMode?"primary":""}" data-motion-simple-toggle>
1023
1033
  ${this.motionSimpleMode?"Simple":"Advanced"}
1024
1034
  </button>
1025
- `,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',u=m=>{let h=m.split(".").filter(Boolean),b=s;for(let E of h)b=b==null?void 0:b[E];let v=h[h.length-1],y=`${i}.${m}`;return this.rendererRegistry.renderProperty(e,v,b,y)};if(this.motionSimpleMode){let m=u("enabled");m&&n.push(m);let h=[],b=u("intro.enabled"),v=u("intro.type"),y=u("intro.duration"),E=u("intro.easing");b&&h.push(b),v&&h.push(v),y&&h.push(y),E&&h.push(E),h.length&&n.push(`
1035
+ `,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',u=m=>{let h=m.split(".").filter(Boolean),b=s;for(let S of h)b=b==null?void 0:b[S];let v=h[h.length-1],x=`${i}.${m}`;return this.rendererRegistry.renderProperty(e,v,b,x)};if(this.motionSimpleMode){let m=u("enabled");m&&n.push(m);let h=[],b=u("intro.enabled"),v=u("intro.type"),x=u("intro.duration"),S=u("intro.easing");b&&h.push(b),v&&h.push(v),x&&h.push(x),S&&h.push(S),h.length&&n.push(`
1026
1036
  <div class="inspector-subsection">
1027
1037
  <div class="inspector-subsection-title">Intro</div>
1028
1038
  <div class="inspector-subsection-content">
@@ -1031,15 +1041,15 @@ ${m}
1031
1041
  ${h.join("")}
1032
1042
  </div>
1033
1043
  </div>
1034
- `);let A=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),I=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),R=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),x=[u("continuousRotate.enabled"),u("continuousRotate.speed"),u("continuousRotate.direction")].filter(Boolean),S=[u("orbit.enabled"),u("orbit.radius"),u("orbit.speed"),u("orbit.direction"),u("orbit.pivotOffsetX"),u("orbit.pivotOffsetY")].filter(Boolean);if(A.length||I.length||R.length||x.length||S.length){let L=(T,C)=>C.length?`
1044
+ `);let A=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),P=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),R=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),k=[u("continuousRotate.enabled"),u("continuousRotate.speed"),u("continuousRotate.direction")].filter(Boolean),j=[u("orbit.enabled"),u("orbit.radius"),u("orbit.speed"),u("orbit.direction"),u("orbit.pivotOffsetX"),u("orbit.pivotOffsetY")].filter(Boolean);if(A.length||P.length||R.length||k.length||j.length){let T=(L,y)=>y.length?`
1035
1045
  <div class="inspector-motion-continuous-group">
1036
- <div class="inspector-subsection-title">${T}</div>
1037
- <div class="inspector-subsection-content">${C.join("")}</div>
1038
- </div>`:"",w=[L("Pulse",A),L("Swing",I),L("Move forever",R),L("Rotate (pivoting itself)",x),L("Rotate around",S)].filter(Boolean).join("");n.push(`
1046
+ <div class="inspector-subsection-title">${L}</div>
1047
+ <div class="inspector-subsection-content">${y.join("")}</div>
1048
+ </div>`:"",E=[T("Pulse",A),T("Swing",P),T("Move forever",R),T("Rotate (pivoting itself)",k),T("Rotate around",j)].filter(Boolean).join("");n.push(`
1039
1049
  <div class="inspector-subsection inspector-subsection-continuous">
1040
1050
  <div class="inspector-subsection-title">Continuous</div>
1041
1051
  <div class="inspector-subsection-content inspector-motion-continuous-groups">
1042
- ${w}
1052
+ ${E}
1043
1053
  </div>
1044
1054
  </div>
1045
1055
  `)}}else for(let m in s){let h=s[m],b=`${i}.${m}`,v=this.rendererRegistry.renderProperty(e,m,h,b);v&&n.push(v)}return n.length===0?"":`
@@ -1055,7 +1065,7 @@ ${m}
1055
1065
  ${n.join("")}
1056
1066
  </div>
1057
1067
  </div>
1058
- `}attachEventListeners(){var E,A,I,R;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=gs((x,S,_)=>{var L,w;this.updateManager.updateProperty(x,S,_),(w=(L=this.options)==null?void 0:L.onPropertyChange)==null||w.call(L,x,S,_)},300),i=x=>x?/(^|\.)logic(\.\d+)?\.id$/.test(x):!1;e.forEach(x=>{let S=L=>{var M,P;let w=L.target,T=w.dataset.propertyPath,C=w.dataset.objectId;if(T&&C){let j=w.value;if(w.type==="checkbox")j=w.checked;else if(w.type==="number"){if(j=parseFloat(w.value),isNaN(j))return}else if(w.dataset.json==="true")try{j=JSON.parse(w.value)}catch{return}w.type==="text"||w.type==="range"||w.tagName==="TEXTAREA"?t(C,T,j):(this.updateManager.updateProperty(C,T,j),(P=(M=this.options)==null?void 0:M.onPropertyChange)==null||P.call(M,C,T,j))}},_=x.dataset.propertyPath;i(_)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",_),x.addEventListener("change",async L=>{var D;let w=L.target,T=w.dataset.propertyPath,C=w.dataset.objectId,M=w.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",M),!T||!C)return;await this.updateManager.updateProperty(C,T,M),console.log("[Inspector v1.0.0] Logic ID updated");let P=window,j=(D=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:D[M],k=this.getDefaultPropsForLogic(M,j);console.log("[Inspector v1.0.0] New logic default props:",k);let O=T.replace(/\.id$/,".props");await this.updateManager.updateProperty(C,O,k),console.log("[Inspector v1.0.0] Logic props updated to:",k),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(C)})):(x.addEventListener("change",S),(x.tagName==="INPUT"||x.tagName==="TEXTAREA")&&x.addEventListener("input",S))}),this.contentContainer.querySelectorAll("[data-action]").forEach(x=>{x.addEventListener("click",S=>{let _=S.target,L=_.dataset.action,w=_.dataset.path,T=_.dataset.object;L&&w&&T&&this.quickActions.handleAction(L,T,w)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(x=>{x.addEventListener("click",S=>{var w,T;let _=S.target,L=_.dataset.sectionToggle||((w=_.closest("[data-section-toggle]"))==null?void 0:w.getAttribute("data-section-toggle"));if(L){let C=(T=this.contentContainer)==null?void 0:T.querySelector(`[data-section="${L}"]`);C==null||C.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(x=>{x.addEventListener("click",async S=>{let L=S.currentTarget.dataset.motionPreset;!L||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,L)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(x=>{x.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(x=>{x.addEventListener("click",async S=>{let _=S.target,L=_.dataset.objectId,w=_.dataset.propertyPath;if(!L||!w)return;let T=window.getEditableObjectConfig,C=T==null?void 0:T(L);if(!C)return;let M=this.updateManager.getNestedProperty(C,w),P=Array.isArray(M)?[...M]:[];P.push({x:0,y:0}),await this.updateManager.updateProperty(L,w,P),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(x=>{x.addEventListener("click",async S=>{let _=S.target,L=_.dataset.objectId,w=_.dataset.propertyPath,T=Number(_.dataset.index||"-1");if(!L||!w||T<0)return;let C=window.getEditableObjectConfig,M=C==null?void 0:C(L);if(!M)return;let P=this.updateManager.getNestedProperty(M,w);if(!Array.isArray(P))return;let j=P.filter((k,O)=>O!==T);await this.updateManager.updateProperty(L,w,j),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(x=>{x.addEventListener("click",async S=>{let _=S.target,L=_.dataset.objectId,w=_.dataset.propertyPath;if(!L||!w)return;let T=window.getEditableObjectConfig,C=T==null?void 0:T(L);if(!C)return;let M=this.updateManager.getNestedProperty(C,w),P=Array.isArray(M)?[...M]:[];P.push({templateId:"",weight:1}),await this.updateManager.updateProperty(L,w,P),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(x=>{x.addEventListener("click",async S=>{var k;let _=S.target,L=_.dataset.objectId,w=_.dataset.propertyPath,T=Number((k=_.dataset.index)!=null?k:-1);if(!L||!w||T<0)return;let C=window.getEditableObjectConfig,M=C==null?void 0:C(L);if(!M)return;let P=this.updateManager.getNestedProperty(M,w);if(!Array.isArray(P))return;let j=P.filter((O,D)=>D!==T);await this.updateManager.updateProperty(L,w,j),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(x=>{x.addEventListener("click",async S=>{var F;let _=S.target,L=_.dataset.objectId,w=_.dataset.propertyPath;if(!L||!w)return;let T=window.getEditableObjectConfig,C=T==null?void 0:T(L);if(!C)return;let M=this.updateManager.getNestedProperty(C,w),P;Array.isArray(M)?P=[...M]:M!=null?typeof M=="string"?P=[{id:M,props:{}}]:typeof M=="object"?P=[M]:P=[]:P=[];let j=this.getDefaultLogicId(),k=window,O=(F=k==null?void 0:k.__HANDLER_LOGIC_META)==null?void 0:F[j],D=this.getDefaultPropsForLogic(j,O);P.push({id:j,props:D}),console.log("[InspectorPanel] Adding logic to array:",{objectId:L,path:w,current:M,next:P}),await this.updateManager.updateProperty(L,w,P),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(x=>{x.addEventListener("click",async S=>{var k;let _=S.target,L=_.dataset.objectId,w=_.dataset.propertyPath,T=Number((k=_.dataset.index)!=null?k:-1);if(!L||!w||T<0)return;let C=window.getEditableObjectConfig,M=C==null?void 0:C(L);if(!M)return;let P=this.updateManager.getNestedProperty(M,w);if(!Array.isArray(P))return;let j=P.filter((O,D)=>D!==T);await this.updateManager.updateProperty(L,w,j),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(x=>{x.addEventListener("click",async S=>{var H,B;let _=S.target,L=_.dataset.objectId,w=_.dataset.propertyPath,T=Number((H=_.dataset.index)!=null?H:-1);if(!L||!w||T<0)return;let C=window.getEditableObjectConfig,M=C==null?void 0:C(L);if(!M)return;let P=this.updateManager.getNestedProperty(M,w);if(!Array.isArray(P))return;let j=P[T];if(typeof j!="string")return;let k=window,O=(B=k==null?void 0:k.__HANDLER_LOGIC_META)==null?void 0:B[j],D=this.getDefaultPropsForLogic(j,O),F=[...P];F[T]={id:j,props:D},await this.updateManager.updateProperty(L,w,F),this.loadObject(L)})});let h=(E=this.root)==null?void 0:E.querySelector("[data-inspector-advanced]");h==null||h.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(A=this.root)==null?void 0:A.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var S;let x=(S=this.root)==null?void 0:S.querySelector("[data-convert-menu]");x==null||x.classList.toggle("hidden")});let v=(I=this.contentContainer)==null?void 0:I.querySelector("[data-inspector-add-component-btn]"),y=(R=this.contentContainer)==null?void 0:R.querySelector("[data-inspector-component-select]");v==null||v.addEventListener("click",async()=>{let x=y.value;x&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,x)})}getMotionDefaults(){var i,n,a,s;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"?(s=(a=t.motion)==null?void 0:a.defaults)!=null?s:{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(),s={...(l=n.motion)!=null?l:a},o={...(c=s.intro)!=null?c:{}};s.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",s.intro=o,await this.updateManager.updateProperty(e,"motion",s),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},s={...(l=a.intro)!=null?l:{}};a.enabled=!0,s.enabled=!0,a.intro=s,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,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,s=a==null?void 0:a.schemas,o=null;s instanceof Map?o=s.get(t):s&&typeof s=="object"&&(o=s[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,s;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((s=(a=i.render)==null?void 0:a.asset)==null?void 0:s.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=`
1068
+ `}attachEventListeners(){var S,A,P,R;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=gs((k,j,O)=>{var T,E;this.updateManager.updateProperty(k,j,O),(E=(T=this.options)==null?void 0:T.onPropertyChange)==null||E.call(T,k,j,O)},300),i=k=>k?/(^|\.)logic(\.\d+)?\.id$/.test(k):!1;e.forEach(k=>{let j=T=>{var w,C;let E=T.target,L=E.dataset.propertyPath,y=E.dataset.objectId;if(L&&y){let _=E.value;if(E.type==="checkbox")_=E.checked;else if(E.type==="number"){if(_=parseFloat(E.value),isNaN(_))return}else if(E.dataset.json==="true")try{_=JSON.parse(E.value)}catch{return}E.type==="text"||E.type==="range"||E.tagName==="TEXTAREA"?t(y,L,_):(this.updateManager.updateProperty(y,L,_),(C=(w=this.options)==null?void 0:w.onPropertyChange)==null||C.call(w,y,L,_))}},O=k.dataset.propertyPath;i(O)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",O),k.addEventListener("change",async T=>{var D;let E=T.target,L=E.dataset.propertyPath,y=E.dataset.objectId,w=E.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",w),!L||!y)return;await this.updateManager.updateProperty(y,L,w),console.log("[Inspector v1.0.0] Logic ID updated");let C=window,_=(D=C==null?void 0:C.__HANDLER_LOGIC_META)==null?void 0:D[w],M=this.getDefaultPropsForLogic(w,_);console.log("[Inspector v1.0.0] New logic default props:",M);let I=L.replace(/\.id$/,".props");await this.updateManager.updateProperty(y,I,M),console.log("[Inspector v1.0.0] Logic props updated to:",M),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(y)})):(k.addEventListener("change",j),(k.tagName==="INPUT"||k.tagName==="TEXTAREA")&&k.addEventListener("input",j))}),this.contentContainer.querySelectorAll("[data-action]").forEach(k=>{k.addEventListener("click",j=>{let O=j.target,T=O.dataset.action,E=O.dataset.path,L=O.dataset.object;T&&E&&L&&this.quickActions.handleAction(T,L,E)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(k=>{k.addEventListener("click",j=>{var E,L;let O=j.target,T=O.dataset.sectionToggle||((E=O.closest("[data-section-toggle]"))==null?void 0:E.getAttribute("data-section-toggle"));if(T){let y=(L=this.contentContainer)==null?void 0:L.querySelector(`[data-section="${T}"]`);y==null||y.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(k=>{k.addEventListener("click",async j=>{let T=j.currentTarget.dataset.motionPreset;!T||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,T)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(k=>{k.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(k=>{k.addEventListener("click",async j=>{let O=j.target,T=O.dataset.objectId,E=O.dataset.propertyPath;if(!T||!E)return;let L=window.getEditableObjectConfig,y=L==null?void 0:L(T);if(!y)return;let w=this.updateManager.getNestedProperty(y,E),C=Array.isArray(w)?[...w]:[];C.push({x:0,y:0}),await this.updateManager.updateProperty(T,E,C),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(k=>{k.addEventListener("click",async j=>{let O=j.target,T=O.dataset.objectId,E=O.dataset.propertyPath,L=Number(O.dataset.index||"-1");if(!T||!E||L<0)return;let y=window.getEditableObjectConfig,w=y==null?void 0:y(T);if(!w)return;let C=this.updateManager.getNestedProperty(w,E);if(!Array.isArray(C))return;let _=C.filter((M,I)=>I!==L);await this.updateManager.updateProperty(T,E,_),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(k=>{k.addEventListener("click",async j=>{let O=j.target,T=O.dataset.objectId,E=O.dataset.propertyPath;if(!T||!E)return;let L=window.getEditableObjectConfig,y=L==null?void 0:L(T);if(!y)return;let w=this.updateManager.getNestedProperty(y,E),C=Array.isArray(w)?[...w]:[];C.push({templateId:"",weight:1}),await this.updateManager.updateProperty(T,E,C),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(k=>{k.addEventListener("click",async j=>{var M;let O=j.target,T=O.dataset.objectId,E=O.dataset.propertyPath,L=Number((M=O.dataset.index)!=null?M:-1);if(!T||!E||L<0)return;let y=window.getEditableObjectConfig,w=y==null?void 0:y(T);if(!w)return;let C=this.updateManager.getNestedProperty(w,E);if(!Array.isArray(C))return;let _=C.filter((I,D)=>D!==L);await this.updateManager.updateProperty(T,E,_),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(k=>{k.addEventListener("click",async j=>{var F;let O=j.target,T=O.dataset.objectId,E=O.dataset.propertyPath;if(!T||!E)return;let L=window.getEditableObjectConfig,y=L==null?void 0:L(T);if(!y)return;let w=this.updateManager.getNestedProperty(y,E),C;Array.isArray(w)?C=[...w]:w!=null?typeof w=="string"?C=[{id:w,props:{}}]:typeof w=="object"?C=[w]:C=[]:C=[];let _=this.getDefaultLogicId(),M=window,I=(F=M==null?void 0:M.__HANDLER_LOGIC_META)==null?void 0:F[_],D=this.getDefaultPropsForLogic(_,I);C.push({id:_,props:D}),console.log("[InspectorPanel] Adding logic to array:",{objectId:T,path:E,current:w,next:C}),await this.updateManager.updateProperty(T,E,C),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(k=>{k.addEventListener("click",async j=>{var M;let O=j.target,T=O.dataset.objectId,E=O.dataset.propertyPath,L=Number((M=O.dataset.index)!=null?M:-1);if(!T||!E||L<0)return;let y=window.getEditableObjectConfig,w=y==null?void 0:y(T);if(!w)return;let C=this.updateManager.getNestedProperty(w,E);if(!Array.isArray(C))return;let _=C.filter((I,D)=>D!==L);await this.updateManager.updateProperty(T,E,_),this.loadObject(T)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(k=>{k.addEventListener("click",async j=>{var H,B;let O=j.target,T=O.dataset.objectId,E=O.dataset.propertyPath,L=Number((H=O.dataset.index)!=null?H:-1);if(!T||!E||L<0)return;let y=window.getEditableObjectConfig,w=y==null?void 0:y(T);if(!w)return;let C=this.updateManager.getNestedProperty(w,E);if(!Array.isArray(C))return;let _=C[L];if(typeof _!="string")return;let M=window,I=(B=M==null?void 0:M.__HANDLER_LOGIC_META)==null?void 0:B[_],D=this.getDefaultPropsForLogic(_,I),F=[...C];F[L]={id:_,props:D},await this.updateManager.updateProperty(T,E,F),this.loadObject(T)})});let h=(S=this.root)==null?void 0:S.querySelector("[data-inspector-advanced]");h==null||h.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(A=this.root)==null?void 0:A.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var j;let k=(j=this.root)==null?void 0:j.querySelector("[data-convert-menu]");k==null||k.classList.toggle("hidden")});let v=(P=this.contentContainer)==null?void 0:P.querySelector("[data-inspector-add-component-btn]"),x=(R=this.contentContainer)==null?void 0:R.querySelector("[data-inspector-component-select]");v==null||v.addEventListener("click",async()=>{let k=x.value;k&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,k)})}getMotionDefaults(){var i,n,a,s;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"?(s=(a=t.motion)==null?void 0:a.defaults)!=null?s:{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(),s={...(l=n.motion)!=null?l:a},o={...(c=s.intro)!=null?c:{}};s.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",s.intro=o,await this.updateManager.updateProperty(e,"motion",s),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},s={...(l=a.intro)!=null?l:{}};a.enabled=!0,s.enabled=!0,a.intro=s,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,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,s=a==null?void 0:a.schemas,o=null;s instanceof Map?o=s.get(t):s&&typeof s=="object"&&(o=s[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,s;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((s=(a=i.render)==null?void 0:a.asset)==null?void 0:s.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=`
1059
1069
  <div class="inspector-empty">
1060
1070
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
1061
1071
  <span class="inspector-empty-text">${e}</span>
@@ -1266,7 +1276,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1266
1276
  </div>
1267
1277
  <div class="panel-resize-handle" data-panel-resize></div>
1268
1278
  </div>
1269
- `}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,s,o,l,c,d,p,u,g,f;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let m="/dashboard";window.location.pathname!==m&&(window.location.href=m)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(m=>{m.addEventListener("click",()=>{let h=m.dataset.visionTab;this.switchTab(h)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",m=>{let h=m.target.value;this.switchUploadMethod(h)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var m,h;(h=(m=this.root)==null?void 0:m.querySelector("[data-vision-manifest-input]"))==null||h.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var m,h;(h=(m=this.root)==null?void 0:m.querySelector("[data-vision-zip-input]"))==null||h.click()}),(s=this.root.querySelector("[data-vision-zip-input]"))==null||s.addEventListener("change",m=>{this.handleZipUpload(m)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",m=>{this.handleManifestUpload(m)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var m,h;(h=(m=this.root)==null?void 0:m.querySelector("[data-vision-assets-input]"))==null||h.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",m=>{this.handleAssetsUpload(m)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var m,h;(h=(m=this.root)==null?void 0:m.querySelector("[data-vision-flat-input]"))==null||h.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",m=>{this.handleFlatDesignUpload(m)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(f=this.root.querySelector("[data-vision-apply-all]"))==null||f.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",m=>{let h=m.target;if(!h)return;let b=h.closest("[data-mapping-item]"),v=b==null?void 0:b.dataset.mappingItem;v&&(h.closest("[data-mapping-apply-one]")&&this.applyOne(v),h.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(v),h.closest("[data-mapping-edit-one]")&&this.openEditorForOne(v),h.closest("[data-mapping-generate-one]")&&this.generateOne(v),h.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",m=>{let h=m.target;if(!h||!this.mappingResult)return;let b=h.closest("[data-mapping-item]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let y=this.mappingResult.mappings.find(E=>E.game_object===v);y&&(h.matches("[data-mapping-action]")&&(y.action=String(h.value||"KEEP"),y.status="Edited",this.renderMappings()),h.matches("[data-mapping-brand-asset]")&&(y.brand_asset=String(h.value||""),y.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",m=>{let h=m.target;if(!h||!this.mappingResult||!h.matches("[data-mapping-prompt]"))return;let b=h.closest("[data-mapping-item]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let y=this.mappingResult.mappings.find(E=>E.game_object===v);y&&(y.generation_prompt=String(h.value||""),y.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 s,o;let t=await or.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let d=l.toLowerCase();d.endsWith(".json")?i.push({name:l,content:null}):d.startsWith("assets/")&&d.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((s=t.file(l.name))==null?void 0:s.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let a=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),d=new Blob([c],{type:"image/png"}),p=l.name.split("/").pop()||l.name;console.log(`Processing ${p}, uint8array length: ${c.length}, blob size: ${d.size}`);let u;try{u=await this.blobToDataUrl(d)}catch(h){console.warn(`FileReader failed for ${p}, using fallback:`,h),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${p}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(p.replace(".png",""));console.log(`Saving ${p} to category: ${g}`);let m=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:g,filename:p,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${p}:`,m),m.success){console.log(`\u2705 Saved PNG to library: ${p} (${g}) at ${m.path}`);let h=new File([d],p,{type:"image/png"});a.set(p,h)}else console.warn(`\u274C Failed to save ${p}:`,m.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=a;try{this.normalizedManifest=rn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[d,p]of a){let u=await this.fileToDataUrl(p);l.push({id:d.replace(".png",""),filename:d,dataUrl:u,category:this.inferAssetCategory(d.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
1279
+ `}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,s,o,l,c,d,p,u,g,f;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let m="/dashboard";window.location.pathname!==m&&(window.location.href=m)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(m=>{m.addEventListener("click",()=>{let h=m.dataset.visionTab;this.switchTab(h)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",m=>{let h=m.target.value;this.switchUploadMethod(h)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var m,h;(h=(m=this.root)==null?void 0:m.querySelector("[data-vision-manifest-input]"))==null||h.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var m,h;(h=(m=this.root)==null?void 0:m.querySelector("[data-vision-zip-input]"))==null||h.click()}),(s=this.root.querySelector("[data-vision-zip-input]"))==null||s.addEventListener("change",m=>{this.handleZipUpload(m)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",m=>{this.handleManifestUpload(m)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var m,h;(h=(m=this.root)==null?void 0:m.querySelector("[data-vision-assets-input]"))==null||h.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",m=>{this.handleAssetsUpload(m)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var m,h;(h=(m=this.root)==null?void 0:m.querySelector("[data-vision-flat-input]"))==null||h.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",m=>{this.handleFlatDesignUpload(m)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(f=this.root.querySelector("[data-vision-apply-all]"))==null||f.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",m=>{let h=m.target;if(!h)return;let b=h.closest("[data-mapping-item]"),v=b==null?void 0:b.dataset.mappingItem;v&&(h.closest("[data-mapping-apply-one]")&&this.applyOne(v),h.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(v),h.closest("[data-mapping-edit-one]")&&this.openEditorForOne(v),h.closest("[data-mapping-generate-one]")&&this.generateOne(v),h.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",m=>{let h=m.target;if(!h||!this.mappingResult)return;let b=h.closest("[data-mapping-item]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let x=this.mappingResult.mappings.find(S=>S.game_object===v);x&&(h.matches("[data-mapping-action]")&&(x.action=String(h.value||"KEEP"),x.status="Edited",this.renderMappings()),h.matches("[data-mapping-brand-asset]")&&(x.brand_asset=String(h.value||""),x.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",m=>{let h=m.target;if(!h||!this.mappingResult||!h.matches("[data-mapping-prompt]"))return;let b=h.closest("[data-mapping-item]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let x=this.mappingResult.mappings.find(S=>S.game_object===v);x&&(x.generation_prompt=String(h.value||""),x.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 s,o;let t=await or.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let d=l.toLowerCase();d.endsWith(".json")?i.push({name:l,content:null}):d.startsWith("assets/")&&d.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((s=t.file(l.name))==null?void 0:s.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let a=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),d=new Blob([c],{type:"image/png"}),p=l.name.split("/").pop()||l.name;console.log(`Processing ${p}, uint8array length: ${c.length}, blob size: ${d.size}`);let u;try{u=await this.blobToDataUrl(d)}catch(h){console.warn(`FileReader failed for ${p}, using fallback:`,h),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${p}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(p.replace(".png",""));console.log(`Saving ${p} to category: ${g}`);let m=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:g,filename:p,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${p}:`,m),m.success){console.log(`\u2705 Saved PNG to library: ${p} (${g}) at ${m.path}`);let h=new File([d],p,{type:"image/png"});a.set(p,h)}else console.warn(`\u274C Failed to save ${p}:`,m.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=a;try{this.normalizedManifest=rn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[d,p]of a){let u=await this.fileToDataUrl(p);l.push({id:d.replace(".png",""),filename:d,dataUrl:u,category:this.inferAssetCategory(d.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
1270
1280
  \u{1F3F7}\uFE0F Brand: ${((o=this.normalizedManifest)==null?void 0:o.brand_name)||"Imported Brand"}`),this.addAssetsToRegistry(l),this.refreshLibrary()}catch(l){console.error("[BrandVision] Failed to normalize ZIP manifest:",l),this.normalizedManifest=null,this.setStatus("zip","\u274C Failed to normalize manifest")}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}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 s=a.category||"misc";n[s]||(n[s]=[]),i.libraryAssets[s]||(i.libraryAssets[s]=[]),i.libraryAssets[s].some(l=>l.filename===a.filename)||(i.libraryAssets[s].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 ${s}`))}}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 s of Array.from(i))try{let o=await s.text(),l=JSON.parse(o);this.uploadedJsons.set(s.name,l),l.layers?n+=`\u2705 Layers: ${s.name}
1271
1281
  `:l.brand_dna||l.colors?n+=`\u2705 Brand: ${s.name}
1272
1282
  `:n+=`\u2705 Loaded: ${s.name}
@@ -1476,7 +1486,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1476
1486
  </div>
1477
1487
  </div>
1478
1488
  </div>
1479
- `;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 s=n.querySelector("[data-ai-ref-button]");s==null||s.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,y;let b=(y=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?y:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var v,y;let b=(y=(v=this.aiBgToleranceInput)==null?void 0:v.value)!=null?y:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var v,y,E;let b=(E=(y=(v=this.aiReferenceInput)==null?void 0:v.files)==null?void 0:y[0])!=null?E: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()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(m=this.aiCropBtn)==null||m.addEventListener("click",()=>{this.handleAiCrop()}),(h=this.aiDownloadBtn)==null||h.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,f,m,h,b,v,y,E,A,I,R,x,S,_,L,w,T;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=(f=(g=this.aiModelSelect)==null?void 0:g.value)!=null?f:"gemini-2.5-flash-image",i=(b=(h=(m=this.aiPromptInput)==null?void 0:m.value)==null?void 0:h.trim())!=null?b:"",n=(y=(v=this.aiRemoveBgToggle)==null?void 0:v.checked)!=null?y:!1,a=n,s=n,o=Number((A=(E=this.aiStrengthInput)==null?void 0:E.value)!=null?A:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((I=l==null?void 0:l.value)==null?void 0:I.trim())||((R=this.aiBaseValue)==null?void 0:R.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let C=null,M=(x=this.getSelectedAssetKey())!=null?x:"unknown",P=(S=this.aiUseOutputToggle)!=null&&S.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((_=this.aiUseOutputToggle)!=null&&_.checked&&this.aiOutputDataUrl){let B=nn(this.aiOutputDataUrl,"ai-output.png");if(B){let Y=await Re(B);Y&&(C={input:{base64:Y.base64,mimeType:Y.mimeType},dataUrl:Y.dataUrl,width:Y.width,height:Y.height})}}if(C||(C=await this.getImageDataFromAsset(c)),!C){this.setAiStatus("Unable to load the base image.");return}let j=[C.input],k=!1;if(this.aiReferenceFile){let B=await Re(this.aiReferenceFile);B?(j.push({base64:B.base64,mimeType:B.mimeType}),k=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let O=lr(i,{includeReference:k,includeMagenta:a,changeLevel:o}),D=(w=(L=this.aiReferenceFile)==null?void 0:L.name)!=null?w:"none";console.info("[AI] Final prompt:",O),console.info("[AI] Image sources:",{assetKey:M,base:P,reference:D});let F=Za(C.width,C.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await Ze(e,O,j,{aspectRatio:F,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),((T=this.aiStatusEl)==null?void 0:T.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,s,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Je(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||""),s=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&s)console.log("[CustomizePanel] Applying AI output directly to object:",a,s),this.applyObjectPropertyValue(a,s,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,s,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||""),f=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((o=m.dataset.assetKey)!=null?o:"",m)),g&&f){console.log("[CustomizePanel] Applying saved asset to object:",g,f);let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&v){let y=this.getFilenameFromPath(c.path);await b(g,y,n)}else this.applyObjectPropertyValue(g,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let h=window.__highlightLibrarySlot;typeof h=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{h(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 s;let t=(s=this.aiContext)==null?void 0:s.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(s=>s.currentAsset===e||s.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=nn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let s=await tn(a);s&&this.setAiOutput(s)}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 s=await tn(a);if(!s){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:s,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 f=this.inferObjectIdFromAssetKey(i),m=this.inferPathFromAssetKey(i);if(f&&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 y=this.getFilenameFromPath(p.path);await b(f,y,c)}else this.applyObjectPropertyValue(f,m,p.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let h=window.__highlightLibrarySlot;typeof h=="function"&&f&&setTimeout(()=>{h(f,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 s=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,s)}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=`
1489
+ `;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 s=n.querySelector("[data-ai-ref-button]");s==null||s.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,x;let b=(x=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?x:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var v,x;let b=(x=(v=this.aiBgToleranceInput)==null?void 0:v.value)!=null?x:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var v,x,S;let b=(S=(x=(v=this.aiReferenceInput)==null?void 0:v.files)==null?void 0:x[0])!=null?S: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()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(m=this.aiCropBtn)==null||m.addEventListener("click",()=>{this.handleAiCrop()}),(h=this.aiDownloadBtn)==null||h.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,f,m,h,b,v,x,S,A,P,R,k,j,O,T,E,L;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=(f=(g=this.aiModelSelect)==null?void 0:g.value)!=null?f:"gemini-2.5-flash-image",i=(b=(h=(m=this.aiPromptInput)==null?void 0:m.value)==null?void 0:h.trim())!=null?b:"",n=(x=(v=this.aiRemoveBgToggle)==null?void 0:v.checked)!=null?x:!1,a=n,s=n,o=Number((A=(S=this.aiStrengthInput)==null?void 0:S.value)!=null?A:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((P=l==null?void 0:l.value)==null?void 0:P.trim())||((R=this.aiBaseValue)==null?void 0:R.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let y=null,w=(k=this.getSelectedAssetKey())!=null?k:"unknown",C=(j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl){let B=nn(this.aiOutputDataUrl,"ai-output.png");if(B){let Y=await Re(B);Y&&(y={input:{base64:Y.base64,mimeType:Y.mimeType},dataUrl:Y.dataUrl,width:Y.width,height:Y.height})}}if(y||(y=await this.getImageDataFromAsset(c)),!y){this.setAiStatus("Unable to load the base image.");return}let _=[y.input],M=!1;if(this.aiReferenceFile){let B=await Re(this.aiReferenceFile);B?(_.push({base64:B.base64,mimeType:B.mimeType}),M=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let I=lr(i,{includeReference:M,includeMagenta:a,changeLevel:o}),D=(E=(T=this.aiReferenceFile)==null?void 0:T.name)!=null?E:"none";console.info("[AI] Final prompt:",I),console.info("[AI] Image sources:",{assetKey:w,base:C,reference:D});let F=Za(y.width,y.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await Ze(e,I,_,{aspectRatio:F,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,await this.refreshAiOutputFromRaw()}catch(y){console.error("[CustomizePanel] AI Generate Error:",y),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((L=this.aiStatusEl)==null?void 0:L.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,s,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Je(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||""),s=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&s)console.log("[CustomizePanel] Applying AI output directly to object:",a,s),this.applyObjectPropertyValue(a,s,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,s,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||""),f=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((o=m.dataset.assetKey)!=null?o:"",m)),g&&f){console.log("[CustomizePanel] Applying saved asset to object:",g,f);let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&v){let x=this.getFilenameFromPath(c.path);await b(g,x,n)}else this.applyObjectPropertyValue(g,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let h=window.__highlightLibrarySlot;typeof h=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{h(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 s;let t=(s=this.aiContext)==null?void 0:s.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(s=>s.currentAsset===e||s.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=nn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let s=await tn(a);s&&this.setAiOutput(s)}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 s=await tn(a);if(!s){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:s,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 f=this.inferObjectIdFromAssetKey(i),m=this.inferPathFromAssetKey(i);if(f&&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 x=this.getFilenameFromPath(p.path);await b(f,x,c)}else this.applyObjectPropertyValue(f,m,p.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let h=window.__highlightLibrarySlot;typeof h=="function"&&f&&setTimeout(()=>{h(f,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 s=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,s)}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=`
1480
1490
  <div class="asset-preview-card">
1481
1491
  <div class="asset-preview-header">
1482
1492
  <div class="asset-preview-title">${e}</div>
@@ -1522,7 +1532,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1522
1532
  <button class="asset-crop-apply" type="button">Apply Crop</button>
1523
1533
  </div>
1524
1534
  </div>
1525
- `;let v=c.querySelector(".asset-crop-canvas"),y=c.querySelector(".asset-crop-preview"),E=c.querySelector(".asset-crop-zoom"),A=c.querySelector(".asset-crop-zoom-value"),I=c.querySelector(".asset-crop-close"),R=c.querySelector(".asset-crop-cancel"),x=c.querySelector(".asset-crop-apply"),S=c.querySelector(".asset-crop-reset");if(!v||!y||!E||!A){l(null);return}let _=v.getContext("2d"),L=y.getContext("2d");if(!_||!L){l(null);return}let w=s.naturalWidth,T=s.naturalHeight,C=Math.max(v.width/w,v.height/T),M=1,P=0,j=0,k=!1,O=0,D=0,F=0,H=0,B=()=>{let $=C*M,ne=Math.max(0,(w*$-v.width)/2),oe=Math.max(0,(T*$-v.height)/2);P=Math.min(ne,Math.max(-ne,P)),j=Math.min(oe,Math.max(-oe,j))},Y=()=>{let $=C*M;_.clearRect(0,0,v.width,v.height);let ne=v.width/2-w*$/2+P,oe=v.height/2-T*$/2+j;if(_.drawImage(s,ne,oe,w*$,T*$),L.clearRect(0,0,y.width,y.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let U=Math.max(y.width/o.naturalWidth,y.height/o.naturalHeight),Z=y.width/2-o.naturalWidth*U/2,W=y.height/2-o.naturalHeight*U/2;L.drawImage(o,Z,W,o.naturalWidth*U,o.naturalHeight*U)}else L.fillStyle="rgba(255, 255, 255, 0.04)",L.fillRect(0,0,y.width,y.height),L.strokeStyle="rgba(255, 255, 255, 0.08)",L.strokeRect(4,4,y.width-8,y.height-8);let ue=y.width/v.width*(C*M),le=P*(y.width/v.width),fe=j*(y.height/v.height),Se=y.width/2-w*ue/2+le,Ae=y.height/2-T*ue/2+fe;L.save(),L.globalAlpha=.7,L.drawImage(s,Se,Ae,w*ue,T*ue),L.restore()},J=()=>{P=0,j=0,B(),Y()};E.addEventListener("input",()=>{M=Number(E.value),A.textContent=`${M.toFixed(2)}\xD7`,B(),Y()}),v.addEventListener("pointerdown",$=>{k=!0,O=$.clientX,D=$.clientY,F=P,H=j,v.setPointerCapture($.pointerId)}),v.addEventListener("pointermove",$=>{k&&(P=F+($.clientX-O),j=H+($.clientY-D),B(),Y())}),v.addEventListener("pointerup",$=>{k=!1,v.releasePointerCapture($.pointerId)}),v.addEventListener("pointerleave",()=>{k=!1});let te=()=>{c.remove()},se=()=>{te(),l(null)},Ee=async()=>{let $=document.createElement("canvas");$.width=t.width,$.height=t.height;let ne=$.getContext("2d");if(!ne){te(),l(null);return}let oe=M,le=Math.max($.width/w,$.height/T)*oe,fe=$.width/v.width,Se=P*fe,Ae=j*fe,U=$.width/2-w*le/2+Se,Z=$.height/2-T*le/2+Ae;ne.drawImage(s,U,Z,w*le,T*le);let W=await new Promise(ie=>{$.toBlob(Ie=>ie(Ie),e.type||"image/png")});if(te(),!W){l(null);return}l(new File([W],e.name,{type:W.type}))};I==null||I.addEventListener("click",se),R==null||R.addEventListener("click",se),S==null||S.addEventListener("click",J),x==null||x.addEventListener("click",()=>{Ee()}),c.addEventListener("click",$=>{$.target===c&&se()}),document.body.appendChild(c),J()})}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 gi=class{constructor(){this.root=null;this.options=null}render(){return`
1535
+ `;let v=c.querySelector(".asset-crop-canvas"),x=c.querySelector(".asset-crop-preview"),S=c.querySelector(".asset-crop-zoom"),A=c.querySelector(".asset-crop-zoom-value"),P=c.querySelector(".asset-crop-close"),R=c.querySelector(".asset-crop-cancel"),k=c.querySelector(".asset-crop-apply"),j=c.querySelector(".asset-crop-reset");if(!v||!x||!S||!A){l(null);return}let O=v.getContext("2d"),T=x.getContext("2d");if(!O||!T){l(null);return}let E=s.naturalWidth,L=s.naturalHeight,y=Math.max(v.width/E,v.height/L),w=1,C=0,_=0,M=!1,I=0,D=0,F=0,H=0,B=()=>{let $=y*w,ne=Math.max(0,(E*$-v.width)/2),oe=Math.max(0,(L*$-v.height)/2);C=Math.min(ne,Math.max(-ne,C)),_=Math.min(oe,Math.max(-oe,_))},Y=()=>{let $=y*w;O.clearRect(0,0,v.width,v.height);let ne=v.width/2-E*$/2+C,oe=v.height/2-L*$/2+_;if(O.drawImage(s,ne,oe,E*$,L*$),T.clearRect(0,0,x.width,x.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let U=Math.max(x.width/o.naturalWidth,x.height/o.naturalHeight),Z=x.width/2-o.naturalWidth*U/2,W=x.height/2-o.naturalHeight*U/2;T.drawImage(o,Z,W,o.naturalWidth*U,o.naturalHeight*U)}else T.fillStyle="rgba(255, 255, 255, 0.04)",T.fillRect(0,0,x.width,x.height),T.strokeStyle="rgba(255, 255, 255, 0.08)",T.strokeRect(4,4,x.width-8,x.height-8);let ue=x.width/v.width*(y*w),le=C*(x.width/v.width),fe=_*(x.height/v.height),Se=x.width/2-E*ue/2+le,Ae=x.height/2-L*ue/2+fe;T.save(),T.globalAlpha=.7,T.drawImage(s,Se,Ae,E*ue,L*ue),T.restore()},J=()=>{C=0,_=0,B(),Y()};S.addEventListener("input",()=>{w=Number(S.value),A.textContent=`${w.toFixed(2)}\xD7`,B(),Y()}),v.addEventListener("pointerdown",$=>{M=!0,I=$.clientX,D=$.clientY,F=C,H=_,v.setPointerCapture($.pointerId)}),v.addEventListener("pointermove",$=>{M&&(C=F+($.clientX-I),_=H+($.clientY-D),B(),Y())}),v.addEventListener("pointerup",$=>{M=!1,v.releasePointerCapture($.pointerId)}),v.addEventListener("pointerleave",()=>{M=!1});let te=()=>{c.remove()},se=()=>{te(),l(null)},Ee=async()=>{let $=document.createElement("canvas");$.width=t.width,$.height=t.height;let ne=$.getContext("2d");if(!ne){te(),l(null);return}let oe=w,le=Math.max($.width/E,$.height/L)*oe,fe=$.width/v.width,Se=C*fe,Ae=_*fe,U=$.width/2-E*le/2+Se,Z=$.height/2-L*le/2+Ae;ne.drawImage(s,U,Z,E*le,L*le);let W=await new Promise(ie=>{$.toBlob(Ie=>ie(Ie),e.type||"image/png")});if(te(),!W){l(null);return}l(new File([W],e.name,{type:W.type}))};P==null||P.addEventListener("click",se),R==null||R.addEventListener("click",se),j==null||j.addEventListener("click",J),k==null||k.addEventListener("click",()=>{Ee()}),c.addEventListener("click",$=>{$.target===c&&se()}),document.body.appendChild(c),J()})}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 gi=class{constructor(){this.root=null;this.options=null}render(){return`
1526
1536
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
1527
1537
  <div class="scene-panel-header" data-panel-handle>
1528
1538
  <div class="panel-title">
@@ -1588,10 +1598,10 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1588
1598
  </div>
1589
1599
  </div>
1590
1600
  </div>
1591
- `}initialize(e,t){var v,y,E,A,I,R,x,S,_,L,w,T,C,M,P,j;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var O;let k=window.getEditableEngineConfig;if(typeof k=="function"){let D=k();return(O=D==null?void 0:D.loading)!=null?O:{}}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 k,O;(O=(k=this.options)==null?void 0:k.onUpdateLoading)==null||O.call(k,{type:a.value}),this.updateFieldVisibility(a.value)}));let s=(y=this.root)==null?void 0:y.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var k,O;(O=(k=this.options)==null?void 0:k.onUpdateLoading)==null||O.call(k,{background_color:s.value})}));let o=(E=this.root)==null?void 0:E.querySelector("#loading-overlay-alpha"),l=(A=this.root)==null?void 0:A.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((I=n.overlay_alpha)!=null?I:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var O,D;let k=Number(o.value);l&&(l.textContent=k.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{overlay_alpha:k})}));let c=(R=this.root)==null?void 0:R.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var k,O;(O=(k=this.options)==null?void 0:k.onUpdateLoading)==null||O.call(k,{text:c.value})}));let d=(x=this.root)==null?void 0:x.querySelector("#loading-text-scale"),p=(S=this.root)==null?void 0:S.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 O,D;let k=Number(d.value);p&&(p.textContent=k.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{text_scale:k})}));let u=(L=this.root)==null?void 0:L.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var k,O;(O=(k=this.options)==null?void 0:k.onUpdateLoading)==null||O.call(k,{enabled:u.checked})}));let g=(w=this.root)==null?void 0:w.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var k,O;(O=(k=this.options)==null?void 0:k.onUpdateLoading)==null||O.call(k,{blur_enabled:g.checked})}));let f=(T=this.root)==null?void 0:T.querySelector("#loading-blur-strength"),m=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength-value");f&&(f.value=String((M=n.blur_strength)!=null?M:8),m&&(m.textContent=f.value),f.addEventListener("input",()=>{var k,O;m&&(m.textContent=f.value),(O=(k=this.options)==null?void 0:k.onUpdateLoading)==null||O.call(k,{blur_strength:Number(f.value)})}));let h=(P=this.root)==null?void 0:P.querySelector("#loading-show-btn"),b=(j=this.root)==null?void 0:j.querySelector("#loading-hide-btn");h==null||h.addEventListener("click",()=>{var k,O;(O=(k=this.options)==null?void 0:k.onShowLoadingScreen)==null||O.call(k)}),b==null||b.addEventListener("click",()=>{var k,O;(O=(k=this.options)==null?void 0:k.onHideLoadingScreen)==null||O.call(k)}),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{Assets as hi}from"pixi.js";async function dr(r,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 hi.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)ve[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 f=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function pr(r,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,s=typeof a=="function"?a():null,o=(t=s==null?void 0:s.slots)==null?void 0:t.find(h=>h.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 hi.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),f=Object.keys(u||{}).filter(h=>h.startsWith(g)||h.includes(g));for(let h of f)ve[h]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+h),(i=u[h])!=null&&i.texture&&(u[h].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+h+" to default"));let m=window.gameObjectManager;if(m)for(let h of f){let b=m.get(h);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:",h))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function ur(r,e,t,i){var n,a,s,o,l,c,d,p,u,g,f,m,h,b,v;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let y=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",y);let E=Date.now(),A=`/raw/library/${i}/${t}?t=${E}`;console.log("[LIBRARY] Loading texture from:",A);let I=await hi.load(A);if(!I){console.error("[LIBRARY] Failed to load texture:",A);return}console.log("[LIBRARY] \u2705 Texture loaded"),ve[y]=I,console.log("[LIBRARY] \u2705 Updated AssetTextures."+y);let R=window.CustomAssets;R!=null&&R[y]&&(R[y].texture=I,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+y));let x=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!x),x){let _=Array.from(((n=x.keys)==null?void 0:n.call(x))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",_);let L=x.get(y);if(console.log("[LIBRARY] gameObject for "+y+"?",!!L),L){let w=((a=L.getDisplayObject)==null?void 0:a.call(L))||L.pixiObject||L.pixi||L,T=(s=w==null?void 0:w.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",w),console.log("[LIBRARY] displayObject type:",T),console.log("[LIBRARY] has texture?",!!(w!=null&&w.texture)),w!=null&&w.texture)w.texture=I,console.log("[LIBRARY] \u2705 Applied to display object:",y);else if(T==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:C}=await import("pixi.js"),M=w.parent,P=(l=(o=M==null?void 0:M.getChildIndex)==null?void 0:o.call(M,w))!=null?l:0,j={x:w.x,y:w.y},k={x:(d=(c=w.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=w.anchor)==null?void 0:p.y)!=null?u:.5},O={x:(f=(g=w.scale)==null?void 0:g.x)!=null?f:1,y:(h=(m=w.scale)==null?void 0:m.y)!=null?h:1},D=(b=w.alpha)!=null?b:1,F=(v=w.visible)!=null?v:!0,H=new C(I);H.anchor.set(k.x,k.y),H.position.set(j.x,j.y),H.scale.set(O.x,O.y),H.alpha=D,H.visible=F,M&&(M.removeChild(w),M.addChildAt(H,P),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),L.pixiObject&&(L.pixiObject=H),L.pixi&&(L.pixi=H),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(w!=null&&w.children){let C=w.children.find(M=>M.texture);C?(C.texture=I,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let S=`raw/library/${i}/${t}`;gt({objectId:y,path:"render.asset.path",value:S}),console.log("[LIBRARY] \u2705 Staged config override for:",y,"path:",S)}catch(y){console.error("[LIBRARY] Error applying slot asset:",y)}}async function gr(r,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,s=Date.now(),o=`/raw/${t}?t=${s}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await hi.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}ve[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))}}gt({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)}}import{Graphics as vr,Point as Ts}from"pixi.js";import{Point as hr}from"pixi.js";var ze=()=>window.debugConfig||{},mr=()=>window.resolveAnchorVec2||(r=>({x:.5,y:.5})),fr=()=>window.resolveScreenAnchorPoint||(()=>new hr),br=()=>window.resolveScreenRatioPoint||(()=>new hr);function yr(r){mi(r)&&(r.objectDebugRaf||(r.objectDebugRaf=window.requestAnimationFrame(()=>fi(r))))}function xr(r){r.objectDebugRaf&&(window.cancelAnimationFrame(r.objectDebugRaf),r.objectDebugRaf=null),bt(r)}function mi(r){return r.isDebugOpen}function fi(r){var a,s,o;if(!mi(r)){r.objectDebugRaf=null;return}r.objectDebugRaf=window.requestAnimationFrame(()=>fi(r));let e=on(r);if(!e){ft(r,null),bt(r);return}let t=ln(r,e);if(!t){ft(r,null),bt(r);return}let i=new Ts;(a=t.getGlobalPosition)==null||a.call(t,i);let n=cn(r,t);ft(r,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),r.highlightObject?gn(r,t):mn(r),r.highlightAnchor&&n?hn(r,n):fn(r)}function on(r){var n;let e=r.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 ln(r,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 vt(r){let e=r.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function cn(r,e){var s,o;let t=vt(r);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=dn(r);if(!n)return null;if(i.position_ratio!=null)return br()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return fr()(n.width,n.height,a)}function dn(r){var a;let e=(a=r.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 pn(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectBoundsGfx&&r.objectBoundsGfx.parent!==e.stage&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectBoundsGfx||(r.objectBoundsGfx=new vr,r.objectBoundsGfx.zIndex=999999,e.stage.addChild(r.objectBoundsGfx)),r.objectBoundsGfx):null}function un(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectAnchorGfx&&r.objectAnchorGfx.parent!==e.stage&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null),r.objectAnchorGfx||(r.objectAnchorGfx=new vr,r.objectAnchorGfx.zIndex=1e6,e.stage.addChild(r.objectAnchorGfx)),r.objectAnchorGfx):null}function gn(r,e){var n;let t=pn(r);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 hn(r,e){let t=un(r);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 mn(r){r.objectBoundsGfx&&r.objectBoundsGfx.clear()}function fn(r){r.objectAnchorGfx&&r.objectAnchorGfx.clear()}function bt(r){r.objectBoundsGfx&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectAnchorGfx&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null)}function ft(r,e){r.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function wr(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function Er(r,e,t){var s;let i=e.split("."),n=i.pop(),a=r;for(let o of i)a[o]=(s=a[o])!=null?s:{},a=a[o];a[n]=t}function bn(r){var i,n,a,s,o;if(!r)return!1;if((i=r.transform)!=null&&i.offset)return!0;let e=((a=(n=r.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(s=r.identity)==null?void 0:s.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function vi(r){let e=ze();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 Sr(r){window.location.reload()}function yi(r){let e=JSON.stringify(ze(),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 Ar(r,e){var t,i,n;if(!(!r.configViewer||!r.container))try{let a=window.getEditableObjectConfig,s=typeof a=="function"?a(e):null;if(!s){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),bi(r,u),(i=r.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),bi(r,s),(n=r.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function bi(r,e){var p,u,g,f,m,h,b,v,y,E;if(!r.container)return;let t=r.container.querySelector("#config-pos-x"),i=r.container.querySelector("#config-pos-y"),n=r.container.querySelector("#config-scale"),a=r.container.querySelector("#config-anchor-x"),s=r.container.querySelector("#config-anchor-y"),l=bn(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((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((h=(m=e.transform)==null?void 0:m.scale)!=null?h:1));let c=(E=(y=(b=e.transform)==null?void 0:b.anchor)!=null?y:(v=e.render)==null?void 0:v.anchor)!=null?E:{x:.5,y:.5},d=mr()(c);a&&(a.value=String(d.x)),s&&(s.value=String(d.y))}function Cr(r){var l,c,d,p,u,g,f,m,h,b;let e=r.selectedObjectId;if(!e||!r.container)return;let t=(c=(l=r.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=r.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=r.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(m=(f=r.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?m:"0.5",s=(b=(h=r.container.querySelector("#config-anchor-y"))==null?void 0:h.value)!=null?b:"0.5",o=`${e}:
1601
+ `}initialize(e,t){var v,x,S,A,P,R,k,j,O,T,E,L,y,w,C,_;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var I;let M=window.getEditableEngineConfig;if(typeof M=="function"){let D=M();return(I=D==null?void 0:D.loading)!=null?I:{}}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 M,I;(I=(M=this.options)==null?void 0:M.onUpdateLoading)==null||I.call(M,{type:a.value}),this.updateFieldVisibility(a.value)}));let s=(x=this.root)==null?void 0:x.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var M,I;(I=(M=this.options)==null?void 0:M.onUpdateLoading)==null||I.call(M,{background_color:s.value})}));let o=(S=this.root)==null?void 0:S.querySelector("#loading-overlay-alpha"),l=(A=this.root)==null?void 0:A.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((P=n.overlay_alpha)!=null?P:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var I,D;let M=Number(o.value);l&&(l.textContent=M.toFixed(2)),(D=(I=this.options)==null?void 0:I.onUpdateLoading)==null||D.call(I,{overlay_alpha:M})}));let c=(R=this.root)==null?void 0:R.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var M,I;(I=(M=this.options)==null?void 0:M.onUpdateLoading)==null||I.call(M,{text:c.value})}));let d=(k=this.root)==null?void 0:k.querySelector("#loading-text-scale"),p=(j=this.root)==null?void 0:j.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 I,D;let M=Number(d.value);p&&(p.textContent=M.toFixed(2)),(D=(I=this.options)==null?void 0:I.onUpdateLoading)==null||D.call(I,{text_scale:M})}));let u=(T=this.root)==null?void 0:T.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var M,I;(I=(M=this.options)==null?void 0:M.onUpdateLoading)==null||I.call(M,{enabled:u.checked})}));let g=(E=this.root)==null?void 0:E.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var M,I;(I=(M=this.options)==null?void 0:M.onUpdateLoading)==null||I.call(M,{blur_enabled:g.checked})}));let f=(L=this.root)==null?void 0:L.querySelector("#loading-blur-strength"),m=(y=this.root)==null?void 0:y.querySelector("#loading-blur-strength-value");f&&(f.value=String((w=n.blur_strength)!=null?w:8),m&&(m.textContent=f.value),f.addEventListener("input",()=>{var M,I;m&&(m.textContent=f.value),(I=(M=this.options)==null?void 0:M.onUpdateLoading)==null||I.call(M,{blur_strength:Number(f.value)})}));let h=(C=this.root)==null?void 0:C.querySelector("#loading-show-btn"),b=(_=this.root)==null?void 0:_.querySelector("#loading-hide-btn");h==null||h.addEventListener("click",()=>{var M,I;(I=(M=this.options)==null?void 0:M.onShowLoadingScreen)==null||I.call(M)}),b==null||b.addEventListener("click",()=>{var M,I;(I=(M=this.options)==null?void 0:M.onHideLoadingScreen)==null||I.call(M)}),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{Assets as hi}from"pixi.js";async function dr(r,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 hi.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)ve[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 f=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function pr(r,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,s=typeof a=="function"?a():null,o=(t=s==null?void 0:s.slots)==null?void 0:t.find(h=>h.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 hi.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),f=Object.keys(u||{}).filter(h=>h.startsWith(g)||h.includes(g));for(let h of f)ve[h]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+h),(i=u[h])!=null&&i.texture&&(u[h].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+h+" to default"));let m=window.gameObjectManager;if(m)for(let h of f){let b=m.get(h);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:",h))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function ur(r,e,t,i){var n,a,s,o,l,c,d,p,u,g,f,m,h,b,v;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let x=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",x);let S=Date.now(),A=`/raw/library/${i}/${t}?t=${S}`;console.log("[LIBRARY] Loading texture from:",A);let P=await hi.load(A);if(!P){console.error("[LIBRARY] Failed to load texture:",A);return}console.log("[LIBRARY] \u2705 Texture loaded"),ve[x]=P,console.log("[LIBRARY] \u2705 Updated AssetTextures."+x);let R=window.CustomAssets;R!=null&&R[x]&&(R[x].texture=P,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+x));let k=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!k),k){let O=Array.from(((n=k.keys)==null?void 0:n.call(k))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",O);let T=k.get(x);if(console.log("[LIBRARY] gameObject for "+x+"?",!!T),T){let E=((a=T.getDisplayObject)==null?void 0:a.call(T))||T.pixiObject||T.pixi||T,L=(s=E==null?void 0:E.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",E),console.log("[LIBRARY] displayObject type:",L),console.log("[LIBRARY] has texture?",!!(E!=null&&E.texture)),E!=null&&E.texture)E.texture=P,console.log("[LIBRARY] \u2705 Applied to display object:",x);else if(L==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:y}=await import("pixi.js"),w=E.parent,C=(l=(o=w==null?void 0:w.getChildIndex)==null?void 0:o.call(w,E))!=null?l:0,_={x:E.x,y:E.y},M={x:(d=(c=E.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=E.anchor)==null?void 0:p.y)!=null?u:.5},I={x:(f=(g=E.scale)==null?void 0:g.x)!=null?f:1,y:(h=(m=E.scale)==null?void 0:m.y)!=null?h:1},D=(b=E.alpha)!=null?b:1,F=(v=E.visible)!=null?v:!0,H=new y(P);H.anchor.set(M.x,M.y),H.position.set(_.x,_.y),H.scale.set(I.x,I.y),H.alpha=D,H.visible=F,w&&(w.removeChild(E),w.addChildAt(H,C),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(E!=null&&E.children){let y=E.children.find(w=>w.texture);y?(y.texture=P,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let j=`raw/library/${i}/${t}`;gt({objectId:x,path:"render.asset.path",value:j}),console.log("[LIBRARY] \u2705 Staged config override for:",x,"path:",j)}catch(x){console.error("[LIBRARY] Error applying slot asset:",x)}}async function gr(r,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,s=Date.now(),o=`/raw/${t}?t=${s}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await hi.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}ve[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))}}gt({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)}}import{Graphics as vr,Point as Ts}from"pixi.js";import{Point as hr}from"pixi.js";var ze=()=>window.debugConfig||{},mr=()=>window.resolveAnchorVec2||(r=>({x:.5,y:.5})),fr=()=>window.resolveScreenAnchorPoint||(()=>new hr),br=()=>window.resolveScreenRatioPoint||(()=>new hr);function yr(r){mi(r)&&(r.objectDebugRaf||(r.objectDebugRaf=window.requestAnimationFrame(()=>fi(r))))}function xr(r){r.objectDebugRaf&&(window.cancelAnimationFrame(r.objectDebugRaf),r.objectDebugRaf=null),bt(r)}function mi(r){return r.isDebugOpen}function fi(r){var a,s,o;if(!mi(r)){r.objectDebugRaf=null;return}r.objectDebugRaf=window.requestAnimationFrame(()=>fi(r));let e=on(r);if(!e){ft(r,null),bt(r);return}let t=ln(r,e);if(!t){ft(r,null),bt(r);return}let i=new Ts;(a=t.getGlobalPosition)==null||a.call(t,i);let n=cn(r,t);ft(r,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),r.highlightObject?gn(r,t):mn(r),r.highlightAnchor&&n?hn(r,n):fn(r)}function on(r){var n;let e=r.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 ln(r,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 vt(r){let e=r.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function cn(r,e){var s,o;let t=vt(r);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=dn(r);if(!n)return null;if(i.position_ratio!=null)return br()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return fr()(n.width,n.height,a)}function dn(r){var a;let e=(a=r.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 pn(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectBoundsGfx&&r.objectBoundsGfx.parent!==e.stage&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectBoundsGfx||(r.objectBoundsGfx=new vr,r.objectBoundsGfx.zIndex=999999,e.stage.addChild(r.objectBoundsGfx)),r.objectBoundsGfx):null}function un(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectAnchorGfx&&r.objectAnchorGfx.parent!==e.stage&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null),r.objectAnchorGfx||(r.objectAnchorGfx=new vr,r.objectAnchorGfx.zIndex=1e6,e.stage.addChild(r.objectAnchorGfx)),r.objectAnchorGfx):null}function gn(r,e){var n;let t=pn(r);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 hn(r,e){let t=un(r);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 mn(r){r.objectBoundsGfx&&r.objectBoundsGfx.clear()}function fn(r){r.objectAnchorGfx&&r.objectAnchorGfx.clear()}function bt(r){r.objectBoundsGfx&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectAnchorGfx&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null)}function ft(r,e){r.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function wr(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function Er(r,e,t){var s;let i=e.split("."),n=i.pop(),a=r;for(let o of i)a[o]=(s=a[o])!=null?s:{},a=a[o];a[n]=t}function bn(r){var i,n,a,s,o;if(!r)return!1;if((i=r.transform)!=null&&i.offset)return!0;let e=((a=(n=r.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(s=r.identity)==null?void 0:s.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function vi(r){let e=ze();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 Sr(r){window.location.reload()}function yi(r){let e=JSON.stringify(ze(),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 Ar(r,e){var t,i,n;if(!(!r.configViewer||!r.container))try{let a=window.getEditableObjectConfig,s=typeof a=="function"?a(e):null;if(!s){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),bi(r,u),(i=r.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),bi(r,s),(n=r.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function bi(r,e){var p,u,g,f,m,h,b,v,x,S;if(!r.container)return;let t=r.container.querySelector("#config-pos-x"),i=r.container.querySelector("#config-pos-y"),n=r.container.querySelector("#config-scale"),a=r.container.querySelector("#config-anchor-x"),s=r.container.querySelector("#config-anchor-y"),l=bn(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((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((h=(m=e.transform)==null?void 0:m.scale)!=null?h:1));let c=(S=(x=(b=e.transform)==null?void 0:b.anchor)!=null?x:(v=e.render)==null?void 0:v.anchor)!=null?S:{x:.5,y:.5},d=mr()(c);a&&(a.value=String(d.x)),s&&(s.value=String(d.y))}function Cr(r){var l,c,d,p,u,g,f,m,h,b;let e=r.selectedObjectId;if(!e||!r.container)return;let t=(c=(l=r.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=r.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=r.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(m=(f=r.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?m:"0.5",s=(b=(h=r.container.querySelector("#config-anchor-y"))==null?void 0:h.value)!=null?b:"0.5",o=`${e}:
1592
1602
  position: (${t}, ${i})
1593
1603
  scale: ${n}
1594
- anchor: (${a}, ${s})`;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 vn(r,e){var p,u,g,f,m,h,b,v,y,E,A;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!r.container)return;let t=r.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=r.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((f=(g=r.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),a=Number((h=(m=r.container.querySelector("#config-scale"))==null?void 0:m.value)!=null?h:1),s=Number((v=(b=r.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?v:.5),o=Number((E=(y=r.container.querySelector("#config-anchor-y"))==null?void 0:y.value)!=null?E:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:s,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:s,y:o}},{silent:e==null?void 0:e.silent});let c=vt(r);bn(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 I=(A=window.getEditableObjectConfig)==null?void 0:A.call(window,t);I?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,I)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Tr(r,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("."),f=c;for(let m=0;m<g.length-1;m++){let h=g[m];f[h]=(u=f[h])!=null?u:{},f=f[h]}f[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)),s=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function Lr(r){r.selectedObjectId&&(r.objectAutoApplyTimer&&window.clearTimeout(r.objectAutoApplyTimer),r.objectAutoApplyTimer=window.setTimeout(()=>{r.objectAutoApplyTimer=null,vn(r,{silent:!0})},150))}var Ls=3e3;function yt(r,e,t){let i=t!=null?t:r.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,s=0,o=0,l=0,c=0,d=0,p=g=>{if(!n)return;let f=i.getBoundingClientRect();r.style.left=`${g.clientX-f.left-c}px`,r.style.top=`${g.clientY-f.top-d}px`},u=()=>{n&&(n=!1,r.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let f=g.target;if(f!=null&&f.closest("button, input, select, textarea"))return;g.preventDefault();let m=r.getBoundingClientRect(),h=i.getBoundingClientRect();console.log("[DRAG] Panel:",r.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:h.left,top:h.top,width:h.width,height:h.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-h.left,v=m.top-h.top;console.log("[DRAG] targetPosition:",{left:b,top:v}),r.style.left=`${b}px`,r.style.top=`${v}px`,r.style.right="auto",r.style.bottom="auto",r.style.zIndex=String(++Ls),n=!0,r.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function kr(r,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,s=0,o=0,l=0,c=!1,d=u=>{var v;if(!c)return;let g=u.clientX-o,f=u.clientY-l,m=Math.max(i,a+g),h=Math.max(n,s+f);r.style.width=`${m}px`,(v=r.closest(".preview-shell"))!=null&&v.classList.contains("layout-fixed")||(r.style.height=`${h}px`),t==null||t(m,h)},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=r.getBoundingClientRect();a=g.width,s=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function yn(r,e){var m,h,b,v;let t=(b=(h=(m=r.container)==null?void 0:m.querySelector("#debug-overlay"))!=null?h:r.debugOverlay)!=null?b:e.offsetParent;if(!t||(v=r.container)!=null&&v.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,s=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>s&&(e.style.width=`${s}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),f=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function Qe(r){var i,n;if(!r.container)return;let e=r.container.querySelector("#debug-workbench");if(!e)return;if(yn(r,e),(i=r.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),s={activeTab:r.activeTab};if(a)try{s={...JSON.parse(a),activeTab:r.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(s));return}let t={activeTab:r.activeTab,width:e.style.width,height:(n=r.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 xi(r){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(r.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=r.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let s=(a=r.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!s?i.style.height=t.height:s&&(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"),yn(r,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function xn(r,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",yn(r,e),Qe(r))}function Mr(r){var n,a,s;if(!r.container)return;let e=r.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=r.toggleDebug)==null||o.call(r)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=r.toggleDebug)==null?void 0:o.call(r,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>vi(r)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>yi(r)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;r.activeTab=l,wn(r),Qe(r)})}),Sn(r,e),En(r,e)}function wn(r){if(!r.container)return;let e=r.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===r.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===r.activeTab)})}function En(r,e){he(r,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),he(r,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),he(r,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),he(r,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),he(r,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),he(r,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),he(r,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),he(r,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),he(r,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=ze();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),s=ze();s.layout&&(s.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Pr(r){if(!r.container||!r.debugOverlay)return;let e=r.container.querySelector("#debug-workbench"),t=r.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"),yt(e,t,r.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Qe(r),xn(r,e)},10)}));let i=r.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"),yt(i,n,r.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{xn(r,i)},10)})),i&&a&&kr(i,a);let s=r.container.querySelector('[data-panel="scene-tools-corner"]'),o=s==null?void 0:s.querySelector("[data-panel-handle]");s&&o&&yt(s,o,r.debugOverlay);let l=r.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&yt(l,c,r.debugOverlay),xi(r)}function Sn(r,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 he(r,e,t,i,n){let a=e.querySelector(`#${t}`),s=e.querySelector(n);if(!a||!s)return;let o=wr(ze(),i);typeof o=="number"&&(a.value=String(o),s.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);s.textContent=String(l),Er(ze(),i,l)})}var wi=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}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=Ve(),{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 s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1604
+ anchor: (${a}, ${s})`;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 vn(r,e){var p,u,g,f,m,h,b,v,x,S,A;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!r.container)return;let t=r.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=r.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((f=(g=r.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),a=Number((h=(m=r.container.querySelector("#config-scale"))==null?void 0:m.value)!=null?h:1),s=Number((v=(b=r.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?v:.5),o=Number((S=(x=r.container.querySelector("#config-anchor-y"))==null?void 0:x.value)!=null?S:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:s,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:s,y:o}},{silent:e==null?void 0:e.silent});let c=vt(r);bn(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 P=(A=window.getEditableObjectConfig)==null?void 0:A.call(window,t);P?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,P)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Tr(r,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("."),f=c;for(let m=0;m<g.length-1;m++){let h=g[m];f[h]=(u=f[h])!=null?u:{},f=f[h]}f[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)),s=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function Lr(r){r.selectedObjectId&&(r.objectAutoApplyTimer&&window.clearTimeout(r.objectAutoApplyTimer),r.objectAutoApplyTimer=window.setTimeout(()=>{r.objectAutoApplyTimer=null,vn(r,{silent:!0})},150))}var Ls=3e3;function yt(r,e,t){let i=t!=null?t:r.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,s=0,o=0,l=0,c=0,d=0,p=g=>{if(!n)return;let f=i.getBoundingClientRect();r.style.left=`${g.clientX-f.left-c}px`,r.style.top=`${g.clientY-f.top-d}px`},u=()=>{n&&(n=!1,r.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let f=g.target;if(f!=null&&f.closest("button, input, select, textarea"))return;g.preventDefault();let m=r.getBoundingClientRect(),h=i.getBoundingClientRect();console.log("[DRAG] Panel:",r.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:h.left,top:h.top,width:h.width,height:h.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-h.left,v=m.top-h.top;console.log("[DRAG] targetPosition:",{left:b,top:v}),r.style.left=`${b}px`,r.style.top=`${v}px`,r.style.right="auto",r.style.bottom="auto",r.style.zIndex=String(++Ls),n=!0,r.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function kr(r,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,s=0,o=0,l=0,c=!1,d=u=>{var v;if(!c)return;let g=u.clientX-o,f=u.clientY-l,m=Math.max(i,a+g),h=Math.max(n,s+f);r.style.width=`${m}px`,(v=r.closest(".preview-shell"))!=null&&v.classList.contains("layout-fixed")||(r.style.height=`${h}px`),t==null||t(m,h)},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=r.getBoundingClientRect();a=g.width,s=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function yn(r,e){var m,h,b,v;let t=(b=(h=(m=r.container)==null?void 0:m.querySelector("#debug-overlay"))!=null?h:r.debugOverlay)!=null?b:e.offsetParent;if(!t||(v=r.container)!=null&&v.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,s=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>s&&(e.style.width=`${s}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),f=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function Qe(r){var i,n;if(!r.container)return;let e=r.container.querySelector("#debug-workbench");if(!e)return;if(yn(r,e),(i=r.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),s={activeTab:r.activeTab};if(a)try{s={...JSON.parse(a),activeTab:r.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(s));return}let t={activeTab:r.activeTab,width:e.style.width,height:(n=r.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 xi(r){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(r.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=r.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let s=(a=r.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!s?i.style.height=t.height:s&&(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"),yn(r,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function xn(r,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",yn(r,e),Qe(r))}function Mr(r){var n,a,s;if(!r.container)return;let e=r.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=r.toggleDebug)==null||o.call(r)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=r.toggleDebug)==null?void 0:o.call(r,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>vi(r)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>yi(r)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;r.activeTab=l,wn(r),Qe(r)})}),Sn(r,e),En(r,e)}function wn(r){if(!r.container)return;let e=r.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===r.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===r.activeTab)})}function En(r,e){he(r,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),he(r,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),he(r,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),he(r,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),he(r,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),he(r,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),he(r,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),he(r,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),he(r,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=ze();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),s=ze();s.layout&&(s.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Pr(r){if(!r.container||!r.debugOverlay)return;let e=r.container.querySelector("#debug-workbench"),t=r.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"),yt(e,t,r.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Qe(r),xn(r,e)},10)}));let i=r.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"),yt(i,n,r.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{xn(r,i)},10)})),i&&a&&kr(i,a);let s=r.container.querySelector('[data-panel="scene-tools-corner"]'),o=s==null?void 0:s.querySelector("[data-panel-handle]");s&&o&&yt(s,o,r.debugOverlay);let l=r.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&yt(l,c,r.debugOverlay),xi(r)}function Sn(r,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 he(r,e,t,i,n){let a=e.querySelector(`#${t}`),s=e.querySelector(n);if(!a||!s)return;let o=wr(ze(),i);typeof o=="number"&&(a.value=String(o),s.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);s.textContent=String(l),Er(ze(),i,l)})}var wi=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}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=Ve(),{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 s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1595
1605
  <div class="config-persistence-panel">
1596
1606
  <!-- Status Footer (Always Visible) -->
1597
1607
  <div class="persistence-status-footer">
@@ -1753,7 +1763,7 @@ This will:
1753
1763
 
1754
1764
  This will write all staged changes to ${p}.
1755
1765
 
1756
- After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let g=$t(),f={};for(let[b,v]of Object.entries(g.objects)){let y=v,E=b;/^(json\.|ui\.|effects\.|engine\.)/.test(E)||(E=`json.${b}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=E),f[`objects/${E}.json`]=y}g.engine&&(g.engine.runtime&&(f["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(f["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(f["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(f["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(f["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(f["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(f["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(f["engine/engine.json"]=g.engine));for(let[b,v]of Object.entries(g.scenes)){let y=b.startsWith("scene.")?b:`scene.${b}`;f[`scenes/${y}.json`]=v}let m=this.currentVersion?"/api/apply-current":"/api/apply-direct",h=await fetch(m,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:f,assets:{},hadCacheAtApply:!0})});if(!h.ok){let b=await h.json();throw new Error(b.error||"Apply to current source failed")}Be(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Apply current failed:",g),alert(`\u274C Apply to current source failed: ${g.message}`),t.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1766
+ After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let g=$t(),f={};for(let[b,v]of Object.entries(g.objects)){let x=v,S=b;/^(json\.|ui\.|effects\.|engine\.)/.test(S)||(S=`json.${b}`),x&&typeof x=="object"&&(x.identity||(x.identity={}),x.identity.id=S),f[`objects/${S}.json`]=x}g.engine&&(g.engine.runtime&&(f["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(f["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(f["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(f["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(f["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(f["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(f["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(f["engine/engine.json"]=g.engine));for(let[b,v]of Object.entries(g.scenes)){let x=b.startsWith("scene.")?b:`scene.${b}`;f[`scenes/${x}.json`]=v}let m=this.currentVersion?"/api/apply-current":"/api/apply-direct",h=await fetch(m,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:f,assets:{},hadCacheAtApply:!0})});if(!h.ok){let b=await h.json();throw new Error(b.error||"Apply to current source failed")}Be(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Apply current failed:",g),alert(`\u274C Apply to current source failed: ${g.message}`),t.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1757
1767
 
1758
1768
  This will DIRECTLY MODIFY base configuration files.
1759
1769
 
@@ -1781,7 +1791,7 @@ This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snaps
1781
1791
 
1782
1792
  This cannot be undone unless you have git commits or backups.
1783
1793
 
1784
- Are you absolutely sure?`))try{let t=$t(),i={};for(let[a,s]of Object.entries(t.objects)){let o=s,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,s]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=s}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")}Be(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Ei=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 Vt;this.sceneToolsPanel=new Yt;this.nudgePanel=new Wt;this.inspectorPanel=new li;this.libraryPanel=new mt;this.libraryPanelDocked=new mt;this.brandVisionPanel=new pi;this.customizeSettingsPanel=new ui;this.configPersistencePanel=new wi;this.loadingScreenPanel=new gi}applyAssetChange(e,t){return dr(this,e,t)}resetAsset(e){return pr(this,e)}applySlotAsset(e,t,i){return ur(this,e,t,i)}resetSlotAsset(e,t,i){return gr(this,e,t,i)}startObjectVisuals(){return yr(this)}stopObjectVisuals(){return xr(this)}shouldRunObjectVisuals(){return mi(this)}updateObjectVisuals(){return fi(this)}getSelectedInstanceId(){return on(this)}getDisplayObjectById(e){return ln(this,e)}getSelectedObjectConfig(){return vt(this)}getConfigAnchorWorldPoint(e){return cn(this,e)}getScreenSize(){return dn(this)}ensureBoundsGfx(){return pn(this)}ensureAnchorGfx(){return un(this)}drawBounds(e){return gn(this,e)}drawAnchor(e){return hn(this,e)}clearBounds(){return mn(this)}clearAnchor(){return fn(this)}clearObjectVisuals(){return bt(this)}updateObjectInfo(e){return ft(this,e)}resetDebugConfig(){return vi(this)}applyDebugConfig(){return Sr(this)}exportDebugConfig(){return yi(this)}loadObjectConfig(e){return Ar(this,e)}fillConfigViewer(e){return bi(this,e)}copyConfigValues(){return Cr(this)}applyObjectConfig(e){return vn(this,e)}applyCustomizeSettings(e,t){return Tr(this,e,t)}scheduleObjectAutoApply(){return Lr(this)}setupDebugEventListeners(){return Mr(this)}setupDebugInputListeners(e){return En(this,e)}setupPanelLayout(){return Pr(this)}setupCollapsiblePanels(e){return Sn(this,e)}setupRangeInput(e,t,i,n){return he(this,e,t,i,n)}updateWorkbenchTabs(){return wn(this)}saveWorkbenchState(){return Qe(this)}loadWorkbenchState(){return xi(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 s=JSON.parse(a);s.activeTab&&(this.activeTab=s.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,s,o)=>this.applySlotAsset(a,s,o),onReset:(a,s,o)=>this.resetSlotAsset(a,s,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,s,o)=>this.applySlotAsset(a,s,o),onReset:(a,s,o)=>this.resetSlotAsset(a,s,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,s,o)=>{console.log("[Inspector] Property changed:",a,s,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,s)=>this.applyCustomizeSettings(a,s)}),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,s)=>this.nudgeSelectedObject(a,s),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,s)=>{var g,f,m,h,b,v;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((f=l==null?void 0:l.x)!=null?f:0)+a,d=((m=l==null?void 0:l.y)!=null?m:0)+s,{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 y=window.__editableConfig,E=(v=(b=(h=y==null?void 0:y.objects)==null?void 0:h.get)==null?void 0:b.call(h,this.selectedObjectId))!=null?v:o;await u(this.selectedObjectId,E)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var p,u,g,f,m;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let o=(u=(p=s.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 h=window.__editableConfig,b=(m=(f=(g=h==null?void 0:h.objects)==null?void 0:g.get)==null?void 0:f.call(g,this.selectedObjectId))!=null?m:s;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 s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({loading:a}),typeof s.__previewUpdateLoading=="function"?s.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,s,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,s,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 s,o;((s=a.detail)==null?void 0:s.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,s,o)=>this.applySlotAsset(a,s,o),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var s;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((s=o==null?void 0:o.engine)==null?void 0:s.splash)||null}return null},window.addAssetToRegistry=(a,s)=>{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===s))){let d=s.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:s,displayName:d}),console.log(`[DEBUG] Added ${s} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,s)=>{this.libraryPanel.highlightSlot(a,s)}}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`
1794
+ Are you absolutely sure?`))try{let t=$t(),i={};for(let[a,s]of Object.entries(t.objects)){let o=s,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,s]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=s}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")}Be(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Ei=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 Vt;this.sceneToolsPanel=new Yt;this.nudgePanel=new Wt;this.inspectorPanel=new li;this.libraryPanel=new mt;this.libraryPanelDocked=new mt;this.brandVisionPanel=new pi;this.customizeSettingsPanel=new ui;this.configPersistencePanel=new wi;this.loadingScreenPanel=new gi}applyAssetChange(e,t){return dr(this,e,t)}resetAsset(e){return pr(this,e)}applySlotAsset(e,t,i){return ur(this,e,t,i)}resetSlotAsset(e,t,i){return gr(this,e,t,i)}startObjectVisuals(){return yr(this)}stopObjectVisuals(){return xr(this)}shouldRunObjectVisuals(){return mi(this)}updateObjectVisuals(){return fi(this)}getSelectedInstanceId(){return on(this)}getDisplayObjectById(e){return ln(this,e)}getSelectedObjectConfig(){return vt(this)}getConfigAnchorWorldPoint(e){return cn(this,e)}getScreenSize(){return dn(this)}ensureBoundsGfx(){return pn(this)}ensureAnchorGfx(){return un(this)}drawBounds(e){return gn(this,e)}drawAnchor(e){return hn(this,e)}clearBounds(){return mn(this)}clearAnchor(){return fn(this)}clearObjectVisuals(){return bt(this)}updateObjectInfo(e){return ft(this,e)}resetDebugConfig(){return vi(this)}applyDebugConfig(){return Sr(this)}exportDebugConfig(){return yi(this)}loadObjectConfig(e){return Ar(this,e)}fillConfigViewer(e){return bi(this,e)}copyConfigValues(){return Cr(this)}applyObjectConfig(e){return vn(this,e)}applyCustomizeSettings(e,t){return Tr(this,e,t)}scheduleObjectAutoApply(){return Lr(this)}setupDebugEventListeners(){return Mr(this)}setupDebugInputListeners(e){return En(this,e)}setupPanelLayout(){return Pr(this)}setupCollapsiblePanels(e){return Sn(this,e)}setupRangeInput(e,t,i,n){return he(this,e,t,i,n)}updateWorkbenchTabs(){return wn(this)}saveWorkbenchState(){return Qe(this)}loadWorkbenchState(){return xi(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 s=JSON.parse(a);s.activeTab&&(this.activeTab=s.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,s,o)=>this.applySlotAsset(a,s,o),onReset:(a,s,o)=>this.resetSlotAsset(a,s,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,s,o)=>this.applySlotAsset(a,s,o),onReset:(a,s,o)=>this.resetSlotAsset(a,s,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,s,o)=>{console.log("[Inspector] Property changed:",a,s,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,s)=>this.applyCustomizeSettings(a,s)}),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,s)=>this.nudgeSelectedObject(a,s),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,s)=>{var g,f,m,h,b,v;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((f=l==null?void 0:l.x)!=null?f:0)+a,d=((m=l==null?void 0:l.y)!=null?m:0)+s,{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 x=window.__editableConfig,S=(v=(b=(h=x==null?void 0:x.objects)==null?void 0:h.get)==null?void 0:b.call(h,this.selectedObjectId))!=null?v:o;await u(this.selectedObjectId,S)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var p,u,g,f,m;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let o=(u=(p=s.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 h=window.__editableConfig,b=(m=(f=(g=h==null?void 0:h.objects)==null?void 0:g.get)==null?void 0:f.call(g,this.selectedObjectId))!=null?m:s;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 s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({loading:a}),typeof s.__previewUpdateLoading=="function"?s.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,s,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,s,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 s,o;((s=a.detail)==null?void 0:s.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,s,o)=>this.applySlotAsset(a,s,o),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var s;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((s=o==null?void 0:o.engine)==null?void 0:s.splash)||null}return null},window.addAssetToRegistry=(a,s)=>{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===s))){let d=s.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:s,displayName:d}),console.log(`[DEBUG] Added ${s} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,s)=>{this.libraryPanel.highlightSlot(a,s)}}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`
1785
1795
  <div class="debug-overlay hidden" id="debug-overlay">
1786
1796
  <div class="debug-workbench" id="debug-workbench">
1787
1797
  <div class="workbench-header" id="workbench-handle">
@@ -1828,7 +1838,7 @@ Are you absolutely sure?`))try{let t=$t(),i={};for(let[a,s]of Object.entries(t.o
1828
1838
  ${this.sceneToolsPanel.render()}
1829
1839
  ${this.nudgePanel.render()}
1830
1840
  </div>
1831
- `}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()}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),f=Number((l=u.value)!=null?l:0),m=g+e*n,h=f+t*n;p.value=String(m),u.value=String(h),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let s=new je;for(let p of i){let u=a(p);if(!u)continue;let g=((d=u.transform)==null?void 0:d.position)||[0,0],f=Array.isArray(g)?g[0]:g.x||0,m=Array.isArray(g)?g[1]:g.y||0,h=f+e*n,b=m+t*n;await s.updateProperty(p,"transform.position",[h,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function ks(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function Ms(r){var n;let[e,t]=r.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 Ps(r){return`
1841
+ `}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()}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),f=Number((l=u.value)!=null?l:0),m=g+e*n,h=f+t*n;p.value=String(m),u.value=String(h),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let s=new _e;for(let p of i){let u=a(p);if(!u)continue;let g=((d=u.transform)==null?void 0:d.position)||[0,0],f=Array.isArray(g)?g[0]:g.x||0,m=Array.isArray(g)?g[1]:g.y||0,h=f+e*n,b=m+t*n;await s.updateProperty(p,"transform.position",[h,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function ks(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function Ms(r){var n;let[e,t]=r.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 Ps(r){return`
1832
1842
  Analyze these screenshots of a brand or game and extract its "Brand DNA".
1833
1843
 
1834
1844
  Provide a concise summary (2-3 sentences) covering:
@@ -2181,7 +2191,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2181
2191
  </div>
2182
2192
 
2183
2193
  </div>
2184
- `,this.setupEventListeners(e),e}setupEventListeners(e){var g,f,m,h,b,v,y,E;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",A=>{if(this.viewMode==="compare")return;let I=A.target.value;this.setDevice(I)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",A=>{let I=A.target.value;this.setTheme(I)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(A=>{A.addEventListener("click",()=>{let I=A.dataset.viewToggle;I&&this.setViewMode(I)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(A=>{A.addEventListener("click",()=>{let I=A.dataset.layoutToggle;I&&this.setLayoutMode(I)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(m=e.querySelector("#zoom-out-btn"))==null||m.addEventListener("click",()=>this.adjustUserZoom(-.1)),(h=e.querySelector("#refresh-btn"))==null||h.addEventListener("click",()=>this.refresh());let s=e.querySelector("#bottom-dock"),o=e.querySelector("#bottom-dock-resize");s&&o&&this.makeBottomDockResizable(s,o);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(A=>{A.addEventListener("click",()=>{let I=A.dataset.dockTab;if(!I)return;l.forEach(x=>x.classList.remove("active")),A.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(x=>{let S=x.dataset.dockPanel;x.classList.toggle("active",S===I)})})}),(b=e.querySelector("#console-clear"))==null||b.addEventListener("click",()=>this.clearConsole()),(v=e.querySelector("#corner-zoom-in-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(.1)),(y=e.querySelector("#corner-zoom-out-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(-.1)),(E=e.querySelector("#corner-grab-btn"))==null||E.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),d=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&d&&this.makeSidebarResizable(c,d,"left");let p=e.querySelector(".debug-workbench"),u=p==null?void 0:p.querySelector("#workbench-resize-v");p&&u&&this.makeSidebarResizable(p,u,"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 s=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(s,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.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(),pa();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),ua();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=Ve().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(s=>typeof s=="object"?this.safeStringify(s):String(s)).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 s=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=s>0?`${s}!`:"0",a.classList.toggle("has-errors",s>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]"),s=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||!s||!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:s,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");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,s;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}),(s=(a=this.options).onDeviceChange)==null||s.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,s=n/e.preset.height,o=Math.max(.01,Math.min(a,s));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,s=t.canvas.height,o=Math.min(a/i.width,s/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,p=(s-c)/2;n.clearRect(0,0,a,s),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")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.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 _r(r={}){let e=new Pn(r);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as _s,Container as Or}from"pixi.js";var Os=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",In=Os;if(typeof window!="undefined")try{let r=new XMLHttpRequest;if(r.open("GET","./build-settings.json",!1),r.send(),r.status===200&&r.responseText){let e=JSON.parse(r.responseText);e!=null&&e.buildMode&&(In=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${In}`))}}catch{}function js(r){var t,i,n,a,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(r);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(r))return{x:(t=r[0])!=null?t:.5,y:(i=r[1])!=null?i:.5};if(r&&typeof r=="object"&&"x"in r&&"y"in r)return{x:(n=r.x)!=null?n:.5,y:(a=r.y)!=null?a:.5};if(typeof r=="string"){let o=r.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var De=class{static async create(e,t,i){var l,c,d,p,u,g,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${In}`);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 Or;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 s=await Fi.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=s==null?void 0:s.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new _s(s),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=s==null?void 0:s.constructor)==null?void 0:u.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof Or)){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}`],h=!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:",(f=o==null?void 0:o.constructor)==null?void 0:f.name),h=!0;break}}catch{continue}h||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=s)}else o=s;else o=s,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,s,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((s=t.position.x)!=null?s: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=js(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};function _n(r){try{if(r&&typeof r.keys=="function")return Array.from(r.keys())}catch{}return[]}function jr(r){var e;return r?((e=r.getDisplayObject)==null?void 0:e.call(r))||r.pixiObject||r:null}function Rs(r,e){if(!r||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);r.eventMode=i?"static":"none",r.interactive=i,i&&(r.cursor=t.draggable?"move":"pointer")}function Rr(r,e){var l,c,d;if(!r||!e)return;let t=e.transform||{};Rs(r,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),s=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=r.position)!=null&&l.set?r.position.set(a,s):(typeof r.x=="number"&&(r.x=a),typeof r.y=="number"&&(r.y=s)),typeof t.scale=="number"&&((c=r.scale)!=null&&c.set?r.scale.set(t.scale):r.scale&&(r.scale.x=t.scale,r.scale.y=t.scale));let o=t.anchor;if(o&&((d=r.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"&&r.anchor.set(p.x,p.y)}}function zr(r){if(typeof window=="undefined")return;let e=r==null?void 0:r.objects,t=_n(e),i=a=>{try{let s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===s):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>zr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(_n((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return _n((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var d,p,u,g,f;let s=(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 s;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[a];return c&&c===o?s: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 s={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return a}}function zs(){if(typeof window=="undefined")return;let r=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,s,o;let n=r(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 f=window.gameObjectManager,m=(s=f==null?void 0:f.get)==null?void 0:s.call(f,t);if(m){let h=((o=m.getDisplayObject)==null?void 0:o.call(m))||m.pixiObject||m.pixi||m;if(h!=null&&h.texture)h.texture=u;else if(h!=null&&h.children){let b=h.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=Ui();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Dt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Ui();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Dt(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,s]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:s});if(t.assets)for(let[a,s]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:s}),typeof s=="string"&&e(a,s);if(t.splash)for(let[a,s]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:s});if(t.loading)for(let[a,s]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:s});if(t.start)for(let[a,s]of Object.entries(t.start))n.push({path:`start.${a}`,value:s});n.length&&Dt(n,{silent:!0,persist:!0,emitEvent:!0})}}function On(r){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=r;t&&(t.onObjectRebuildRequired=async(a,s)=>{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 De.create(a,s,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"&&(zs(),window.applyEditableObjectConfig=(a,s)=>{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,s),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(s);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=jr(p);Rr(u,s)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,s){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,s),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(s);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=jr(l);Rr(u,s)}let c=[a];i==null||i(a,s,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,zr(a))}};return n.rebuildIndexes(),n}import Ds from"lottie-web";Dn(qa);typeof window!="undefined"&&!window.lottie&&(window.lottie=Ds);var tt=null,$s=async()=>{if(!tt){let r=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(r==null?void 0:r["handler.config"])||(r==null?void 0:r["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);tt=JSON.parse(i)}else tt=JSON.parse(e);return tt}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}tt=await(await fetch("./handler.config.json")).json()}return tt},$n,wt,Hr,it,Rn,zn;function Nd(r){$n=r.initGame,wt=r.CustomAssets,Hr=r.updateScreenState,it=r.globalResponsiveMultipliers,Rn=r.layout,zn=r.clearResponsiveElements}var Si="web_embed",xt="https://example.com",Dr={profile_id:Si},$e=null,ye=null,jn={width:0,height:0},Hs=!0,Fd=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let r=await $s();Dr={...r.ids||{},profile_id:Si},xt=r.destination_url||((d=(c=r.export_profiles)==null?void 0:c[Si])==null?void 0:d.destination_url)||xt,Te.init({ids:Dr,profile:Si,destinationUrl:xt});let e=Te.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ye=_r({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),$r()},onRefresh:$r});let g=ye.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var y,E,A,I,R,x,S,_,L,w,T;let m=window.gameApp,h=window.gameObjectManager,{width:b,height:v}=f.detail;if(jn.width=b,jn.height=v,Hr(b,v),!(!m||!m.renderer)){h&&o(m,h);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&&h&&Rn)try{let C=(y=window.__mainContainer)!=null?y:m.stage,M=(S=(x=(I=window.__tutorialLabel)!=null?I:(A=(E=h.get("label_1"))==null?void 0:E.getDisplayObject)==null?void 0:A.call(E))!=null?x:(R=h.get("label_1"))==null?void 0:R.pixiObject)!=null?S:h.get("label_1"),P=h.get("background_1"),j=(T=(w=(L=window.__background)!=null?L:(_=P==null?void 0:P.getDisplayObject)==null?void 0:_.call(P))!=null?w:P==null?void 0:P.pixiObject)!=null?T:P;if(C){let k=C===m.stage;Rn({mainContainer:C,label:M,background:j,backgroundTexture:(j==null?void 0:j.texture)||null,app:m},t,0,jn,h,{skipMainContainerTransform:k})}}catch(C){console.warn("[SCREEN] Error in layout:",C)}}})}let t=await Ht("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Gi(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 Ht("scene.main"));let i=await $n(e,t,xt,ye);$e=i.app;let n=i.gameObjectManager;window.gameApp=$e,window.gameObjectManager=n;try{window.__liveEditBridge=On({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:wt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ye&&ye.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(it.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o($e,n);async function s(){try{let g=async v=>{let y=v.startsWith("/")?v:`/${v}`,E=await fetch(y,{cache:"no-cache"});if(!E.ok)return null;let A=await E.text();try{return JSON.parse(A)}catch{return null}},f=await g("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let m=f.screens;if(!m||typeof m!="object")return;let h={},b={};for(let[v,y]of Object.entries(m)){let E=y==null?void 0:y.source;if(typeof E!="string")continue;let A=await g(E),I=A==null?void 0:A.elements;if(!Array.isArray(I))continue;let R=I.map(x=>x==null?void 0:x.instance_id).filter(x=>typeof x=="string");h[v]=R;for(let x of R)b[x]||(b[x]=v)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:h,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,f){if(Hs){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${it.scale.toFixed(3)}`),g.stage){let h=function(b,v=0){if(!b||!b.children)return;let y=" ".repeat(v);b.children.forEach((E,A)=>{if(E&&E.zIndex===9999){console.log(`${y}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(E&&E.scale){let I=E.scale.x||1,R=E.scale.y||1;E.__originalScale||(E.__originalScale={x:I,y:R},console.log(`${y}[RESPONSIVE] Stored original scale for child[${A}]: ${I.toFixed(3)}, ${R.toFixed(3)}`));let x=E.__originalScale.x*it.scale,S=E.__originalScale.y*it.scale;typeof E.scale.set=="function"?E.scale.set(x,S):(E.scale.x=x,E.scale.y=S),console.log(`${y}[RESPONSIVE] Child[${A}] scale: ${I.toFixed(3)}\u2192${E.scale.x.toFixed(3)} (type: ${E.constructor.name})`),h(E,v+1)}else E&&console.log(`${y}[RESPONSIVE] Child[${A}] has no scale (type: ${E.constructor.name})`)})};var m=h;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),h(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){it.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let f=window.gameApp,m=window.gameObjectManager;f&&m?(o(f,m),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!m}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Te.start()},$r=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let r=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(r){let a=((t=r.getDisplayObject)==null?void 0:t.call(r))||r;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(ye){ye.notifyGameDestroyed();try{zn&&zn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=ye.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),$e){try{$e.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}$e=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof wt.resetScene=="function"&&wt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Ht("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Gi(o)),$n(a,o,xt).then(l=>{$e=l.app,window.gameApp=$e,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=On({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:wt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ye&&ye.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Te.start()}catch{}})})},100)},1e3)}};var Le={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Ns=1.25,Fs={fontFamily:"Inter, system-ui, sans-serif"};var Hn=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=`
2194
+ `,this.setupEventListeners(e),e}setupEventListeners(e){var g,f,m,h,b,v,x,S;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",A=>{if(this.viewMode==="compare")return;let P=A.target.value;this.setDevice(P)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",A=>{let P=A.target.value;this.setTheme(P)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(A=>{A.addEventListener("click",()=>{let P=A.dataset.viewToggle;P&&this.setViewMode(P)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(A=>{A.addEventListener("click",()=>{let P=A.dataset.layoutToggle;P&&this.setLayoutMode(P)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(m=e.querySelector("#zoom-out-btn"))==null||m.addEventListener("click",()=>this.adjustUserZoom(-.1)),(h=e.querySelector("#refresh-btn"))==null||h.addEventListener("click",()=>this.refresh());let s=e.querySelector("#bottom-dock"),o=e.querySelector("#bottom-dock-resize");s&&o&&this.makeBottomDockResizable(s,o);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(A=>{A.addEventListener("click",()=>{let P=A.dataset.dockTab;if(!P)return;l.forEach(k=>k.classList.remove("active")),A.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(k=>{let j=k.dataset.dockPanel;k.classList.toggle("active",j===P)})})}),(b=e.querySelector("#console-clear"))==null||b.addEventListener("click",()=>this.clearConsole()),(v=e.querySelector("#corner-zoom-in-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(.1)),(x=e.querySelector("#corner-zoom-out-btn"))==null||x.addEventListener("click",()=>this.adjustUserZoom(-.1)),(S=e.querySelector("#corner-grab-btn"))==null||S.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),d=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&d&&this.makeSidebarResizable(c,d,"left");let p=e.querySelector(".debug-workbench"),u=p==null?void 0:p.querySelector("#workbench-resize-v");p&&u&&this.makeSidebarResizable(p,u,"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 s=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(s,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.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(),pa();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),ua();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=Ve().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(s=>typeof s=="object"?this.safeStringify(s):String(s)).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 s=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=s>0?`${s}!`:"0",a.classList.toggle("has-errors",s>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]"),s=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||!s||!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:s,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");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,s;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}),(s=(a=this.options).onDeviceChange)==null||s.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,s=n/e.preset.height,o=Math.max(.01,Math.min(a,s));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,s=t.canvas.height,o=Math.min(a/i.width,s/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,p=(s-c)/2;n.clearRect(0,0,a,s),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")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.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 jr(r={}){let e=new Pn(r);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as js,Container as Or}from"pixi.js";var Os=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",In=Os;if(typeof window!="undefined")try{let r=new XMLHttpRequest;if(r.open("GET","./build-settings.json",!1),r.send(),r.status===200&&r.responseText){let e=JSON.parse(r.responseText);e!=null&&e.buildMode&&(In=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${In}`))}}catch{}function _s(r){var t,i,n,a,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(r);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(r))return{x:(t=r[0])!=null?t:.5,y:(i=r[1])!=null?i:.5};if(r&&typeof r=="object"&&"x"in r&&"y"in r)return{x:(n=r.x)!=null?n:.5,y:(a=r.y)!=null?a:.5};if(typeof r=="string"){let o=r.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var De=class{static async create(e,t,i){var l,c,d,p,u,g,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${In}`);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 Or;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 s=await Fi.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=s==null?void 0:s.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new js(s),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=s==null?void 0:s.constructor)==null?void 0:u.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof Or)){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}`],h=!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:",(f=o==null?void 0:o.constructor)==null?void 0:f.name),h=!0;break}}catch{continue}h||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=s)}else o=s;else o=s,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,s,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((s=t.position.x)!=null?s: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=_s(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};function jn(r){try{if(r&&typeof r.keys=="function")return Array.from(r.keys())}catch{}return[]}function _r(r){var e;return r?((e=r.getDisplayObject)==null?void 0:e.call(r))||r.pixiObject||r:null}function Rs(r,e){if(!r||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);r.eventMode=i?"static":"none",r.interactive=i,i&&(r.cursor=t.draggable?"move":"pointer")}function Rr(r,e){var l,c,d;if(!r||!e)return;let t=e.transform||{};Rs(r,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),s=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=r.position)!=null&&l.set?r.position.set(a,s):(typeof r.x=="number"&&(r.x=a),typeof r.y=="number"&&(r.y=s)),typeof t.scale=="number"&&((c=r.scale)!=null&&c.set?r.scale.set(t.scale):r.scale&&(r.scale.x=t.scale,r.scale.y=t.scale));let o=t.anchor;if(o&&((d=r.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"&&r.anchor.set(p.x,p.y)}}function zr(r){if(typeof window=="undefined")return;let e=r==null?void 0:r.objects,t=jn(e),i=a=>{try{let s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===s):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>zr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(jn((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return jn((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var d,p,u,g,f;let s=(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 s;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[a];return c&&c===o?s: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 s={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return a}}function zs(){if(typeof window=="undefined")return;let r=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,s,o;let n=r(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 f=window.gameObjectManager,m=(s=f==null?void 0:f.get)==null?void 0:s.call(f,t);if(m){let h=((o=m.getDisplayObject)==null?void 0:o.call(m))||m.pixiObject||m.pixi||m;if(h!=null&&h.texture)h.texture=u;else if(h!=null&&h.children){let b=h.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=Ui();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Dt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Ui();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Dt(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,s]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:s});if(t.assets)for(let[a,s]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:s}),typeof s=="string"&&e(a,s);if(t.splash)for(let[a,s]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:s});if(t.loading)for(let[a,s]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:s});if(t.start)for(let[a,s]of Object.entries(t.start))n.push({path:`start.${a}`,value:s});n.length&&Dt(n,{silent:!0,persist:!0,emitEvent:!0})}}function On(r){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=r;t&&(t.onObjectRebuildRequired=async(a,s)=>{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 De.create(a,s,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"&&(zs(),window.applyEditableObjectConfig=(a,s)=>{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,s),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(s);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=_r(p);Rr(u,s)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,s){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,s),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(s);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=_r(l);Rr(u,s)}let c=[a];i==null||i(a,s,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,zr(a))}};return n.rebuildIndexes(),n}import Ds from"lottie-web";Dn(qa);typeof window!="undefined"&&!window.lottie&&(window.lottie=Ds);var tt=null,$s=async()=>{if(!tt){let r=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(r==null?void 0:r["handler.config"])||(r==null?void 0:r["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);tt=JSON.parse(i)}else tt=JSON.parse(e);return tt}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}tt=await(await fetch("./handler.config.json")).json()}return tt},$n,wt,Hr,it,Rn,zn;function Nd(r){$n=r.initGame,wt=r.CustomAssets,Hr=r.updateScreenState,it=r.globalResponsiveMultipliers,Rn=r.layout,zn=r.clearResponsiveElements}var Si="web_embed",xt="https://example.com",Dr={profile_id:Si},$e=null,ye=null,_n={width:0,height:0},Hs=!0,Fd=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let r=await $s();Dr={...r.ids||{},profile_id:Si},xt=r.destination_url||((d=(c=r.export_profiles)==null?void 0:c[Si])==null?void 0:d.destination_url)||xt,Te.init({ids:Dr,profile:Si,destinationUrl:xt});let e=Te.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ye=jr({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),$r()},onRefresh:$r});let g=ye.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var x,S,A,P,R,k,j,O,T,E,L;let m=window.gameApp,h=window.gameObjectManager,{width:b,height:v}=f.detail;if(_n.width=b,_n.height=v,Hr(b,v),!(!m||!m.renderer)){h&&o(m,h);try{m.renderer.resize(b,v);let y=m.view;y&&(y.style.width="100%",y.style.height="100%",y.style.display="block")}catch(y){console.warn("[SCREEN] Error resizing renderer:",y);return}if(t&&h&&Rn)try{let y=(x=window.__mainContainer)!=null?x:m.stage,w=(j=(k=(P=window.__tutorialLabel)!=null?P:(A=(S=h.get("label_1"))==null?void 0:S.getDisplayObject)==null?void 0:A.call(S))!=null?k:(R=h.get("label_1"))==null?void 0:R.pixiObject)!=null?j:h.get("label_1"),C=h.get("background_1"),_=(L=(E=(T=window.__background)!=null?T:(O=C==null?void 0:C.getDisplayObject)==null?void 0:O.call(C))!=null?E:C==null?void 0:C.pixiObject)!=null?L:C;if(y){let M=y===m.stage;Rn({mainContainer:y,label:w,background:_,backgroundTexture:(_==null?void 0:_.texture)||null,app:m},t,0,_n,h,{skipMainContainerTransform:M})}}catch(y){console.warn("[SCREEN] Error in layout:",y)}}})}let t=await Ht("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Gi(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 Ht("scene.main"));let i=await $n(e,t,xt,ye);$e=i.app;let n=i.gameObjectManager;window.gameApp=$e,window.gameObjectManager=n;try{window.__liveEditBridge=On({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:wt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ye&&ye.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(it.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o($e,n);async function s(){try{let g=async v=>{let x=v.startsWith("/")?v:`/${v}`,S=await fetch(x,{cache:"no-cache"});if(!S.ok)return null;let A=await S.text();try{return JSON.parse(A)}catch{return null}},f=await g("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let m=f.screens;if(!m||typeof m!="object")return;let h={},b={};for(let[v,x]of Object.entries(m)){let S=x==null?void 0:x.source;if(typeof S!="string")continue;let A=await g(S),P=A==null?void 0:A.elements;if(!Array.isArray(P))continue;let R=P.map(k=>k==null?void 0:k.instance_id).filter(k=>typeof k=="string");h[v]=R;for(let k of R)b[k]||(b[k]=v)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:h,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,f){if(Hs){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${it.scale.toFixed(3)}`),g.stage){let h=function(b,v=0){if(!b||!b.children)return;let x=" ".repeat(v);b.children.forEach((S,A)=>{if(S&&S.zIndex===9999){console.log(`${x}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(S&&S.scale){let P=S.scale.x||1,R=S.scale.y||1;S.__originalScale||(S.__originalScale={x:P,y:R},console.log(`${x}[RESPONSIVE] Stored original scale for child[${A}]: ${P.toFixed(3)}, ${R.toFixed(3)}`));let k=S.__originalScale.x*it.scale,j=S.__originalScale.y*it.scale;typeof S.scale.set=="function"?S.scale.set(k,j):(S.scale.x=k,S.scale.y=j),console.log(`${x}[RESPONSIVE] Child[${A}] scale: ${P.toFixed(3)}\u2192${S.scale.x.toFixed(3)} (type: ${S.constructor.name})`),h(S,v+1)}else S&&console.log(`${x}[RESPONSIVE] Child[${A}] has no scale (type: ${S.constructor.name})`)})};var m=h;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),h(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){it.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let f=window.gameApp,m=window.gameObjectManager;f&&m?(o(f,m),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!m}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Te.start()},$r=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let r=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(r){let a=((t=r.getDisplayObject)==null?void 0:t.call(r))||r;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(ye){ye.notifyGameDestroyed();try{zn&&zn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=ye.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),$e){try{$e.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}$e=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof wt.resetScene=="function"&&wt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Ht("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Gi(o)),$n(a,o,xt).then(l=>{$e=l.app,window.gameApp=$e,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=On({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:wt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ye&&ye.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Te.start()}catch{}})})},100)},1e3)}};var Le={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Ns=1.25,Fs={fontFamily:"Inter, system-ui, sans-serif"};var Hn=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=`
2185
2195
  position: fixed;
2186
2196
  inset: 0;
2187
2197
  display: flex;
@@ -2396,7 +2406,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2396
2406
  }
2397
2407
  events.forEach(function(e){ document.addEventListener(e, unlock, false); });
2398
2408
  })();
2399
- `,r.appendChild(e)}async function Kn(r,e={}){let t=new Zs;await t.init({resizeTo:r,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var p,u,g,f;if(!t.renderer)return;let o=(p=s==null?void 0:s.width)!=null?p:r.clientWidth,l=(u=s==null?void 0:s.height)!=null?u:r.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(f=window.innerHeight)!=null?f:480;t.renderer.resize(c,d)};r.appendChild(t.canvas),r.style.position="relative",r.style.display="flex",r.style.flexDirection="column",r.style.alignItems="stretch",r.style.width="100%",r.style.height="100dvh",r.style.minHeight="100vh",r.style.maxWidth="100%",r.style.maxHeight="100%",r.style.boxSizing="border-box",r.style.overflow="hidden",e.background&&(r.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(";")),r.appendChild(n),Te.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),Te.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),Te.on("resize",({payload:s})=>{i({width:s==null?void 0:s.width,height:s==null?void 0:s.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(s=>{let o=s[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(r),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Xn,Ticker as dt,ColorMatrixFilter as Qs}from"pixi.js";var Mi=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)}},Pi=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}=as("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},Ii=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 Mi(n.transform),this.renderer=new Pi(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&&(dt.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,f,m,h,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=(f=e==null?void 0:e.render)==null?void 0:f.asset)==null?void 0:m.type,s=(b=(h=this._config)==null?void 0:h.ui)==null?void 0:b.renderMode,o=(v=e==null?void 0:e.ui)==null?void 0:v.renderMode;if((n!==a||s!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} 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,s,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=(s=this._config)==null?void 0:s.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,s,o;if(!((a=this.pixiObject)!=null&&a.scale))return;let e=(s=this._config)==null?void 0:s.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,s,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 Xn;u.blur=(a=e.blur.strength)!=null?a:4,t.push(u)}if((s=e.shadow)!=null&&s.enabled){let u=e.shadow,g=new Xn;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 Xn;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let f=new Qs,m=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;f.tint(m),t.push(f)}}(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,f,m,h;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,s=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((m=(f=this._config)==null?void 0:f.effects)==null?void 0:m.scale_y)||1);if(this.pixiObject.alpha=(h=t.startAlpha)!=null?h:0,t.startScale!==void 0&&this.pixiObject.scale.set(s*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=a+(t.startYOffset||0)),this._introTicker&&dt.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(s,o);return}let l=0,c=b=>{var S,_,L,w,T,C;if(l+=b.deltaTime/60,l<n)return;let v=i>0?Math.min(1,(l-n)/i):1,y=1-Math.pow(1-v,3),E=this.renderer.alpha,A=this.transform.scale*(((_=(S=this._config)==null?void 0:S.effects)==null?void 0:_.scale_x)||1),I=this.transform.scale*(((w=(L=this._config)==null?void 0:L.effects)==null?void 0:w.scale_y)||1),R=this.transform.position.y,x=this.transform.position.x;if(this.pixiObject.alpha=((T=t.startAlpha)!=null?T:0)+(E-((C=t.startAlpha)!=null?C:0))*y,t.startScale!==void 0){let M=t.startScale+(1-t.startScale)*y;this.pixiObject.scale.set(A*M,I*M)}t.startYOffset!==void 0&&(this.pixiObject.y=R+t.startYOffset+(R-(R+t.startYOffset))*y),v>=1&&(dt.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=E,this.pixiObject.x=x,this.pixiObject.y=R,this.pixiObject.scale.set(A,I))};this._introTicker=c,dt.shared.add(c)}applyMotion(){var p,u,g,f,m,h;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)||((f=e.continuousMove)==null?void 0:f.enabled)||((m=e.continuousRotate)==null?void 0:m.enabled)||((h=e.orbit)==null?void 0:h.enabled)))return;let a=0,s=0,o=0,l=0,c=1/60,d=b=>{var L,w,T,C,M,P,j,k,O,D,F,H,B,Y,J,te,se,Ee,$,ne,oe,ue,le,fe,Se,Ae;let v=((L=b.deltaTime)!=null?L:1)*c;a+=b.deltaTime*.05;let y=this.transform.scale,E=y*(((T=(w=this._config)==null?void 0:w.effects)==null?void 0:T.scale_x)||1),A=y*(((M=(C=this._config)==null?void 0:C.effects)==null?void 0:M.scale_y)||1),I=this.transform.position.x,R=this.transform.position.y,x=this.transform.rotation,S=0,_=0;if((P=e.swing)!=null&&P.enabled){let U=(j=e.swing.amplitude)!=null?j:10,Z=(k=e.swing.speed)!=null?k:1,W=Math.sin(a*Z)*U;e.swing.axis==="vertical"?_+=W:e.swing.axis==="both"?(S+=W,_+=W):S+=W}if((O=e.continuousMove)!=null&&O.enabled){let U=(D=e.continuousMove.axis)!=null?D:"x",Z=Math.max(0,(F=e.continuousMove.speed)!=null?F:50),W=Math.sign((H=e.continuousMove.direction)!=null?H:1)||1,ie=Math.max(0,(B=e.continuousMove.lifetime)!=null?B:0);s+=v;let Ie=ie>0?Math.min(s,ie):s,Ne=Z*W*Ie;(U==="x"||U==="both")&&(S+=Ne),(U==="y"||U==="both")&&(_+=Ne)}if((Y=e.orbit)!=null&&Y.enabled){let U=Math.max(0,(J=e.orbit.radius)!=null?J:50),Z=Math.max(0,(te=e.orbit.speed)!=null?te:45),W=Math.sign((se=e.orbit.direction)!=null?se:1)||1,ie=Z*Math.PI/180;l+=ie*W*v;let Ie=(Ee=e.orbit.pivotOffsetX)!=null?Ee:0,Ne=($=e.orbit.pivotOffsetY)!=null?$:0;S+=Ie+U*Math.cos(l),_+=Ne+U*Math.sin(l)}if(this.pixiObject.x=I+S,this.pixiObject.y=R+_,(ne=e.pulse)!=null&&ne.enabled){let U=(oe=e.pulse.intensity)!=null?oe:.1,Z=(ue=e.pulse.speed)!=null?ue:1,ie=1+Math.sin(a*Z)*U;(le=this.pixiObject.scale)!=null&&le.set?this.pixiObject.scale.set(E*ie,A*ie):this.pixiObject.scale&&(this.pixiObject.scale.x=E*ie,this.pixiObject.scale.y=A*ie)}if((fe=e.continuousRotate)!=null&&fe.enabled){let U=Math.max(0,(Se=e.continuousRotate.speed)!=null?Se:90),Z=Math.sign((Ae=e.continuousRotate.direction)!=null?Ae:1)||1,W=U*Math.PI/180;o+=W*Z*v,this.pixiObject.rotation=x+o}};dt.shared.add(d),this._tickerCleanup=()=>{var b,v,y,E,A;if(dt.shared.remove(d),this.pixiObject){let I=this.transform.scale*(((v=(b=this._config)==null?void 0:b.effects)==null?void 0:v.scale_x)||1),R=this.transform.scale*(((E=(y=this._config)==null?void 0:y.effects)==null?void 0:E.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(A=this.pixiObject.scale)!=null&&A.set?this.pixiObject.scale.set(I,R):this.pixiObject.scale&&(this.pixiObject.scale.x=I,this.pixiObject.scale.y=R)}}}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)}},kt=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 Ii(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,s)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,s);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(s)},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 _i={"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 eo(r){let e=_i[r];return e?e.family:(console.warn(`Font ID "${r}" not found in registry, using fallback`),"Arial, sans-serif")}function to(r){var t;let e=_i[r];return e&&(t=e.weight)!=null?t:"400"}function io(r,e){_i[r]=e}function no(){return Object.keys(_i)}var pt=null;function ao(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!pt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),pt||(typeof window!="undefined"&&window.lottie?(pt=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(r=>r.toLowerCase().includes("lottie")):"no window"),pt=null)),pt}function ro(r){return!r||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("/")?r:`/${r.replace(/^\.\//,"")}`}function so(r){try{let e=new XMLHttpRequest;return e.open("GET",ro(r),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Zr(r){return!r||typeof r!="object"||!Array.isArray(r.layers)?null:(Array.isArray(r.assets)||(r.assets=[]),Array.isArray(r.chars)||(r.chars=[]),r)}function Dn(r){pt=r}function oo(r,e,t,i){var I,R,x,S,_,L,w,T,C,M,P,j,k,O,D,F,H,B,Y;let n=t.objects.get(r);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${r}`),null;let a=((I=n.effects)==null?void 0:I.lottie)||{},s=n.transform||{},o=n.render||{};if(a.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[r],c=Zr(l);if(!c){let J=(x=(R=n.render)==null?void 0:R.asset)==null?void 0:x.path;if(typeof J=="string"&&J.toLowerCase().endsWith(".json")){let te=so(J);if(c=Zr(te),c)try{i[r]=c}catch{}}}if(!c){let J=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${r}`,{kind:J}),null}let d=ao();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${r}`),null;let p=(S=a.width)!=null?S:300,u=(_=a.height)!=null?_:300,g=(L=s.scale)!=null?L:1,f=((T=(w=s.position)==null?void 0:w.x)!=null?T:0)+((M=(C=s.offset)==null?void 0:C.x)!=null?M:0),m=((j=(P=s.position)==null?void 0:P.y)!=null?j:0)+((O=(k=s.offset)==null?void 0:k.y)!=null?O:0),h=(D=s.rotation)!=null?D:0,b=(F=o.z_index)!=null?F:100,v=(H=o.alpha)!=null?H:1,y=document.createElement("div");y.style.cssText=`
2409
+ `,r.appendChild(e)}async function Kn(r,e={}){let t=new Zs;await t.init({resizeTo:r,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var p,u,g,f;if(!t.renderer)return;let o=(p=s==null?void 0:s.width)!=null?p:r.clientWidth,l=(u=s==null?void 0:s.height)!=null?u:r.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(f=window.innerHeight)!=null?f:480;t.renderer.resize(c,d)};r.appendChild(t.canvas),r.style.position="relative",r.style.display="flex",r.style.flexDirection="column",r.style.alignItems="stretch",r.style.width="100%",r.style.height="100dvh",r.style.minHeight="100vh",r.style.maxWidth="100%",r.style.maxHeight="100%",r.style.boxSizing="border-box",r.style.overflow="hidden",e.background&&(r.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(";")),r.appendChild(n),Te.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),Te.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),Te.on("resize",({payload:s})=>{i({width:s==null?void 0:s.width,height:s==null?void 0:s.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(s=>{let o=s[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(r),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Xn,Ticker as dt,ColorMatrixFilter as Qs}from"pixi.js";var Mi=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)}},Pi=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}=as("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},Ii=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 Mi(n.transform),this.renderer=new Pi(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&&(dt.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,f,m,h,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=(f=e==null?void 0:e.render)==null?void 0:f.asset)==null?void 0:m.type,s=(b=(h=this._config)==null?void 0:h.ui)==null?void 0:b.renderMode,o=(v=e==null?void 0:e.ui)==null?void 0:v.renderMode;if((n!==a||s!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} 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,s,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=(s=this._config)==null?void 0:s.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,s,o;if(!((a=this.pixiObject)!=null&&a.scale))return;let e=(s=this._config)==null?void 0:s.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,s,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 Xn;u.blur=(a=e.blur.strength)!=null?a:4,t.push(u)}if((s=e.shadow)!=null&&s.enabled){let u=e.shadow,g=new Xn;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 Xn;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let f=new Qs,m=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;f.tint(m),t.push(f)}}(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,f,m,h;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,s=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((m=(f=this._config)==null?void 0:f.effects)==null?void 0:m.scale_y)||1);if(this.pixiObject.alpha=(h=t.startAlpha)!=null?h:0,t.startScale!==void 0&&this.pixiObject.scale.set(s*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=a+(t.startYOffset||0)),this._introTicker&&dt.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(s,o);return}let l=0,c=b=>{var j,O,T,E,L,y;if(l+=b.deltaTime/60,l<n)return;let v=i>0?Math.min(1,(l-n)/i):1,x=1-Math.pow(1-v,3),S=this.renderer.alpha,A=this.transform.scale*(((O=(j=this._config)==null?void 0:j.effects)==null?void 0:O.scale_x)||1),P=this.transform.scale*(((E=(T=this._config)==null?void 0:T.effects)==null?void 0:E.scale_y)||1),R=this.transform.position.y,k=this.transform.position.x;if(this.pixiObject.alpha=((L=t.startAlpha)!=null?L:0)+(S-((y=t.startAlpha)!=null?y:0))*x,t.startScale!==void 0){let w=t.startScale+(1-t.startScale)*x;this.pixiObject.scale.set(A*w,P*w)}t.startYOffset!==void 0&&(this.pixiObject.y=R+t.startYOffset+(R-(R+t.startYOffset))*x),v>=1&&(dt.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=S,this.pixiObject.x=k,this.pixiObject.y=R,this.pixiObject.scale.set(A,P))};this._introTicker=c,dt.shared.add(c)}applyMotion(){var p,u,g,f,m,h;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)||((f=e.continuousMove)==null?void 0:f.enabled)||((m=e.continuousRotate)==null?void 0:m.enabled)||((h=e.orbit)==null?void 0:h.enabled)))return;let a=0,s=0,o=0,l=0,c=1/60,d=b=>{var T,E,L,y,w,C,_,M,I,D,F,H,B,Y,J,te,se,Ee,$,ne,oe,ue,le,fe,Se,Ae;let v=((T=b.deltaTime)!=null?T:1)*c;a+=b.deltaTime*.05;let x=this.transform.scale,S=x*(((L=(E=this._config)==null?void 0:E.effects)==null?void 0:L.scale_x)||1),A=x*(((w=(y=this._config)==null?void 0:y.effects)==null?void 0:w.scale_y)||1),P=this.transform.position.x,R=this.transform.position.y,k=this.transform.rotation,j=0,O=0;if((C=e.swing)!=null&&C.enabled){let U=(_=e.swing.amplitude)!=null?_:10,Z=(M=e.swing.speed)!=null?M:1,W=Math.sin(a*Z)*U;e.swing.axis==="vertical"?O+=W:e.swing.axis==="both"?(j+=W,O+=W):j+=W}if((I=e.continuousMove)!=null&&I.enabled){let U=(D=e.continuousMove.axis)!=null?D:"x",Z=Math.max(0,(F=e.continuousMove.speed)!=null?F:50),W=Math.sign((H=e.continuousMove.direction)!=null?H:1)||1,ie=Math.max(0,(B=e.continuousMove.lifetime)!=null?B:0);s+=v;let Ie=ie>0?Math.min(s,ie):s,Ne=Z*W*Ie;(U==="x"||U==="both")&&(j+=Ne),(U==="y"||U==="both")&&(O+=Ne)}if((Y=e.orbit)!=null&&Y.enabled){let U=Math.max(0,(J=e.orbit.radius)!=null?J:50),Z=Math.max(0,(te=e.orbit.speed)!=null?te:45),W=Math.sign((se=e.orbit.direction)!=null?se:1)||1,ie=Z*Math.PI/180;l+=ie*W*v;let Ie=(Ee=e.orbit.pivotOffsetX)!=null?Ee:0,Ne=($=e.orbit.pivotOffsetY)!=null?$:0;j+=Ie+U*Math.cos(l),O+=Ne+U*Math.sin(l)}if(this.pixiObject.x=P+j,this.pixiObject.y=R+O,(ne=e.pulse)!=null&&ne.enabled){let U=(oe=e.pulse.intensity)!=null?oe:.1,Z=(ue=e.pulse.speed)!=null?ue:1,ie=1+Math.sin(a*Z)*U;(le=this.pixiObject.scale)!=null&&le.set?this.pixiObject.scale.set(S*ie,A*ie):this.pixiObject.scale&&(this.pixiObject.scale.x=S*ie,this.pixiObject.scale.y=A*ie)}if((fe=e.continuousRotate)!=null&&fe.enabled){let U=Math.max(0,(Se=e.continuousRotate.speed)!=null?Se:90),Z=Math.sign((Ae=e.continuousRotate.direction)!=null?Ae:1)||1,W=U*Math.PI/180;o+=W*Z*v,this.pixiObject.rotation=k+o}};dt.shared.add(d),this._tickerCleanup=()=>{var b,v,x,S,A;if(dt.shared.remove(d),this.pixiObject){let P=this.transform.scale*(((v=(b=this._config)==null?void 0:b.effects)==null?void 0:v.scale_x)||1),R=this.transform.scale*(((S=(x=this._config)==null?void 0:x.effects)==null?void 0:S.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(A=this.pixiObject.scale)!=null&&A.set?this.pixiObject.scale.set(P,R):this.pixiObject.scale&&(this.pixiObject.scale.x=P,this.pixiObject.scale.y=R)}}}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)}},kt=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 Ii(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,s)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,s);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(s)},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 ji={"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 eo(r){let e=ji[r];return e?e.family:(console.warn(`Font ID "${r}" not found in registry, using fallback`),"Arial, sans-serif")}function to(r){var t;let e=ji[r];return e&&(t=e.weight)!=null?t:"400"}function io(r,e){ji[r]=e}function no(){return Object.keys(ji)}var pt=null;function ao(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!pt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),pt||(typeof window!="undefined"&&window.lottie?(pt=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(r=>r.toLowerCase().includes("lottie")):"no window"),pt=null)),pt}function ro(r){return!r||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("/")?r:`/${r.replace(/^\.\//,"")}`}function so(r){try{let e=new XMLHttpRequest;return e.open("GET",ro(r),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Zr(r){return!r||typeof r!="object"||!Array.isArray(r.layers)?null:(Array.isArray(r.assets)||(r.assets=[]),Array.isArray(r.chars)||(r.chars=[]),r)}function Dn(r){pt=r}function oo(r,e,t,i){var P,R,k,j,O,T,E,L,y,w,C,_,M,I,D,F,H,B,Y;let n=t.objects.get(r);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${r}`),null;let a=((P=n.effects)==null?void 0:P.lottie)||{},s=n.transform||{},o=n.render||{};if(a.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[r],c=Zr(l);if(!c){let J=(k=(R=n.render)==null?void 0:R.asset)==null?void 0:k.path;if(typeof J=="string"&&J.toLowerCase().endsWith(".json")){let te=so(J);if(c=Zr(te),c)try{i[r]=c}catch{}}}if(!c){let J=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${r}`,{kind:J}),null}let d=ao();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${r}`),null;let p=(j=a.width)!=null?j:300,u=(O=a.height)!=null?O:300,g=(T=s.scale)!=null?T:1,f=((L=(E=s.position)==null?void 0:E.x)!=null?L:0)+((w=(y=s.offset)==null?void 0:y.x)!=null?w:0),m=((_=(C=s.position)==null?void 0:C.y)!=null?_:0)+((I=(M=s.offset)==null?void 0:M.y)!=null?I:0),h=(D=s.rotation)!=null?D:0,b=(F=o.z_index)!=null?F:100,v=(H=o.alpha)!=null?H:1,x=document.createElement("div");x.style.cssText=`
2400
2410
  position: absolute;
2401
2411
  top: calc(50% + ${m}px);
2402
2412
  left: calc(50% + ${f}px);
@@ -2406,4 +2416,4 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2406
2416
  pointer-events: none;
2407
2417
  z-index: ${b};
2408
2418
  opacity: ${v};
2409
- `,e.appendChild(y);let E;try{E=d.loadAnimation({container:y,renderer:a.renderer||"svg",loop:(B=a.loop)!=null?B:!1,autoplay:(Y=a.autoplay)!=null?Y:!0,animationData:c})}catch(J){return y.parentNode&&y.parentNode.removeChild(y),console.warn(`[LottieOverlay] Failed to start animation: ${r}`,J),null}a.speed!==void 0&&E.setSpeed(a.speed);let A=()=>{E.destroy(),y.parentNode&&y.parentNode.removeChild(y)};return a.loop||E.addEventListener("complete",A),{animation:E,cleanup:A}}var Jn=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 Kn(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 kt(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 Mt=class{setContext(e){this.context=e}};var Pt=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 Qr from"pixi.js";var lo=Qr;typeof window!="undefined"&&(window.__basePixi=Qr);import{Sprite as co,Text as po,TextStyle as uo,Texture as es}from"pixi.js";var ts=r=>r*Math.PI/180;function go(r,e){var s,o,l,c,d;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(s=e.render)!=null&&s.tint&&(i=e.render.tint);let n=new uo({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 po({text:t.text,style:n});return a.label=r,a}function ho(r){var d,p,u,g,f,m,h,b,v,y;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:s}=r,o={},l={},c={};t.sortableChildren=!0;for(let[E,A]of i.objects.entries()){if(s!=null&&s.has(E)||a&&!a.has(E)||(A==null?void 0:A.enabled)===!1)continue;let I=(p=(d=A==null?void 0:A.render)==null?void 0:d.asset)==null?void 0:p.path,R=(g=(u=A==null?void 0:A.render)==null?void 0:u.asset)==null?void 0:g.type,x=!!(I&&R==="image"),S=!!((f=A==null?void 0:A.ui)!=null&&f.text),_=S?(m=A==null?void 0:A.ui)==null?void 0:m.renderMode:void 0,L;if(_==="png"&&x?L="png":_==="text"&&S?L="text":x?L="png":S?L="text":L="skip",L!=="skip"){if(L==="text"){let w=go(E,A);if(!w)continue;let T=A.render;w.alpha=typeof(T==null?void 0:T.alpha)=="number"?T.alpha:1,w.visible=(T==null?void 0:T.visible)!==!1,w.zIndex=typeof(T==null?void 0:T.z_index)=="number"?T.z_index:0,T!=null&&T.anchor&&typeof T.anchor.x=="number"&&typeof T.anchor.y=="number"?w.anchor.set(T.anchor.x,T.anchor.y):w.anchor.set(.5,.5);let C=A.transform,M=(C==null?void 0:C.position)||(C==null?void 0:C.offset);M&&w.position.set((h=M.x)!=null?h:0,(b=M.y)!=null?b:0);let P=typeof(C==null?void 0:C.scale)=="number"?C.scale:1;w.scale.set(P,P);let j=typeof(C==null?void 0:C.rotation)=="number"?C.rotation:0;w.rotation=ts(j),w.parent||t.addChild(w);try{n.create(E,w)}catch{}o[E]=w,c[E]=w}else if(L==="png"){let w=ve[E]||(typeof es!="undefined"?es.EMPTY:void 0),T=new co(w);T.label=E;let C=A.render;T.alpha=typeof(C==null?void 0:C.alpha)=="number"?C.alpha:1,T.visible=(C==null?void 0:C.visible)!==!1,T.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"&&T.anchor.set(C.anchor.x,C.anchor.y);let M=A.transform,P=(M==null?void 0:M.position)||(M==null?void 0:M.offset);P&&T.position.set((v=P.x)!=null?v:0,(y=P.y)!=null?y:0);let j=typeof(M==null?void 0:M.scale)=="number"?M.scale:1;T.scale.set(j,j);let k=typeof(M==null?void 0:M.rotation)=="number"?M.rotation:0;T.rotation=ts(k),T.parent||t.addChild(T);try{n.create(E,T)}catch{}o[E]=T,l[E]=T}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var Zn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Pt}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 s=this.registry.get(a);if(!s){console.warn("[Assets] No config found for object:",a);return}try{let l=await De.create(a,s,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 De.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},is=new Zn,mo=new Proxy(is,{get(r,e){if(e in r&&typeof r[e]=="function")return r[e].bind(r);if(r.get(e))return r.get(e)}});function fo(r,e){is.init(r,e)}var Qn=class extends Mt{async init(){Bi(this.context.config,this.context.app),await ve.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};import{Graphics as bo,Point as vo}from"pixi.js";var Pe={width:400,height:600,designWidth:400,scaleFactor:1},ji={scale:1,position:1},Ri=[];function yo(r,e,t,i,n,a,s){Ri.push({element:r,originalScale:a,positionHelper:e,heightPercent:n}),e(r,t,i,n,a,s,!1)}function xo(){Ri.forEach(({element:r,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*Pe.scaleFactor;t(r,Pe.width,Pe.height,i,n,!0,!1)})}function wo(){Ri.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function ea(r,e){console.log(`[SCREEN] updateScreenState called: ${r}x${e}`),Pe.width=r,Pe.height=e,Pe.scaleFactor=Math.min(r/Pe.designWidth,1.15),ji.scale=Pe.scaleFactor,ji.position=1,console.log(`[SCREEN] Global multipliers - scale: ${ji.scale.toFixed(3)}`),xo()}var V={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 Eo(r,e,t){let i=V[r];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${r}.${e} = ${t}`))}function So(){return V}var Ao={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 Oi(r,e){return typeof r=="number"&&Number.isFinite(r)?r:e}function ut(r,e={x:.5,y:.5}){var t;if(Array.isArray(r))return{x:Oi(r[0],e.x),y:Oi(r[1],e.y)};if(r&&typeof r=="object"){let i=r;return{x:Oi(i.x,e.x),y:Oi(i.y,e.y)}}if(typeof r=="string"){let i=r.trim().toLowerCase();return(t=Ao[i])!=null?t:e}return e}function _t(r,e,t,i={}){var g,f,m,h,b,v;let n=ut(t),a=(g=i.inset)!=null?g:{},s=(f=i.padding)!=null?f:{x:0,y:0},o=((m=a.left)!=null?m:0)+s.x,l=((h=a.right)!=null?h:0)+s.x,c=((b=a.top)!=null?b:0)+s.y,d=((v=a.bottom)!=null?v:0)+s.y,p=Math.max(0,r-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function Ot(r,e,t,i={}){var m,h,b,v,y,E;let n=(m=i.inset)!=null?m:{},a=(h=i.padding)!=null?h:{x:0,y:0},s=((b=n.left)!=null?b:0)+a.x,o=((v=n.right)!=null?v:0)+a.x,l=((y=n.top)!=null?y:0)+a.y,c=((E=n.bottom)!=null?E:0)+a.y,d=Math.max(0,r-s-o),p=Math.max(0,e-l-c),u=ut(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:s+d*g,y:l+p*f}}function ta(r,e,t,i={}){var d,p,u;if(!r)return;let n=i.positionRatio?Ot(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):_t(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(d=i.offset)!=null?d:{x:0,y:0},s=n.x+a.x,o=n.y+a.y;r.anchor&&i.renderAnchor&&r.anchor.set(i.renderAnchor.x,i.renderAnchor.y),me(r,s,o);let l=(p=i.scale)!=null?p:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&we(r,l*c)}if(typeof window!="undefined"){let r=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==r||n!==e)&&(r=i,e=n,ea(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),ea(window.innerWidth,window.innerHeight),window.updateDebugConfig=Eo,window.getDebugConfig=So,window.copyConfig=Ro,window.applyConfig=It,window.applyConfigForRatio=zo,window.positionAtBottom=ns,window.positionAtTop=Lo,window.positionAtCenter=ko,window.positionAtLeft=Mo,window.positionAtRight=Po,window.positionAtBottomLeft=Io,window.positionAtBottomRight=_o,window.positionAtTopLeft=Oo,window.positionAtTopRight=jo,window.applyPositionContract=To,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 zi(r,e,t=0){return r*e+t}function Di(r,e,t=0){return r*(1-e)+t}function $i(r,e,t=0){return r*e+t}function Hi(r,e,t=0){return r*(1-e)+t}function pe(r,e=0){return r/2+e}function Co(r,e){return r*e}function To(r,e,t,i){var s,o,l,c,d,p,u,g,f,m,h,b,v,y,E,A,I,R,x,S;let n=0,a=0;switch(i.type){case"top":n=pe(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),a=zi(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=pe(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=Di(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=$i(e,i.percent,(m=(f=i.offset)==null?void 0:f.x)!=null?m:0),a=pe(t,(b=(h=i.offset)==null?void 0:h.y)!=null?b:0);break;case"right":n=Hi(e,i.percent,(y=(v=i.offset)==null?void 0:v.x)!=null?y:0),a=pe(t,(A=(E=i.offset)==null?void 0:E.y)!=null?A:0);break;case"center":n=pe(e,(R=(I=i.offset)==null?void 0:I.x)!=null?R:0),a=pe(t,(S=(x=i.offset)==null?void 0:x.y)!=null?S:0);break}r.position?r.position.set(n,a):(r.x=n,r.y=a),i.scale!==void 0&&i.scale!==1&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(i.scale,i.scale):(r.scale.x=i.scale,r.scale.y=i.scale))}function ns(r,e,t,i=.2,n=1,a=!0,s=!1){let o=Co(t,i),l=Di(t,i/2);me(r,pe(e),l);let c=a?n*Pe.scaleFactor:n;we(r,c),s&&!Ri.find(d=>d.element===r)&&yo(r,ns,e,t,i,n,a)}function Lo(r,e,t,i=.1,n=1){me(r,pe(e),zi(t,i)),we(r,n)}function ko(r,e,t,i=0,n=0,a=1){me(r,pe(e,i),pe(t,n)),we(r,a)}function Mo(r,e,t,i=.1,n=1){me(r,$i(e,i),pe(t)),we(r,n)}function Po(r,e,t,i=.1,n=1){me(r,Hi(e,i),pe(t)),we(r,n)}function Io(r,e,t,i=.05,n=.05,a=1){me(r,$i(e,n),Di(t,i)),we(r,a)}function _o(r,e,t,i=.05,n=.05,a=1){me(r,Hi(e,n),Di(t,i)),we(r,a)}function Oo(r,e,t,i=.05,n=.05,a=1){me(r,$i(e,n),zi(t,i)),we(r,a)}function jo(r,e,t,i=.05,n=.05,a=1){me(r,Hi(e,n),zi(t,i)),we(r,a)}function me(r,e,t){r&&r.position?typeof r.position.set=="function"?r.position.set(e,t):(r.position.x=e,r.position.y=t):r&&(r.x=e,r.y=t)}function we(r,e){e!==1&&r&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(e,e):r.scale.x!==void 0&&r.scale.y!==void 0&&(r.scale.x=e,r.scale.y=e))}var qe={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 Ro(r){return r&&qe[r]?JSON.parse(JSON.stringify(qe[r])):JSON.parse(JSON.stringify(V))}function It(r){Object.keys(r).forEach(e=>{let t=e;V[t]&&r[t]&&Object.assign(V[t],r[t])}),console.log("Config applied:",r)}function zo(r,e){let t=r/e;t>1.6?(It(qe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(It(qe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(It(qe.square),console.log("Applied SQUARE config for ratio:",t)):(It(qe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let r=window;r.configPresets=qe,r.resolveAnchorVec2=r.resolveAnchorVec2||ut,r.resolveScreenAnchorPoint=r.resolveScreenAnchorPoint||_t,r.resolveScreenRatioPoint=r.resolveScreenRatioPoint||Ot}var re=null;function Do(r,e,t,i,n,a={}){var j,k,O,D,F,H,B,Y,J,te,se,Ee,$,ne,oe,ue,le,fe,Se,Ae,U,Z,W,ie,Ie,Ne,ia,na,aa,ra,sa,oa,la,ca;let s=(j=a.enableDebugLogs)!=null?j:!1;s&&(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}=r;if(!p||!p.renderer){s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}s&&(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;s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:u,baseHeight:g});let f=u*V.layout.screen_scale_x,m=g*V.layout.screen_scale_y,h=u/2,b=e.engine.runtime||{},v=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:V.layout.screen_scale_x,screen_scale_y:V.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:f,height:m,midX:h}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",v));let y=v.design_width_portrait||400,E=f/y;E=Math.min(E,1.15);let A=E*((k=V.engine.scale)!=null?k:1),I=(O=a.skipMainContainerTransform)!=null?O:!1;!I&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(A):(o.scale.x=A,o.scale.y=A));let R=(D=v.main_container_anchor)!=null?D:"center",x=(F=v.main_container_position_ratio)!=null?F:{x:.5,y:.5},S=(H=v.main_container_offset)!=null?H:{x:0,y:0},_=v.main_container_position_ratio?Ot(u,g,x):_t(u,g,R),L=_.x+S.x+V.layout.position_offset.x,w=_.y+S.y+V.layout.position_offset.y;if(!I&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(L,w):(o.position.x=L,o.position.y=w)),n&&(o!=null&&o.toLocal))for(let[ae,ee]of e.objects.entries()){let G=ee==null?void 0:ee.transform;if(!G||((B=G.position_mode)!=null?B:"static")!=="static")continue;let N=(Y=n.get)==null?void 0:Y.call(n,ae),be=((J=N==null?void 0:N.getDisplayObject)==null?void 0:J.call(N))||(N==null?void 0:N.pixiObject)||N;if(!be||be.parent!==o)continue;let jt=G.position_ratio!=null?Ot(u,g,G.position_ratio):_t(u,g,(te=G.anchor)!=null?te:"center"),Rt=o.toLocal(new vo(jt.x,jt.y)),zt=(se=G.position)!=null?se:{x:0,y:0},Fe=Rt.x+zt.x,Ni=Rt.y+zt.y;typeof(N==null?void 0:N.setPosition)=="function"?N.setPosition(Fe,Ni):(me(be,Fe,Ni),(Ee=N==null?void 0:N.transform)!=null&&Ee.position&&(N.transform.position.x=Fe,N.transform.position.y=Ni))}let T=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,M=((T==null?void 0:T.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(V.layout.debug_rect_visible&&M){(!re||re.parent!==p.stage)&&(re==null||re.destroy(),re=new bo,re.zIndex=9999,p.stage.addChild(re)),re.clear();let ae=V.layout.debug_rect_scale_x,ee=V.layout.debug_rect_scale_y,G=(u-4)*ae,_e=(g-4)*ee,N=(u-G)/2,be=(g-_e)/2;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:u,baseHeight:g,rectW:G,rectH:_e,offsetX:N,offsetY:be}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+N,y:2+be,width:G,height:_e})),re.rect(2+N,2+be,G,_e).stroke({width:V.layout.debug_rect_thickness,color:V.layout.debug_rect_color})}else re&&(re.destroy(),re=null);let P=(($=r.label)==null?void 0:$.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&P){let ae=(oe=(ne=P==null?void 0:P.transform)==null?void 0:ne.anchor)!=null?oe:"center",ee=(ue=P==null?void 0:P.transform)==null?void 0:ue.position_ratio,G=((le=P==null?void 0:P.transform)==null?void 0:le.offset)||{x:0,y:0};ta(l,u,g,{anchor:ae,positionRatio:ee,offset:{x:G.x*A,y:G.y*A},renderAnchor:ut(ae)})}if(l&&l.alpha>0){let ae=1+Math.sin(t*V.engine.label_pulse_speed)*V.engine.label_pulse_intensity,ee=(Se=(fe=P==null?void 0:P.transform)==null?void 0:fe.scale)!=null?Se:1,G=ae*A*ee;l.scale&&(typeof l.scale.set=="function"?l.scale.set(G):(l.scale.x=G,l.scale.y=G))}if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING ====="),c){s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(Ae=c.constructor)==null?void 0:Ae.name)),c.alpha=((Z=(U=b.background)==null?void 0:U.alpha)!=null?Z:.98)*V.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let ae=e.objects.get("background_1");s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",ae);let ee=(ae==null?void 0:ae.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ee);let G=ee.offset||{x:0,y:0},_e=((ie=(W=b.background)==null?void 0:W.offset_y)!=null?ie:0)+V.engine.background_offset_y,N=(Ie=ee.anchor)!=null?Ie:"center",be=ee.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:G,bgRuntimeOffsetY:_e,bgScreenAnchor:N,bgPositionRatio:be,baseWidth:u,baseHeight:g,finalScale:A}),ta(c,u,g,{anchor:N,positionRatio:be,offset:{x:G.x*A,y:G.y*A+_e},renderAnchor:ut(N)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(Ne=c.scale)==null?void 0:Ne.x,scaleY:(ia=c.scale)==null?void 0:ia.y,anchorX:(na=c.anchor)==null?void 0:na.x,anchorY:(aa=c.anchor)==null?void 0:aa.y,pivotX:(ra=c.pivot)==null?void 0:ra.x,pivotY:(sa=c.pivot)==null?void 0:sa.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 jt=Math.max(f/d.width,m/d.height),Rt=(la=(oa=b.background)==null?void 0:oa.scale_multiplier)!=null?la:1.05,zt=(ca=ee.scale)!=null?ca:1,Fe=jt*Rt*V.engine.background_scale*zt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Fe):(c.scale.x=Fe,c.scale.y=Fe))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-f/2,-m/2,f,m).fill({color:1444375}))}}function $o(r){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=r,s=((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=s.tutorial_delay_ms)!=null?c:1500)}export{qa as a,Kn as b,Mi as c,Pi as d,Ii as e,kt as f,eo as g,to as h,io as i,no as j,Dn as k,oo as l,De as m,Jn as n,Mt as o,Pt as p,lo as q,ho as r,mo as s,fo as t,Qn as u,ji as v,wo as w,ea as x,ut as y,_t as z,Ot as A,ta as B,Do as C,$o as D,Va as E,Ya as F,Zi as G,Xe as H,Jo as I,Ei as J,Pn as K,_r as L,On as M,Nd as N,Fd as O,Le as P,Ns as Q,Fs as R,Hn as S,xe as T,Te as U};
2419
+ `,e.appendChild(x);let S;try{S=d.loadAnimation({container:x,renderer:a.renderer||"svg",loop:(B=a.loop)!=null?B:!1,autoplay:(Y=a.autoplay)!=null?Y:!0,animationData:c})}catch(J){return x.parentNode&&x.parentNode.removeChild(x),console.warn(`[LottieOverlay] Failed to start animation: ${r}`,J),null}a.speed!==void 0&&S.setSpeed(a.speed);let A=()=>{S.destroy(),x.parentNode&&x.parentNode.removeChild(x)};return a.loop||S.addEventListener("complete",A),{animation:S,cleanup:A}}var Jn=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 Kn(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 kt(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 Mt=class{setContext(e){this.context=e}};var Pt=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 Qr from"pixi.js";var lo=Qr;typeof window!="undefined"&&(window.__basePixi=Qr);import{Sprite as co,Text as po,TextStyle as uo,Texture as es}from"pixi.js";var ts=r=>r*Math.PI/180;function go(r,e){var s,o,l,c,d;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(s=e.render)!=null&&s.tint&&(i=e.render.tint);let n=new uo({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 po({text:t.text,style:n});return a.label=r,a}function ho(r){var d,p,u,g,f,m,h,b,v,x;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:s}=r,o={},l={},c={};t.sortableChildren=!0;for(let[S,A]of i.objects.entries()){if(s!=null&&s.has(S)||a&&!a.has(S)||(A==null?void 0:A.enabled)===!1)continue;let P=(p=(d=A==null?void 0:A.render)==null?void 0:d.asset)==null?void 0:p.path,R=(g=(u=A==null?void 0:A.render)==null?void 0:u.asset)==null?void 0:g.type,k=!!(P&&R==="image"),j=!!((f=A==null?void 0:A.ui)!=null&&f.text),O=j?(m=A==null?void 0:A.ui)==null?void 0:m.renderMode:void 0,T;if(O==="png"&&k?T="png":O==="text"&&j?T="text":k?T="png":j?T="text":T="skip",T!=="skip"){if(T==="text"){let E=go(S,A);if(!E)continue;let L=A.render;E.alpha=typeof(L==null?void 0:L.alpha)=="number"?L.alpha:1,E.visible=(L==null?void 0:L.visible)!==!1,E.zIndex=typeof(L==null?void 0:L.z_index)=="number"?L.z_index:0,L!=null&&L.anchor&&typeof L.anchor.x=="number"&&typeof L.anchor.y=="number"?E.anchor.set(L.anchor.x,L.anchor.y):E.anchor.set(.5,.5);let y=A.transform,w=(y==null?void 0:y.position)||(y==null?void 0:y.offset);w&&E.position.set((h=w.x)!=null?h:0,(b=w.y)!=null?b:0);let C=typeof(y==null?void 0:y.scale)=="number"?y.scale:1;E.scale.set(C,C);let _=typeof(y==null?void 0:y.rotation)=="number"?y.rotation:0;E.rotation=ts(_),E.parent||t.addChild(E);try{n.create(S,E)}catch{}o[S]=E,c[S]=E}else if(T==="png"){let E=ve[S]||(typeof es!="undefined"?es.EMPTY:void 0),L=new co(E);L.label=S;let y=A.render;L.alpha=typeof(y==null?void 0:y.alpha)=="number"?y.alpha:1,L.visible=(y==null?void 0:y.visible)!==!1,L.zIndex=typeof(y==null?void 0:y.z_index)=="number"?y.z_index:0,y!=null&&y.anchor&&typeof y.anchor.x=="number"&&typeof y.anchor.y=="number"&&L.anchor.set(y.anchor.x,y.anchor.y);let w=A.transform,C=(w==null?void 0:w.position)||(w==null?void 0:w.offset);C&&L.position.set((v=C.x)!=null?v:0,(x=C.y)!=null?x:0);let _=typeof(w==null?void 0:w.scale)=="number"?w.scale:1;L.scale.set(_,_);let M=typeof(w==null?void 0:w.rotation)=="number"?w.rotation:0;L.rotation=ts(M),L.parent||t.addChild(L);try{n.create(S,L)}catch{}o[S]=L,l[S]=L}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var Zn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Pt}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 s=this.registry.get(a);if(!s){console.warn("[Assets] No config found for object:",a);return}try{let l=await De.create(a,s,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 De.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},is=new Zn,mo=new Proxy(is,{get(r,e){if(e in r&&typeof r[e]=="function")return r[e].bind(r);if(r.get(e))return r.get(e)}});function fo(r,e){is.init(r,e)}var Qn=class extends Mt{async init(){Bi(this.context.config,this.context.app),await ve.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};import{Graphics as bo,Point as vo}from"pixi.js";var Pe={width:400,height:600,designWidth:400,scaleFactor:1},_i={scale:1,position:1},Ri=[];function yo(r,e,t,i,n,a,s){Ri.push({element:r,originalScale:a,positionHelper:e,heightPercent:n}),e(r,t,i,n,a,s,!1)}function xo(){Ri.forEach(({element:r,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*Pe.scaleFactor;t(r,Pe.width,Pe.height,i,n,!0,!1)})}function wo(){Ri.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function ea(r,e){console.log(`[SCREEN] updateScreenState called: ${r}x${e}`),Pe.width=r,Pe.height=e,Pe.scaleFactor=Math.min(r/Pe.designWidth,1.15),_i.scale=Pe.scaleFactor,_i.position=1,console.log(`[SCREEN] Global multipliers - scale: ${_i.scale.toFixed(3)}`),xo()}var V={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 Eo(r,e,t){let i=V[r];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${r}.${e} = ${t}`))}function So(){return V}var Ao={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 Oi(r,e){return typeof r=="number"&&Number.isFinite(r)?r:e}function ut(r,e={x:.5,y:.5}){var t;if(Array.isArray(r))return{x:Oi(r[0],e.x),y:Oi(r[1],e.y)};if(r&&typeof r=="object"){let i=r;return{x:Oi(i.x,e.x),y:Oi(i.y,e.y)}}if(typeof r=="string"){let i=r.trim().toLowerCase();return(t=Ao[i])!=null?t:e}return e}function jt(r,e,t,i={}){var g,f,m,h,b,v;let n=ut(t),a=(g=i.inset)!=null?g:{},s=(f=i.padding)!=null?f:{x:0,y:0},o=((m=a.left)!=null?m:0)+s.x,l=((h=a.right)!=null?h:0)+s.x,c=((b=a.top)!=null?b:0)+s.y,d=((v=a.bottom)!=null?v:0)+s.y,p=Math.max(0,r-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function Ot(r,e,t,i={}){var m,h,b,v,x,S;let n=(m=i.inset)!=null?m:{},a=(h=i.padding)!=null?h:{x:0,y:0},s=((b=n.left)!=null?b:0)+a.x,o=((v=n.right)!=null?v:0)+a.x,l=((x=n.top)!=null?x:0)+a.y,c=((S=n.bottom)!=null?S:0)+a.y,d=Math.max(0,r-s-o),p=Math.max(0,e-l-c),u=ut(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:s+d*g,y:l+p*f}}function ta(r,e,t,i={}){var d,p,u;if(!r)return;let n=i.positionRatio?Ot(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):jt(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(d=i.offset)!=null?d:{x:0,y:0},s=n.x+a.x,o=n.y+a.y;r.anchor&&i.renderAnchor&&r.anchor.set(i.renderAnchor.x,i.renderAnchor.y),me(r,s,o);let l=(p=i.scale)!=null?p:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&we(r,l*c)}if(typeof window!="undefined"){let r=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==r||n!==e)&&(r=i,e=n,ea(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),ea(window.innerWidth,window.innerHeight),window.updateDebugConfig=Eo,window.getDebugConfig=So,window.copyConfig=Ro,window.applyConfig=It,window.applyConfigForRatio=zo,window.positionAtBottom=ns,window.positionAtTop=Lo,window.positionAtCenter=ko,window.positionAtLeft=Mo,window.positionAtRight=Po,window.positionAtBottomLeft=Io,window.positionAtBottomRight=jo,window.positionAtTopLeft=Oo,window.positionAtTopRight=_o,window.applyPositionContract=To,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 zi(r,e,t=0){return r*e+t}function Di(r,e,t=0){return r*(1-e)+t}function $i(r,e,t=0){return r*e+t}function Hi(r,e,t=0){return r*(1-e)+t}function pe(r,e=0){return r/2+e}function Co(r,e){return r*e}function To(r,e,t,i){var s,o,l,c,d,p,u,g,f,m,h,b,v,x,S,A,P,R,k,j;let n=0,a=0;switch(i.type){case"top":n=pe(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),a=zi(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=pe(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=Di(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=$i(e,i.percent,(m=(f=i.offset)==null?void 0:f.x)!=null?m:0),a=pe(t,(b=(h=i.offset)==null?void 0:h.y)!=null?b:0);break;case"right":n=Hi(e,i.percent,(x=(v=i.offset)==null?void 0:v.x)!=null?x:0),a=pe(t,(A=(S=i.offset)==null?void 0:S.y)!=null?A:0);break;case"center":n=pe(e,(R=(P=i.offset)==null?void 0:P.x)!=null?R:0),a=pe(t,(j=(k=i.offset)==null?void 0:k.y)!=null?j:0);break}r.position?r.position.set(n,a):(r.x=n,r.y=a),i.scale!==void 0&&i.scale!==1&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(i.scale,i.scale):(r.scale.x=i.scale,r.scale.y=i.scale))}function ns(r,e,t,i=.2,n=1,a=!0,s=!1){let o=Co(t,i),l=Di(t,i/2);me(r,pe(e),l);let c=a?n*Pe.scaleFactor:n;we(r,c),s&&!Ri.find(d=>d.element===r)&&yo(r,ns,e,t,i,n,a)}function Lo(r,e,t,i=.1,n=1){me(r,pe(e),zi(t,i)),we(r,n)}function ko(r,e,t,i=0,n=0,a=1){me(r,pe(e,i),pe(t,n)),we(r,a)}function Mo(r,e,t,i=.1,n=1){me(r,$i(e,i),pe(t)),we(r,n)}function Po(r,e,t,i=.1,n=1){me(r,Hi(e,i),pe(t)),we(r,n)}function Io(r,e,t,i=.05,n=.05,a=1){me(r,$i(e,n),Di(t,i)),we(r,a)}function jo(r,e,t,i=.05,n=.05,a=1){me(r,Hi(e,n),Di(t,i)),we(r,a)}function Oo(r,e,t,i=.05,n=.05,a=1){me(r,$i(e,n),zi(t,i)),we(r,a)}function _o(r,e,t,i=.05,n=.05,a=1){me(r,Hi(e,n),zi(t,i)),we(r,a)}function me(r,e,t){r&&r.position?typeof r.position.set=="function"?r.position.set(e,t):(r.position.x=e,r.position.y=t):r&&(r.x=e,r.y=t)}function we(r,e){e!==1&&r&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(e,e):r.scale.x!==void 0&&r.scale.y!==void 0&&(r.scale.x=e,r.scale.y=e))}var qe={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 Ro(r){return r&&qe[r]?JSON.parse(JSON.stringify(qe[r])):JSON.parse(JSON.stringify(V))}function It(r){Object.keys(r).forEach(e=>{let t=e;V[t]&&r[t]&&Object.assign(V[t],r[t])}),console.log("Config applied:",r)}function zo(r,e){let t=r/e;t>1.6?(It(qe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(It(qe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(It(qe.square),console.log("Applied SQUARE config for ratio:",t)):(It(qe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let r=window;r.configPresets=qe,r.resolveAnchorVec2=r.resolveAnchorVec2||ut,r.resolveScreenAnchorPoint=r.resolveScreenAnchorPoint||jt,r.resolveScreenRatioPoint=r.resolveScreenRatioPoint||Ot}var re=null;function Do(r,e,t,i,n,a={}){var _,M,I,D,F,H,B,Y,J,te,se,Ee,$,ne,oe,ue,le,fe,Se,Ae,U,Z,W,ie,Ie,Ne,ia,na,aa,ra,sa,oa,la,ca;let s=(_=a.enableDebugLogs)!=null?_:!1;s&&(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}=r;if(!p||!p.renderer){s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}s&&(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;s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:u,baseHeight:g});let f=u*V.layout.screen_scale_x,m=g*V.layout.screen_scale_y,h=u/2,b=e.engine.runtime||{},v=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:V.layout.screen_scale_x,screen_scale_y:V.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:f,height:m,midX:h}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",v));let x=v.design_width_portrait||400,S=f/x;S=Math.min(S,1.15);let A=S*((M=V.engine.scale)!=null?M:1),P=(I=a.skipMainContainerTransform)!=null?I:!1;!P&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(A):(o.scale.x=A,o.scale.y=A));let R=(D=v.main_container_anchor)!=null?D:"center",k=(F=v.main_container_position_ratio)!=null?F:{x:.5,y:.5},j=(H=v.main_container_offset)!=null?H:{x:0,y:0},O=v.main_container_position_ratio?Ot(u,g,k):jt(u,g,R),T=O.x+j.x+V.layout.position_offset.x,E=O.y+j.y+V.layout.position_offset.y;if(!P&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(T,E):(o.position.x=T,o.position.y=E)),n&&(o!=null&&o.toLocal))for(let[ae,ee]of e.objects.entries()){let G=ee==null?void 0:ee.transform;if(!G||((B=G.position_mode)!=null?B:"static")!=="static")continue;let N=(Y=n.get)==null?void 0:Y.call(n,ae),be=((J=N==null?void 0:N.getDisplayObject)==null?void 0:J.call(N))||(N==null?void 0:N.pixiObject)||N;if(!be||be.parent!==o)continue;let _t=G.position_ratio!=null?Ot(u,g,G.position_ratio):jt(u,g,(te=G.anchor)!=null?te:"center"),Rt=o.toLocal(new vo(_t.x,_t.y)),zt=(se=G.position)!=null?se:{x:0,y:0},Fe=Rt.x+zt.x,Ni=Rt.y+zt.y;typeof(N==null?void 0:N.setPosition)=="function"?N.setPosition(Fe,Ni):(me(be,Fe,Ni),(Ee=N==null?void 0:N.transform)!=null&&Ee.position&&(N.transform.position.x=Fe,N.transform.position.y=Ni))}let L=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,w=((L==null?void 0:L.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(V.layout.debug_rect_visible&&w){(!re||re.parent!==p.stage)&&(re==null||re.destroy(),re=new bo,re.zIndex=9999,p.stage.addChild(re)),re.clear();let ae=V.layout.debug_rect_scale_x,ee=V.layout.debug_rect_scale_y,G=(u-4)*ae,je=(g-4)*ee,N=(u-G)/2,be=(g-je)/2;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:u,baseHeight:g,rectW:G,rectH:je,offsetX:N,offsetY:be}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+N,y:2+be,width:G,height:je})),re.rect(2+N,2+be,G,je).stroke({width:V.layout.debug_rect_thickness,color:V.layout.debug_rect_color})}else re&&(re.destroy(),re=null);let C=(($=r.label)==null?void 0:$.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&C){let ae=(oe=(ne=C==null?void 0:C.transform)==null?void 0:ne.anchor)!=null?oe:"center",ee=(ue=C==null?void 0:C.transform)==null?void 0:ue.position_ratio,G=((le=C==null?void 0:C.transform)==null?void 0:le.offset)||{x:0,y:0};ta(l,u,g,{anchor:ae,positionRatio:ee,offset:{x:G.x*A,y:G.y*A},renderAnchor:ut(ae)})}if(l&&l.alpha>0){let ae=1+Math.sin(t*V.engine.label_pulse_speed)*V.engine.label_pulse_intensity,ee=(Se=(fe=C==null?void 0:C.transform)==null?void 0:fe.scale)!=null?Se:1,G=ae*A*ee;l.scale&&(typeof l.scale.set=="function"?l.scale.set(G):(l.scale.x=G,l.scale.y=G))}if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING ====="),c){s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(Ae=c.constructor)==null?void 0:Ae.name)),c.alpha=((Z=(U=b.background)==null?void 0:U.alpha)!=null?Z:.98)*V.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let ae=e.objects.get("background_1");s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",ae);let ee=(ae==null?void 0:ae.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ee);let G=ee.offset||{x:0,y:0},je=((ie=(W=b.background)==null?void 0:W.offset_y)!=null?ie:0)+V.engine.background_offset_y,N=(Ie=ee.anchor)!=null?Ie:"center",be=ee.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:G,bgRuntimeOffsetY:je,bgScreenAnchor:N,bgPositionRatio:be,baseWidth:u,baseHeight:g,finalScale:A}),ta(c,u,g,{anchor:N,positionRatio:be,offset:{x:G.x*A,y:G.y*A+je},renderAnchor:ut(N)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(Ne=c.scale)==null?void 0:Ne.x,scaleY:(ia=c.scale)==null?void 0:ia.y,anchorX:(na=c.anchor)==null?void 0:na.x,anchorY:(aa=c.anchor)==null?void 0:aa.y,pivotX:(ra=c.pivot)==null?void 0:ra.x,pivotY:(sa=c.pivot)==null?void 0:sa.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(f/d.width,m/d.height),Rt=(la=(oa=b.background)==null?void 0:oa.scale_multiplier)!=null?la:1.05,zt=(ca=ee.scale)!=null?ca:1,Fe=_t*Rt*V.engine.background_scale*zt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Fe):(c.scale.x=Fe,c.scale.y=Fe))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-f/2,-m/2,f,m).fill({color:1444375}))}}function $o(r){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=r,s=((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=s.tutorial_delay_ms)!=null?c:1500)}export{qa as a,Kn as b,Mi as c,Pi as d,Ii as e,kt as f,eo as g,to as h,io as i,no as j,Dn as k,oo as l,De as m,Jn as n,Mt as o,Pt as p,lo as q,ho as r,mo as s,fo as t,Qn as u,_i as v,wo as w,ea as x,ut as y,jt as z,Ot as A,ta as B,Do as C,$o as D,Va as E,Ya as F,Zi as G,Xe as H,Jo as I,Ei as J,Pn as K,jr as L,On as M,Nd as N,Fd as O,Le as P,Ns as Q,Fs as R,Hn as S,xe as T,Te as U};