handler-playable-sdk 1.0.106 → 1.0.107

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/{chunk-E7N5ZYZM.js → chunk-4B3VRDWT.js} +33 -33
  2. package/dist/cli/brand-dna.mjs +1 -1
  3. package/dist/cli/canva-import.mjs +1 -1
  4. package/dist/cli/cleanup-assets.mjs +1 -1
  5. package/dist/cli/fix-scales.mjs +1 -1
  6. package/dist/cli/index.js +1 -1
  7. package/dist/cli/screen-helper.mjs +1 -1
  8. package/dist/cli/setup-library.mjs +1 -1
  9. package/dist/cli/student-helper/add-logic.mjs +1 -1
  10. package/dist/cli/student-helper/add-object.mjs +1 -1
  11. package/dist/cli/student-helper/arg-parsing.mjs +1 -1
  12. package/dist/cli/student-helper/asset-registry.mjs +1 -1
  13. package/dist/cli/student-helper/bullet-system.mjs +1 -1
  14. package/dist/cli/student-helper/collectable-system.mjs +1 -1
  15. package/dist/cli/student-helper/constants.mjs +1 -1
  16. package/dist/cli/student-helper/drag-snap-couples.mjs +1 -1
  17. package/dist/cli/student-helper/endgame-screen.mjs +1 -1
  18. package/dist/cli/student-helper/fs-io.mjs +1 -1
  19. package/dist/cli/student-helper/logic-defaults.mjs +1 -1
  20. package/dist/cli/student-helper/print-help.mjs +1 -1
  21. package/dist/cli/student-helper/prompts.mjs +1 -1
  22. package/dist/cli/student-helper/scratch-card.mjs +1 -1
  23. package/dist/cli/student-helper/screen-utils.mjs +1 -1
  24. package/dist/cli/student-helper/snippets.mjs +1 -1
  25. package/dist/cli/student-helper/start-screen.mjs +1 -1
  26. package/dist/cli/student-helper/swerve-collect.mjs +1 -1
  27. package/dist/cli/student-helper/tap-destroy.mjs +1 -1
  28. package/dist/cli/student-helper/template-packs.mjs +1 -1
  29. package/dist/cli/student-helper.mjs +1 -1
  30. package/dist/cli/sync-screens.mjs +1 -1
  31. package/dist/cli/validate-assets.mjs +1 -1
  32. package/dist/cli/validate.mjs +1 -1
  33. package/dist/index.cjs +2 -2
  34. package/dist/index.js +1 -1
  35. package/dist/pixi/index.cjs +1 -1
  36. package/dist/pixi/index.js +1 -1
  37. package/dist/three/index.cjs +1 -1
  38. package/dist/three/index.js +1 -1
  39. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import{a as Xt,c as an,d as Te,e as sn}from"./chunk-I5OOVR5U.js";import{i as Qt}from"./chunk-EOKPQFKK.js";import{c as qe,d as Jt,e as Ze,g as Fa,h as rn,j as Ba,k as Ga,n as st,p as Zt,q as rt,r as Ua,s as on,t as qa}from"./chunk-2MR65LDX.js";import{a as Hr}from"./chunk-JXBG6UFL.js";import{Application as al}from"pixi.js";var Ve={};function ei(o,e,t=!1){Ve[o]||(Ve[o]=[]),Ve[o].push({fn:e,once:t})}function ln(o,e){if(Ve[o]){if(!e){delete Ve[o];return}Ve[o]=Ve[o].filter(t=>t.fn!==e)}}function ti(o,...e){let t=Ve[o];if(t)for(let i of[...t])i.fn(...e),i.once&&ln(o,i.fn)}function be(o,e){ei(o,e,!0)}var re=null,xe=[],ot=null;function Wa(o){re=o,xe=[],ot!==null&&(clearTimeout(ot),ot=null)}function Ka(){var o,e,t;return{endpoint:(re==null?void 0:re.endpoint)||"",transport:(re==null?void 0:re.transport)||"beacon",batchSize:(o=re==null?void 0:re.batchSize)!=null?o:10,flushIntervalMs:(e=re==null?void 0:re.flushIntervalMs)!=null?e:300,maxQueue:(t=re==null?void 0:re.maxQueue)!=null?t:200,debug:!!(re!=null&&re.debug)}}async function Va(o,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(o,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(o,{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 cn(o,e){let t=Ka();if(e&&t.endpoint){if(xe.push(o),xe.length>t.maxQueue&&(xe=xe.slice(xe.length-t.maxQueue)),xe.length>=t.batchSize){Ya();return}ot===null&&(ot=window.setTimeout(()=>{ot=null,Ya()},t.flushIntervalMs))}}async function Ya(){let o=Ka();if(!o.endpoint||xe.length===0)return;let e=xe.splice(0,o.batchSize);await Va(o.endpoint,{events:e},o.transport,o.debug),xe.length>0&&await Va(o.endpoint,{events:xe.splice(0,o.batchSize)},o.transport,o.debug)}function Xa(o){return Math.max(0,Math.min(1,o))}function Nr(o){let e=String(o!=null?o:"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 Pt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Fr(o,e){let t=o==null?void 0:o[e];return typeof t=="number"?t:0}function Ja(o,e,t){try{o[e]=t}catch{}}function Br(o){let e=o==null?void 0:o.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 Za(o,e){let t=o==null?void 0:o.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 Qa(o,e){let t=Br(o);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 es(){let o=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,r(),o.size>0&&i()})},n=d=>{var u;o.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{o.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))},r=()=>{var p,u;let d=Pt();for(let g of Array.from(o)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let m=g.durationMs>0?h/g.durationMs:1,f=Xa(m),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(m),b-1):0;if(g.repeat>0&&m>=1){let T=m-y;f=Xa(T)}let w=g.ease(f);g.yoyo&&y%2===1&&(w=1-w);for(let T of g.props)Ja(g.target,T.key,T.from+(T.to-T.from)*w);g.scaleFrom&&g.scaleTo&&Za(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*w,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*w});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(m>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var T;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((T=u==null?void 0:u.delayMsOverride)!=null?T:0)),m=Nr(p.ease),f=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),w=[];for(let P of Object.keys(p)){if(y.has(P))continue;let _=p[P];typeof _=="number"&&w.push({key:P,from:Fr(d,P),to:_})}let v=Qa(d,p);return{target:d,startMs:Pt(),delayMs:h,durationMs:g,ease:m,props:w,scaleFrom:v.from,scaleTo:v.to,repeat:f,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=Pt())},resume:()=>{var m;if(!u.paused)return;let g=(m=u.pauseAtMs)!=null?m:Pt(),h=Pt()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&Ja(d,g,h)}let u=Qa(d,p);u.to&&Za(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,h=[],m=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let w=typeof y=="string"?y.trim():"";return w.startsWith("+=")?u+Math.max(0,Number(w.slice(2))*1e3||0):w?Math.max(0,Number(w)*1e3||0):u},f=y=>{p.push(y);let w=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+w)},b={to(y,w,v){return f({kind:"to",target:y,vars:w,atMs:m(v)}),b},fromTo(y,w,v,T){return f({kind:"fromTo",target:y,vars:v,from:w,atMs:m(T)}),b},play(){var y,w;if(g)return b;g=!0,h=[];for(let v of p)v.kind==="fromTo"&&c.set(v.target,(y=v.from)!=null?y:{}),h.push(c.to(v.target,{...v.vars,delay:v.atMs/1e3+((w=v.vars.delay)!=null?w:0)}));return b},pause(){for(let y of h)y.pause();return b},kill(){for(let y of h)y.kill();h=[],g=!1}};return d.paused||b.play(),b}};return c}function ts(){if(typeof window=="undefined")return;let o=window;if(!o.gsap)try{o.gsap=es()}catch{}}var is={name:"handler-playable-sdk",version:"1.0.106",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 --external jszip && 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/ && mkdir -p dist/cli/student-helper && cp src/cli/student-helper/*.mjs dist/cli/student-helper/ && chmod +x dist/cli/*.mjs dist/cli/student-helper/*.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 --external jszip && 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 dist/cli/student-helper/*.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 ye=0,Ur=ye++,ns=ye++,as=ye++,ss=ye++,rs=ye++,os=ye++,ls=ye++,cs=ye++,ds=ye++,ps=ye++,us=ye++,gs=ye++,ne=Ur;function hs(){return ne===ns}function ms(){return ne===as}function fs(){return ne===ss}function bs(){return ne===rs}function lt(){return ne===os}function ct(){return ne===ls}function ys(){return ne===cs}function vs(){return ne===ds}function ws(){return ne===ps}function dn(){return ne===us}function pn(){return ne===gs}function xs(){let o=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(o==="mraid")try{mraid.getState(),ne=ns;return}catch{}else if(o==="dapi")try{dapi.isReady(),ne=as;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(ne=ss)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(ne=rs)}catch{}else if(e==="mintegral")window.gameReady&&(ne=os);else if(e==="tapjoy")window.TJ_API&&(ne=ls);else if(e==="tiktok")window.openAppStore&&(ne=cs);else if(e==="smadex")try{window.smxTracking&&(ne=ds)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(ne=ps)}catch{}else e==="vungle"?ne=us:(o==="nucleo"||e==="nucleo")&&(ne=gs)}import un from"lottie-web";var Ss=un;typeof window!="undefined"&&(window.lottie=un,window.__baseLottie=un);function oe(o,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(o,e);return`${o/i}:${e/i}`}var jl=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:oe(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:oe(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:oe(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:oe(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:oe(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:oe(360,780)}],_l=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:oe(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:oe(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:oe(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:oe(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:oe(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:oe(412,915)}],Rl=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:oe(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:oe(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:oe(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:oe(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:oe(800,1280)}],gn=[{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:oe(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:oe(768,1024),mraidScale:.7}];var Es=[...gn],As=[{category:"playable",label:"Playable Ad",devices:gn}],hn=gn[0];function dt(o){return Es.find(e=>e.id===o)||hn}function Ol(o){return Es.filter(e=>e.category===o)}var Pe=class{async updateProperty(e,t,i,n={}){var l,c,d,p,u,g,h,m,f,b,y,w;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}if(qe({objectId:e,path:t,value:i},{persist:!0}),t==="transform"||t.startsWith("transform.")){console.log("[DEBUG FALLBACK] PropertyUpdateManager SKIP applyEditableObjectConfig (transform path)",t,e);let v=s==null?void 0:s.motion;if(v&&typeof v=="object"&&v.enabled!==!1&&(((p=v==null?void 0:v.intro)==null?void 0:p.enabled)===!0||((u=v==null?void 0:v.pulse)==null?void 0:u.enabled)===!0||((g=v==null?void 0:v.swing)==null?void 0:g.enabled)===!0||((h=v==null?void 0:v.continuousMove)==null?void 0:h.enabled)===!0||((m=v==null?void 0:v.continuousRotate)==null?void 0:m.enabled)===!0||((f=v==null?void 0:v.orbit)==null?void 0:f.enabled)===!0)){let _=window.applyEditableObjectConfig;if(typeof _=="function"){let I=window.__editableConfig,j=(w=(y=(b=I==null?void 0:I.objects)==null?void 0:b.get)==null?void 0:y.call(b,e))!=null?w:s;await _(e,j),console.log("[PropertyUpdateManager] Applied config for motion object")}}n.refreshInspector||requestAnimationFrame(()=>{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e}}))})}else{let v=window.applyEditableObjectConfig;if(typeof v=="function"){let T=window.__editableConfig,P=(d=(c=(l=T==null?void 0:T.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:s;await v(e,P),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 mn(o){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()=>{var g,h,m,f;let s=n.result;if(!s||typeof s!="string"){alert("Failed to read file: Invalid data URL"),console.error("[QuickActionsBar] Invalid data URL:",typeof s,s==null?void 0:s.substring(0,50));return}if(!s.startsWith("data:image/")){alert("Invalid file format: Not an image file"),console.error("[QuickActionsBar] Invalid data URL format:",s.substring(0,100));return}let r=s.match(/^data:image\/[^;]+;base64,(.+)$/);if(!r||!r[1]||r[1].length===0){alert("Failed to read file: Invalid base64 data"),console.error("[QuickActionsBar] Invalid base64 data in data URL");return}try{let b=r[1],y=atob(b.substring(0,Math.min(100,b.length)));if(!y||y.length===0)throw new Error("Base64 decode test failed");console.log("[QuickActionsBar] \u2705 Data URL validated, length:",s.length)}catch(b){alert("Failed to read file: Corrupted image data"),console.error("[QuickActionsBar] Base64 validation failed:",b);return}let l=o.category||"misc",c=(o.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),d=((g=i.name.toLowerCase().match(/\.(png|jpg|jpeg|gif|webp)$/))==null?void 0:g[1])||"png",p=d==="jpg"?"jpeg":d,u=`${c||"new_asset"}_uploaded_${Date.now()}.${p}`;console.log("[QuickActionsBar] Uploading file:",u,"to category:",l,"data URL length:",s.length);try{let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:u,data:s,overwrite:!0})})).json();if(!(y!=null&&y.success)){alert(`Upload failed: ${(y==null?void 0:y.error)||"Unknown error"}`);return}await new Promise(S=>setTimeout(S,100));let w=window.addAssetToRegistry;typeof w=="function"&&(w(l,u),console.log("[QuickActionsBar] \u2705 Added to registry:",l,u));let v=window.getEditableAssets;if(typeof v=="function"){let S=v();S&&!S.categories&&(S.categories=[]),S!=null&&S.categories&&!S.categories.includes(l)&&(S.categories.push(l),console.log(`[QuickActionsBar] Added category ${l} to registry`))}let T=!1,P=0,_=10;for(;!T&&P<_;){P++,console.log(`[QuickActionsBar] Refresh attempt ${P}/${_}...`);try{(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok&&console.log("[QuickActionsBar] \u2705 Registry rebuilt from disk")}catch{}await new Promise(A=>setTimeout(A,300));let S=window.refreshAssetLibrary;typeof S=="function"&&(console.log("[QuickActionsBar] Refreshing library panel..."),await S());let x=window.reRenderAssetLibrary;typeof x=="function"&&(console.log("[QuickActionsBar] Re-rendering library panel..."),x());let E=window.getEditableAssets;if(typeof E=="function"){let A=E(),C=((h=A==null?void 0:A.libraryAssets)==null?void 0:h[l])||[];C.some(R=>(R==null?void 0:R.filename)===u)?(console.log("[QuickActionsBar] \u2705 Asset found in registry!"),T=!0):(console.log(`[QuickActionsBar] Asset not found yet, retrying... (found ${C.length} assets in ${l})`),await new Promise(R=>setTimeout(R,500)))}else P>=2&&(T=!0)}T||console.warn("[QuickActionsBar] \u26A0\uFE0F Asset not found in registry after retries, proceeding anyway..."),setTimeout(()=>{try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),console.log("[QuickActionsBar] Dispatched config:changed event")}catch(S){console.warn("[QuickActionsBar] Failed to refresh textures:",S)}},300),console.log("[QuickActionsBar] Applying asset to object:",y.path);let I=!1,j=0,L=5;for(;!I&&j<L;){j++;try{await o.onApply(y.path),await new Promise(x=>setTimeout(x,200));let S=window.getEditableObjectConfig;if(typeof S=="function"){let x=S(o.objectId),E=((f=(m=x==null?void 0:x.render)==null?void 0:m.asset)==null?void 0:f.path)||"";E===y.path||E.includes(u)?(console.log("[QuickActionsBar] \u2705 Asset confirmed applied to object"),I=!0):(console.log(`[QuickActionsBar] Asset not applied yet (attempt ${j}), retrying...`),await new Promise(A=>setTimeout(A,300)))}else I=!0}catch(S){console.error(`[QuickActionsBar] Apply attempt ${j} failed:`,S),j<L&&await new Promise(x=>setTimeout(x,500))}}I?console.log("[QuickActionsBar] \u2705 Asset upload and apply complete!"):console.warn("[QuickActionsBar] \u26A0\uFE0F Asset may not have been applied, but upload succeeded")}catch(b){console.error("[QuickActionsBar] Upload error:",b),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var ii=class{constructor(){this.updateManager=new Pe}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 r=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";r&&(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 r,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=((r=t.identity)==null?void 0:r.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,r=s==null?void 0:s(e),l=(a=r==null?void 0:r.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");mn({objectId:e,category:a,onApply:async r=>{var g,h;console.log("[QuickActionsBar] Upload complete, applying asset:",r);let l=window.applyAssetToSlot,c=this.getFilenameFromPath(r),d=/render\.asset\.path/i.test(t)||/\.(png|jpg|jpeg|gif|webp)$/i.test(r);if(typeof l=="function"&&c&&d){console.log("[QuickActionsBar] Applying asset to slot:",e,c,a);try{await l(e,c,a),console.log("[QuickActionsBar] \u2705 Asset applied to slot")}catch(m){console.error("[QuickActionsBar] Failed to apply asset to slot:",m)}}console.log("[QuickActionsBar] Updating property:",e,t,r);try{await this.updateManager.updateProperty(e,t,r),console.log("[QuickActionsBar] \u2705 Property updated")}catch(m){console.error("[QuickActionsBar] Failed to update property:",m)}let p=window.__debugContext;(h=(g=p==null?void 0:p.options)==null?void 0:g.onPropertyChange)==null||h.call(g,e,t,r);let u=window.__highlightLibrarySlot;typeof u=="function"&&setTimeout(()=>{u(e,a)},1e3),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e,action:"update",path:t}})),console.log("[QuickActionsBar] \u2705 Upload and apply complete")}})}getFilenameFromPath(e){if(!e)return"";let t=e.split("?")[0].replace(/\\/g,"/");return t.split("/").pop()||t}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 r=null;if(s.schemas instanceof Map?r=s.schemas.get(n):typeof s.schemas=="object"&&(r=s.schemas[n]),!(r!=null&&r.defaults))return;let l=r.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.`,r="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",r),n(e,s,"",{objectId:e,path:r});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 qr=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],Vr=["environment","ui","character","system","backgrounds"],Yr=["bg","world","ui"],Cs={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}}},ni=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{a as Xt,c as an,d as Te,e as sn}from"./chunk-I5OOVR5U.js";import{i as Qt}from"./chunk-EOKPQFKK.js";import{c as qe,d as Jt,e as Ze,g as Fa,h as rn,j as Ba,k as Ga,n as st,p as Zt,q as rt,r as Ua,s as on,t as qa}from"./chunk-2MR65LDX.js";import{a as Hr}from"./chunk-JXBG6UFL.js";import{Application as al}from"pixi.js";var Ve={};function ei(o,e,t=!1){Ve[o]||(Ve[o]=[]),Ve[o].push({fn:e,once:t})}function ln(o,e){if(Ve[o]){if(!e){delete Ve[o];return}Ve[o]=Ve[o].filter(t=>t.fn!==e)}}function ti(o,...e){let t=Ve[o];if(t)for(let i of[...t])i.fn(...e),i.once&&ln(o,i.fn)}function be(o,e){ei(o,e,!0)}var re=null,xe=[],ot=null;function Wa(o){re=o,xe=[],ot!==null&&(clearTimeout(ot),ot=null)}function Ka(){var o,e,t;return{endpoint:(re==null?void 0:re.endpoint)||"",transport:(re==null?void 0:re.transport)||"beacon",batchSize:(o=re==null?void 0:re.batchSize)!=null?o:10,flushIntervalMs:(e=re==null?void 0:re.flushIntervalMs)!=null?e:300,maxQueue:(t=re==null?void 0:re.maxQueue)!=null?t:200,debug:!!(re!=null&&re.debug)}}async function Va(o,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(o,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(o,{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 cn(o,e){let t=Ka();if(e&&t.endpoint){if(xe.push(o),xe.length>t.maxQueue&&(xe=xe.slice(xe.length-t.maxQueue)),xe.length>=t.batchSize){Ya();return}ot===null&&(ot=window.setTimeout(()=>{ot=null,Ya()},t.flushIntervalMs))}}async function Ya(){let o=Ka();if(!o.endpoint||xe.length===0)return;let e=xe.splice(0,o.batchSize);await Va(o.endpoint,{events:e},o.transport,o.debug),xe.length>0&&await Va(o.endpoint,{events:xe.splice(0,o.batchSize)},o.transport,o.debug)}function Xa(o){return Math.max(0,Math.min(1,o))}function Nr(o){let e=String(o!=null?o:"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 Pt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Fr(o,e){let t=o==null?void 0:o[e];return typeof t=="number"?t:0}function Ja(o,e,t){try{o[e]=t}catch{}}function Br(o){let e=o==null?void 0:o.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 Za(o,e){let t=o==null?void 0:o.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 Qa(o,e){let t=Br(o);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 es(){let o=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,r(),o.size>0&&i()})},n=d=>{var u;o.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{o.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))},r=()=>{var p,u;let d=Pt();for(let g of Array.from(o)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let m=g.durationMs>0?h/g.durationMs:1,f=Xa(m),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(m),b-1):0;if(g.repeat>0&&m>=1){let T=m-y;f=Xa(T)}let w=g.ease(f);g.yoyo&&y%2===1&&(w=1-w);for(let T of g.props)Ja(g.target,T.key,T.from+(T.to-T.from)*w);g.scaleFrom&&g.scaleTo&&Za(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*w,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*w});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(m>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var T;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((T=u==null?void 0:u.delayMsOverride)!=null?T:0)),m=Nr(p.ease),f=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),w=[];for(let P of Object.keys(p)){if(y.has(P))continue;let _=p[P];typeof _=="number"&&w.push({key:P,from:Fr(d,P),to:_})}let v=Qa(d,p);return{target:d,startMs:Pt(),delayMs:h,durationMs:g,ease:m,props:w,scaleFrom:v.from,scaleTo:v.to,repeat:f,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=Pt())},resume:()=>{var m;if(!u.paused)return;let g=(m=u.pauseAtMs)!=null?m:Pt(),h=Pt()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&Ja(d,g,h)}let u=Qa(d,p);u.to&&Za(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,h=[],m=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let w=typeof y=="string"?y.trim():"";return w.startsWith("+=")?u+Math.max(0,Number(w.slice(2))*1e3||0):w?Math.max(0,Number(w)*1e3||0):u},f=y=>{p.push(y);let w=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+w)},b={to(y,w,v){return f({kind:"to",target:y,vars:w,atMs:m(v)}),b},fromTo(y,w,v,T){return f({kind:"fromTo",target:y,vars:v,from:w,atMs:m(T)}),b},play(){var y,w;if(g)return b;g=!0,h=[];for(let v of p)v.kind==="fromTo"&&c.set(v.target,(y=v.from)!=null?y:{}),h.push(c.to(v.target,{...v.vars,delay:v.atMs/1e3+((w=v.vars.delay)!=null?w:0)}));return b},pause(){for(let y of h)y.pause();return b},kill(){for(let y of h)y.kill();h=[],g=!1}};return d.paused||b.play(),b}};return c}function ts(){if(typeof window=="undefined")return;let o=window;if(!o.gsap)try{o.gsap=es()}catch{}}var is={name:"handler-playable-sdk",version:"1.0.107",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 --external jszip && 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/ && mkdir -p dist/cli/student-helper && cp src/cli/student-helper/*.mjs dist/cli/student-helper/ && chmod +x dist/cli/*.mjs dist/cli/student-helper/*.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 --external jszip && 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 dist/cli/student-helper/*.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 ye=0,Ur=ye++,ns=ye++,as=ye++,ss=ye++,rs=ye++,os=ye++,ls=ye++,cs=ye++,ds=ye++,ps=ye++,us=ye++,gs=ye++,ne=Ur;function hs(){return ne===ns}function ms(){return ne===as}function fs(){return ne===ss}function bs(){return ne===rs}function lt(){return ne===os}function ct(){return ne===ls}function ys(){return ne===cs}function vs(){return ne===ds}function ws(){return ne===ps}function dn(){return ne===us}function pn(){return ne===gs}function xs(){let o=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(o==="mraid")try{mraid.getState(),ne=ns;return}catch{}else if(o==="dapi")try{dapi.isReady(),ne=as;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(ne=ss)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(ne=rs)}catch{}else if(e==="mintegral")window.gameReady&&(ne=os);else if(e==="tapjoy")window.TJ_API&&(ne=ls);else if(e==="tiktok")window.openAppStore&&(ne=cs);else if(e==="smadex")try{window.smxTracking&&(ne=ds)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(ne=ps)}catch{}else e==="vungle"?ne=us:(o==="nucleo"||e==="nucleo")&&(ne=gs)}import un from"lottie-web";var Ss=un;typeof window!="undefined"&&(window.lottie=un,window.__baseLottie=un);function oe(o,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(o,e);return`${o/i}:${e/i}`}var jl=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:oe(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:oe(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:oe(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:oe(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:oe(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:oe(360,780)}],_l=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:oe(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:oe(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:oe(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:oe(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:oe(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:oe(412,915)}],Rl=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:oe(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:oe(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:oe(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:oe(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:oe(800,1280)}],gn=[{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:oe(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:oe(768,1024),mraidScale:.7}];var Es=[...gn],Cs=[{category:"playable",label:"Playable Ad",devices:gn}],hn=gn[0];function dt(o){return Es.find(e=>e.id===o)||hn}function Ol(o){return Es.filter(e=>e.category===o)}var Pe=class{async updateProperty(e,t,i,n={}){var l,c,d,p,u,g,h,m,f,b,y,w;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}if(qe({objectId:e,path:t,value:i},{persist:!0}),t==="transform"||t.startsWith("transform.")){console.log("[DEBUG FALLBACK] PropertyUpdateManager SKIP applyEditableObjectConfig (transform path)",t,e);let v=s==null?void 0:s.motion;if(v&&typeof v=="object"&&v.enabled!==!1&&(((p=v==null?void 0:v.intro)==null?void 0:p.enabled)===!0||((u=v==null?void 0:v.pulse)==null?void 0:u.enabled)===!0||((g=v==null?void 0:v.swing)==null?void 0:g.enabled)===!0||((h=v==null?void 0:v.continuousMove)==null?void 0:h.enabled)===!0||((m=v==null?void 0:v.continuousRotate)==null?void 0:m.enabled)===!0||((f=v==null?void 0:v.orbit)==null?void 0:f.enabled)===!0)){let _=window.applyEditableObjectConfig;if(typeof _=="function"){let I=window.__editableConfig,j=(w=(y=(b=I==null?void 0:I.objects)==null?void 0:b.get)==null?void 0:y.call(b,e))!=null?w:s;await _(e,j),console.log("[PropertyUpdateManager] Applied config for motion object")}}n.refreshInspector||requestAnimationFrame(()=>{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e}}))})}else{let v=window.applyEditableObjectConfig;if(typeof v=="function"){let T=window.__editableConfig,P=(d=(c=(l=T==null?void 0:T.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:s;await v(e,P),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 mn(o){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()=>{var g,h,m,f;let s=n.result;if(!s||typeof s!="string"){alert("Failed to read file: Invalid data URL"),console.error("[QuickActionsBar] Invalid data URL:",typeof s,s==null?void 0:s.substring(0,50));return}if(!s.startsWith("data:image/")){alert("Invalid file format: Not an image file"),console.error("[QuickActionsBar] Invalid data URL format:",s.substring(0,100));return}let r=s.match(/^data:image\/[^;]+;base64,(.+)$/);if(!r||!r[1]||r[1].length===0){alert("Failed to read file: Invalid base64 data"),console.error("[QuickActionsBar] Invalid base64 data in data URL");return}try{let b=r[1],y=atob(b.substring(0,Math.min(100,b.length)));if(!y||y.length===0)throw new Error("Base64 decode test failed");console.log("[QuickActionsBar] \u2705 Data URL validated, length:",s.length)}catch(b){alert("Failed to read file: Corrupted image data"),console.error("[QuickActionsBar] Base64 validation failed:",b);return}let l=o.category||"misc",c=(o.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),d=((g=i.name.toLowerCase().match(/\.(png|jpg|jpeg|gif|webp)$/))==null?void 0:g[1])||"png",p=d==="jpg"?"jpeg":d,u=`${c||"new_asset"}_uploaded_${Date.now()}.${p}`;console.log("[QuickActionsBar] Uploading file:",u,"to category:",l,"data URL length:",s.length);try{let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:u,data:s,overwrite:!0})})).json();if(!(y!=null&&y.success)){alert(`Upload failed: ${(y==null?void 0:y.error)||"Unknown error"}`);return}await new Promise(S=>setTimeout(S,100));let w=window.addAssetToRegistry;typeof w=="function"&&(w(l,u),console.log("[QuickActionsBar] \u2705 Added to registry:",l,u));let v=window.getEditableAssets;if(typeof v=="function"){let S=v();S&&!S.categories&&(S.categories=[]),S!=null&&S.categories&&!S.categories.includes(l)&&(S.categories.push(l),console.log(`[QuickActionsBar] Added category ${l} to registry`))}let T=!1,P=0,_=10;for(;!T&&P<_;){P++,console.log(`[QuickActionsBar] Refresh attempt ${P}/${_}...`);try{(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok&&console.log("[QuickActionsBar] \u2705 Registry rebuilt from disk")}catch{}await new Promise(C=>setTimeout(C,300));let S=window.refreshAssetLibrary;typeof S=="function"&&(console.log("[QuickActionsBar] Refreshing library panel..."),await S());let x=window.reRenderAssetLibrary;typeof x=="function"&&(console.log("[QuickActionsBar] Re-rendering library panel..."),x());let E=window.getEditableAssets;if(typeof E=="function"){let C=E(),A=((h=C==null?void 0:C.libraryAssets)==null?void 0:h[l])||[];A.some(R=>(R==null?void 0:R.filename)===u)?(console.log("[QuickActionsBar] \u2705 Asset found in registry!"),T=!0):(console.log(`[QuickActionsBar] Asset not found yet, retrying... (found ${A.length} assets in ${l})`),await new Promise(R=>setTimeout(R,500)))}else P>=2&&(T=!0)}T||console.warn("[QuickActionsBar] \u26A0\uFE0F Asset not found in registry after retries, proceeding anyway..."),setTimeout(()=>{try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),console.log("[QuickActionsBar] Dispatched config:changed event")}catch(S){console.warn("[QuickActionsBar] Failed to refresh textures:",S)}},300),console.log("[QuickActionsBar] Applying asset to object:",y.path);let I=!1,j=0,L=5;for(;!I&&j<L;){j++;try{await o.onApply(y.path),await new Promise(x=>setTimeout(x,200));let S=window.getEditableObjectConfig;if(typeof S=="function"){let x=S(o.objectId),E=((f=(m=x==null?void 0:x.render)==null?void 0:m.asset)==null?void 0:f.path)||"";E===y.path||E.includes(u)?(console.log("[QuickActionsBar] \u2705 Asset confirmed applied to object"),I=!0):(console.log(`[QuickActionsBar] Asset not applied yet (attempt ${j}), retrying...`),await new Promise(C=>setTimeout(C,300)))}else I=!0}catch(S){console.error(`[QuickActionsBar] Apply attempt ${j} failed:`,S),j<L&&await new Promise(x=>setTimeout(x,500))}}I?console.log("[QuickActionsBar] \u2705 Asset upload and apply complete!"):console.warn("[QuickActionsBar] \u26A0\uFE0F Asset may not have been applied, but upload succeeded")}catch(b){console.error("[QuickActionsBar] Upload error:",b),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var ii=class{constructor(){this.updateManager=new Pe}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 r=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";r&&(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 r,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=((r=t.identity)==null?void 0:r.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,r=s==null?void 0:s(e),l=(a=r==null?void 0:r.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");mn({objectId:e,category:a,onApply:async r=>{var g,h;console.log("[QuickActionsBar] Upload complete, applying asset:",r);let l=window.applyAssetToSlot,c=this.getFilenameFromPath(r),d=/render\.asset\.path/i.test(t)||/\.(png|jpg|jpeg|gif|webp)$/i.test(r);if(typeof l=="function"&&c&&d){console.log("[QuickActionsBar] Applying asset to slot:",e,c,a);try{await l(e,c,a),console.log("[QuickActionsBar] \u2705 Asset applied to slot")}catch(m){console.error("[QuickActionsBar] Failed to apply asset to slot:",m)}}console.log("[QuickActionsBar] Updating property:",e,t,r);try{await this.updateManager.updateProperty(e,t,r),console.log("[QuickActionsBar] \u2705 Property updated")}catch(m){console.error("[QuickActionsBar] Failed to update property:",m)}let p=window.__debugContext;(h=(g=p==null?void 0:p.options)==null?void 0:g.onPropertyChange)==null||h.call(g,e,t,r);let u=window.__highlightLibrarySlot;typeof u=="function"&&setTimeout(()=>{u(e,a)},1e3),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e,action:"update",path:t}})),console.log("[QuickActionsBar] \u2705 Upload and apply complete")}})}getFilenameFromPath(e){if(!e)return"";let t=e.split("?")[0].replace(/\\/g,"/");return t.split("/").pop()||t}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 r=null;if(s.schemas instanceof Map?r=s.schemas.get(n):typeof s.schemas=="object"&&(r=s.schemas[n]),!(r!=null&&r.defaults))return;let l=r.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.`,r="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",r),n(e,s,"",{objectId:e,path:r});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 qr=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],Vr=["environment","ui","character","system","backgrounds"],Yr=["bg","world","ui"],As={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}}},ni=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">
@@ -225,7 +225,7 @@ import{a as Xt,c as an,d as Te,e as sn}from"./chunk-I5OOVR5U.js";import{i as Qt}
225
225
  <label class="wizard-label">Logic Component</label>
226
226
  <select class="wizard-select" data-field="logicId">
227
227
  <option value="">None</option>
228
- ${Object.keys(Cs).map(e=>`<option value="${e}">${e}</option>`).join("")}
228
+ ${Object.keys(As).map(e=>`<option value="${e}">${e}</option>`).join("")}
229
229
  </select>
230
230
  </div>
231
231
  <div class="wizard-field-group">
@@ -252,7 +252,7 @@ import{a as Xt,c as an,d as Te,e as sn}from"./chunk-I5OOVR5U.js";import{i as Qt}
252
252
  <div class="wizard-type-icon">${t}</div>
253
253
  <div class="wizard-type-name">${i}</div>
254
254
  </button>
255
- `}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var a;let i=t.target,n=i.dataset.action||((a=i.closest("[data-action]"))==null?void 0:a.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let a=n.dataset.assetAction;a&&(t.preventDefault(),this.handleAssetAction(a))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let a=n.dataset.objectType;a&&this.setObjectType(a)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";mn({objectId:e,category:t,onApply:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}})}openAiPicker(){if(!this.state)return;this.setAssetPickerHint('Generate and click "Save to Library" to use it here.'),window.__wizardAssetPicker={onPick:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__openAiEditor;if(typeof e!="function"){alert("AI Editor is not available.");return}let t=this.state.displayName||this.state.instanceId||"new asset";e(this.state.instanceId||"new_asset",`Create an image for ${t}`,"",{})}setAssetPickerHint(e){if(!this.modal)return;let t=this.modal.querySelector("[data-asset-picker-hint]");if(t){if(!e){t.style.display="none",t.textContent="";return}t.textContent=e,t.style.display="block"}}handleFieldChange(e){if(!this.state)return;let t=e.dataset.field;if(t){if(e instanceof HTMLInputElement&&e.type==="checkbox")this.state[t]=e.checked;else if(e instanceof HTMLInputElement&&e.type==="number"){let i=e.value===""?0:Number(e.value);this.state[t]=Number.isNaN(i)?0:i}else this.state[t]=e.value;t==="anchorPreset"&&this.applyAnchorPreset(this.state.anchorPreset),t==="logicId"&&this.applyLogicDefaults(this.state.logicId),this.updateStepUI()}}setObjectType(e){this.state&&(this.state.objectType=e,this.state.scale=e==="sprite"||e==="ui-image"?.2:1,(e==="ui-text"||e==="ui-image")&&(this.state.category="ui",this.state.layer="ui"),this.updateStepUI())}applyAnchorPreset(e){if(!this.state)return;let t={"top-left":[0,0],"top-center":[.5,0],"top-right":[1,0],"left-center":[0,.5],center:[.5,.5],"right-center":[1,.5],"bottom-left":[0,1],"bottom-center":[.5,1],"bottom-right":[1,1]};if(e!=="custom"&&t[e]){let[i,n]=t[e];this.state.anchorX=i,this.state.anchorY=n}}applyLogicDefaults(e){if(!this.state)return;if(!e){this.state.logicPropsRaw="";return}let t=Cs[e];t&&(this.state.logicPropsRaw=JSON.stringify(t,null,2))}goToStep(e){if(!this.state)return;let t=Math.max(1,Math.min(6,e));this.state.step=t,this.updateStepUI()}updateStepUI(){if(!this.modal||!this.state)return;Array.from(this.modal.querySelectorAll(".wizard-step")).forEach(t=>{let i=Number(t.dataset.step||"0");t.classList.toggle("active",i===this.state.step)}),this.updateProgressDots(),this.updateTypeSections(),this.syncFieldValues(),this.updatePreview(),this.updateActionButtons()}updateProgressDots(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-wizard-progress]");if(!e)return;let t=Array.from({length:6},(i,n)=>{let a=n+1;return`
255
+ `}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var a;let i=t.target,n=i.dataset.action||((a=i.closest("[data-action]"))==null?void 0:a.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let a=n.dataset.assetAction;a&&(t.preventDefault(),this.handleAssetAction(a))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let a=n.dataset.objectType;a&&this.setObjectType(a)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";mn({objectId:e,category:t,onApply:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}})}openAiPicker(){if(!this.state)return;this.setAssetPickerHint('Generate and click "Save to Library" to use it here.'),window.__wizardAssetPicker={onPick:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__openAiEditor;if(typeof e!="function"){alert("AI Editor is not available.");return}let t=this.state.displayName||this.state.instanceId||"new asset";e(this.state.instanceId||"new_asset",`Create an image for ${t}`,"",{})}setAssetPickerHint(e){if(!this.modal)return;let t=this.modal.querySelector("[data-asset-picker-hint]");if(t){if(!e){t.style.display="none",t.textContent="";return}t.textContent=e,t.style.display="block"}}handleFieldChange(e){if(!this.state)return;let t=e.dataset.field;if(t){if(e instanceof HTMLInputElement&&e.type==="checkbox")this.state[t]=e.checked;else if(e instanceof HTMLInputElement&&e.type==="number"){let i=e.value===""?0:Number(e.value);this.state[t]=Number.isNaN(i)?0:i}else this.state[t]=e.value;t==="anchorPreset"&&this.applyAnchorPreset(this.state.anchorPreset),t==="logicId"&&this.applyLogicDefaults(this.state.logicId),this.updateStepUI()}}setObjectType(e){this.state&&(this.state.objectType=e,this.state.scale=e==="sprite"||e==="ui-image"?.2:1,(e==="ui-text"||e==="ui-image")&&(this.state.category="ui",this.state.layer="ui"),this.updateStepUI())}applyAnchorPreset(e){if(!this.state)return;let t={"top-left":[0,0],"top-center":[.5,0],"top-right":[1,0],"left-center":[0,.5],center:[.5,.5],"right-center":[1,.5],"bottom-left":[0,1],"bottom-center":[.5,1],"bottom-right":[1,1]};if(e!=="custom"&&t[e]){let[i,n]=t[e];this.state.anchorX=i,this.state.anchorY=n}}applyLogicDefaults(e){if(!this.state)return;if(!e){this.state.logicPropsRaw="";return}let t=As[e];t&&(this.state.logicPropsRaw=JSON.stringify(t,null,2))}goToStep(e){if(!this.state)return;let t=Math.max(1,Math.min(6,e));this.state.step=t,this.updateStepUI()}updateStepUI(){if(!this.modal||!this.state)return;Array.from(this.modal.querySelectorAll(".wizard-step")).forEach(t=>{let i=Number(t.dataset.step||"0");t.classList.toggle("active",i===this.state.step)}),this.updateProgressDots(),this.updateTypeSections(),this.syncFieldValues(),this.updatePreview(),this.updateActionButtons()}updateProgressDots(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-wizard-progress]");if(!e)return;let t=Array.from({length:6},(i,n)=>{let a=n+1;return`
256
256
  <div class="wizard-step-indicator">
257
257
  <span class="wizard-step-dot ${a===this.state.step?"active":a<this.state.step?"completed":""}"></span>
258
258
  <span class="wizard-step-label">Step ${a}</span>
@@ -507,18 +507,18 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
507
507
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Create Spawner</button>
508
508
  </div>
509
509
  </div>
510
- `;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=t.querySelectorAll(".add-menu-modal-tab"),p=t.querySelectorAll(".add-menu-modal-tab-content");d.forEach(w=>{w.addEventListener("click",()=>{var T;let v=w.dataset.tab;d.forEach(P=>P.classList.remove("active")),p.forEach(P=>P.classList.remove("active")),w.classList.add("active"),(T=t.querySelector(`[data-tab-content="${v}"]`))==null||T.classList.add("active")})});let u=w=>{let v=w.trim();if(!v)return null;try{return JSON.parse(v)}catch{return null}},g=()=>{var H;let w=t.querySelector("#spawner-instance-id").value.trim(),v=t.querySelector("#spawner-template-id").value.trim(),T=t.querySelector("#spawner-spawn-templates").value,P=t.querySelector("#spawner-position-source").value.trim(),_=t.querySelector("#spawner-point-mode").value.trim(),I=t.querySelector("#spawner-spawn-points").value,j=t.querySelector("#spawner-pattern").value.trim(),L=Number(t.querySelector("#spawner-rate").value.trim()),S=Number(t.querySelector("#spawner-pool").value.trim()),x=Number(t.querySelector("#spawner-lifetime").value.trim()),E=t.querySelector("#spawner-return-on-invisible").checked,A=t.querySelector("#spawner-movement").value.trim(),C=Number(t.querySelector("#spawner-vel-x").value.trim()),k=Number(t.querySelector("#spawner-vel-y").value.trim()),R=t.querySelector("#spawner-velocity-range").value,M=u(T),O=Array.isArray(M)&&M.length?M:null,D=typeof((H=O==null?void 0:O[0])==null?void 0:H.templateId)=="string"?String(O[0].templateId):v;if(!w){alert("Instance ID is required.");return}if(!D){alert("Template ID is required.");return}let N={templateId:D,spawnPattern:j,spawnRate:Number.isFinite(L)?L:650,poolSize:Number.isFinite(S)?S:18,returnOnInvisible:E,positionSource:P,spawnPointMode:_,movementMode:A,lifetime:Number.isFinite(x)?x:5e3};O&&(N.spawnTemplates=O);let q=u(I);Array.isArray(q)&&(N.spawnPoints=q),Number.isFinite(C)&&Number.isFinite(k)&&(N.velocity={x:C,y:k});let $=u(R);$&&typeof $=="object"&&(N.velocityRange=$),c(),e({templateId:D,instanceId:w,spawnerProps:N})},h=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",w=>w.stopPropagation()),(f=t.querySelector('[data-action="confirm"]'))==null||f.addEventListener("click",g),(b=t.querySelector('[data-action="cancel"]'))==null||b.addEventListener("click",h),(y=t.querySelector(".add-menu-modal-close"))==null||y.addEventListener("click",h),t.addEventListener("click",w=>{w.target===t&&h()}),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:"center",position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let s=a,r=this.buildDefaultConfig(e,s,a);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:s,objectConfigId:r.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:r,forceSync:!0})}),u=await p.json().catch(()=>({}));if(!p.ok||(u==null?void 0:u.success)===!1){let h=((l=u==null?void 0:u.errors)==null?void 0:l.join(`
510
+ `;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=t.querySelectorAll(".add-menu-modal-tab"),p=t.querySelectorAll(".add-menu-modal-tab-content");d.forEach(w=>{w.addEventListener("click",()=>{var T;let v=w.dataset.tab;d.forEach(P=>P.classList.remove("active")),p.forEach(P=>P.classList.remove("active")),w.classList.add("active"),(T=t.querySelector(`[data-tab-content="${v}"]`))==null||T.classList.add("active")})});let u=w=>{let v=w.trim();if(!v)return null;try{return JSON.parse(v)}catch{return null}},g=()=>{var H;let w=t.querySelector("#spawner-instance-id").value.trim(),v=t.querySelector("#spawner-template-id").value.trim(),T=t.querySelector("#spawner-spawn-templates").value,P=t.querySelector("#spawner-position-source").value.trim(),_=t.querySelector("#spawner-point-mode").value.trim(),I=t.querySelector("#spawner-spawn-points").value,j=t.querySelector("#spawner-pattern").value.trim(),L=Number(t.querySelector("#spawner-rate").value.trim()),S=Number(t.querySelector("#spawner-pool").value.trim()),x=Number(t.querySelector("#spawner-lifetime").value.trim()),E=t.querySelector("#spawner-return-on-invisible").checked,C=t.querySelector("#spawner-movement").value.trim(),A=Number(t.querySelector("#spawner-vel-x").value.trim()),k=Number(t.querySelector("#spawner-vel-y").value.trim()),R=t.querySelector("#spawner-velocity-range").value,M=u(T),O=Array.isArray(M)&&M.length?M:null,D=typeof((H=O==null?void 0:O[0])==null?void 0:H.templateId)=="string"?String(O[0].templateId):v;if(!w){alert("Instance ID is required.");return}if(!D){alert("Template ID is required.");return}let N={templateId:D,spawnPattern:j,spawnRate:Number.isFinite(L)?L:650,poolSize:Number.isFinite(S)?S:18,returnOnInvisible:E,positionSource:P,spawnPointMode:_,movementMode:C,lifetime:Number.isFinite(x)?x:5e3};O&&(N.spawnTemplates=O);let q=u(I);Array.isArray(q)&&(N.spawnPoints=q),Number.isFinite(A)&&Number.isFinite(k)&&(N.velocity={x:A,y:k});let $=u(R);$&&typeof $=="object"&&(N.velocityRange=$),c(),e({templateId:D,instanceId:w,spawnerProps:N})},h=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",w=>w.stopPropagation()),(f=t.querySelector('[data-action="confirm"]'))==null||f.addEventListener("click",g),(b=t.querySelector('[data-action="cancel"]'))==null||b.addEventListener("click",h),(y=t.querySelector(".add-menu-modal-close"))==null||y.addEventListener("click",h),t.addEventListener("click",w=>{w.target===t&&h()}),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:"center",position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let s=a,r=this.buildDefaultConfig(e,s,a);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:s,objectConfigId:r.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:r,forceSync:!0})}),u=await p.json().catch(()=>({}));if(!p.ok||(u==null?void 0:u.success)===!1){let h=((l=u==null?void 0:u.errors)==null?void 0:l.join(`
511
511
  `))||(u==null?void 0:u.error)||"Failed to create object.";alert(h);return}let{trackObjectCreation:g}=await import("./ConfigOverride-SLXAGR2M.js");g(s,i,r),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),(d=(c=this.options).onRefresh)==null||d.call(c)}catch(p){alert(`Failed to create object: ${p instanceof Error?p.message:String(p)}`)}}async handleCreateFromTemplate(e,t){var s,r,l;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",a=await this.promptName(n);if(a)try{let c=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:a,screenId:i,forceSync:!0})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let p=((s=d==null?void 0:d.errors)==null?void 0:s.join(`
512
- `))||(d==null?void 0:d.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(r=this.options).onRefresh)==null||l.call(r)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,s,r,l,c,d,p,u,g,h,m,f,b,y,w,v,T,P,_,I,j,L,S,x,E,A;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let C=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await C.json().catch(()=>({}));if(!C.ok||(k==null?void 0:k.success)===!1){let R=((n=k==null?void 0:k.errors)==null?void 0:n.join(`
513
- `))||(k==null?void 0:k.error)||"Failed to create collectable system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(s=(a=this.options).onRefresh)==null||s.call(a)}catch(C){alert(`Failed to create collectable system: ${C instanceof Error?C.message:String(C)}`)}if(e==="drag-snap-couples")try{let C=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await C.json().catch(()=>({}));if(!C.ok||(k==null?void 0:k.success)===!1){let R=((r=k==null?void 0:k.errors)==null?void 0:r.join(`
514
- `))||(k==null?void 0:k.error)||"Failed to create drag-snap system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(C){alert(`Failed to create drag-snap system: ${C instanceof Error?C.message:String(C)}`)}if(e==="swerve-collect")try{let C=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await C.json().catch(()=>({}));if(!C.ok||(k==null?void 0:k.success)===!1){let R=((d=k==null?void 0:k.errors)==null?void 0:d.join(`
515
- `))||(k==null?void 0:k.error)||"Failed to create swerve collect system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(u=(p=this.options).onRefresh)==null||u.call(p)}catch(C){alert(`Failed to create swerve collect system: ${C instanceof Error?C.message:String(C)}`)}if(e==="tap-destroy")try{let C=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await C.json().catch(()=>({}));if(!C.ok||(k==null?void 0:k.success)===!1){let R=((g=k==null?void 0:k.errors)==null?void 0:g.join(`
516
- `))||(k==null?void 0:k.error)||"Failed to create tap destroy system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(m=(h=this.options).onRefresh)==null||m.call(h)}catch(C){alert(`Failed to create tap destroy system: ${C instanceof Error?C.message:String(C)}`)}if(e==="scratch-card")try{let C=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await C.json().catch(()=>({}));if(!C.ok||(k==null?void 0:k.success)===!1){let R=((f=k==null?void 0:k.errors)==null?void 0:f.join(`
517
- `))||(k==null?void 0:k.error)||"Failed to create scratch card system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(y=(b=this.options).onRefresh)==null||y.call(b)}catch(C){alert(`Failed to create scratch card system: ${C instanceof Error?C.message:String(C)}`)}if(e==="start-screen"||e==="start-screen-no-hand")try{let k=await fetch("/api/systems/start-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="start-screen"})}),R=await k.json().catch(()=>({}));if(!k.ok||(R==null?void 0:R.success)===!1){let M=((w=R==null?void 0:R.errors)==null?void 0:w.join(`
518
- `))||(R==null?void 0:R.error)||"Failed to create start screen template.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(T=(v=this.options).onRefresh)==null||T.call(v)}catch(C){alert(`Failed to create start screen template: ${C instanceof Error?C.message:String(C)}`)}if(e==="endgame-screen"||e==="endgame-screen-no-hand")try{let k=await fetch("/api/systems/endgame-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="endgame-screen"})}),R=await k.json().catch(()=>({}));if(!k.ok||(R==null?void 0:R.success)===!1){let M=((P=R==null?void 0:R.errors)==null?void 0:P.join(`
519
- `))||(R==null?void 0:R.error)||"Failed to create endgame screen template.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(I=(_=this.options).onRefresh)==null||I.call(_)}catch(C){alert(`Failed to create endgame screen template: ${C instanceof Error?C.message:String(C)}`)}if(e==="bullet-system")try{let C=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await C.json().catch(()=>({}));if(!C.ok||(k==null?void 0:k.success)===!1){let R=((j=k==null?void 0:k.errors)==null?void 0:j.join(`
520
- `))||(k==null?void 0:k.error)||"Failed to create bullet system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(S=(L=this.options).onRefresh)==null||S.call(L)}catch(C){alert(`Failed to create bullet system: ${C instanceof Error?C.message:String(C)}`)}if(e==="spawner"){let C=await this.promptSpawnerConfig();if(!C)return;let{templateId:k,instanceId:R,spawnerProps:M}=C;try{let O=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,templateId:k,instanceId:R,spawnerProps:M,forceSync:!0})}),D=await O.json().catch(()=>({}));if(!O.ok||(D==null?void 0:D.success)===!1){let N=((x=D==null?void 0:D.errors)==null?void 0:x.join(`
521
- `))||(D==null?void 0:D.error)||"Failed to create spawner.";alert(N);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(A=(E=this.options).onRefresh)==null||A.call(E)}catch(O){alert(`Failed to create spawner: ${O instanceof Error?O.message:String(O)}`)}}}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}async syncScreens(){try{let e=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})})}catch(e){console.warn("[AddObjectMenu] Failed to sync screens:",e)}}};var si=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.isContextMenuOpen=!1;this.systemBundles=new Map;this.collapsedGroups=new Set}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getCollapseStorageKey(){return`handler_preview_scene_collapsed::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}loadCollapsedGroups(){try{let e=window.localStorage.getItem(this.getCollapseStorageKey());if(!e)return;let t=JSON.parse(e);Array.isArray(t)&&(this.collapsedGroups=new Set(t.filter(i=>typeof i=="string")))}catch{}}persistCollapsedGroups(){try{window.localStorage.setItem(this.getCollapseStorageKey(),JSON.stringify(Array.from(this.collapsedGroups)))}catch{}}isCollapsed(e){return this.collapsedGroups.has(e)}setCollapsed(e,t){t?this.collapsedGroups.add(e):this.collapsedGroups.delete(e),this.persistCollapsedGroups()}getCollapseKey(e){return encodeURIComponent(e)}getSystemBundleKey(e,t){return this.getCollapseKey(`bundle:${e}::${t}`)}render(){return`
512
+ `))||(d==null?void 0:d.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(r=this.options).onRefresh)==null||l.call(r)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,s,r,l,c,d,p,u,g,h,m,f,b,y,w,v,T,P,_,I,j,L,S,x,E,C;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let A=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await A.json().catch(()=>({}));if(!A.ok||(k==null?void 0:k.success)===!1){let R=((n=k==null?void 0:k.errors)==null?void 0:n.join(`
513
+ `))||(k==null?void 0:k.error)||"Failed to create collectable system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(s=(a=this.options).onRefresh)==null||s.call(a)}catch(A){alert(`Failed to create collectable system: ${A instanceof Error?A.message:String(A)}`)}if(e==="drag-snap-couples")try{let A=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await A.json().catch(()=>({}));if(!A.ok||(k==null?void 0:k.success)===!1){let R=((r=k==null?void 0:k.errors)==null?void 0:r.join(`
514
+ `))||(k==null?void 0:k.error)||"Failed to create drag-snap system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(A){alert(`Failed to create drag-snap system: ${A instanceof Error?A.message:String(A)}`)}if(e==="swerve-collect")try{let A=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await A.json().catch(()=>({}));if(!A.ok||(k==null?void 0:k.success)===!1){let R=((d=k==null?void 0:k.errors)==null?void 0:d.join(`
515
+ `))||(k==null?void 0:k.error)||"Failed to create swerve collect system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(u=(p=this.options).onRefresh)==null||u.call(p)}catch(A){alert(`Failed to create swerve collect system: ${A instanceof Error?A.message:String(A)}`)}if(e==="tap-destroy")try{let A=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await A.json().catch(()=>({}));if(!A.ok||(k==null?void 0:k.success)===!1){let R=((g=k==null?void 0:k.errors)==null?void 0:g.join(`
516
+ `))||(k==null?void 0:k.error)||"Failed to create tap destroy system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(m=(h=this.options).onRefresh)==null||m.call(h)}catch(A){alert(`Failed to create tap destroy system: ${A instanceof Error?A.message:String(A)}`)}if(e==="scratch-card")try{let A=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await A.json().catch(()=>({}));if(!A.ok||(k==null?void 0:k.success)===!1){let R=((f=k==null?void 0:k.errors)==null?void 0:f.join(`
517
+ `))||(k==null?void 0:k.error)||"Failed to create scratch card system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(y=(b=this.options).onRefresh)==null||y.call(b)}catch(A){alert(`Failed to create scratch card system: ${A instanceof Error?A.message:String(A)}`)}if(e==="start-screen"||e==="start-screen-no-hand")try{let k=await fetch("/api/systems/start-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="start-screen"})}),R=await k.json().catch(()=>({}));if(!k.ok||(R==null?void 0:R.success)===!1){let M=((w=R==null?void 0:R.errors)==null?void 0:w.join(`
518
+ `))||(R==null?void 0:R.error)||"Failed to create start screen template.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(T=(v=this.options).onRefresh)==null||T.call(v)}catch(A){alert(`Failed to create start screen template: ${A instanceof Error?A.message:String(A)}`)}if(e==="endgame-screen"||e==="endgame-screen-no-hand")try{let k=await fetch("/api/systems/endgame-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="endgame-screen"})}),R=await k.json().catch(()=>({}));if(!k.ok||(R==null?void 0:R.success)===!1){let M=((P=R==null?void 0:R.errors)==null?void 0:P.join(`
519
+ `))||(R==null?void 0:R.error)||"Failed to create endgame screen template.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(I=(_=this.options).onRefresh)==null||I.call(_)}catch(A){alert(`Failed to create endgame screen template: ${A instanceof Error?A.message:String(A)}`)}if(e==="bullet-system")try{let A=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),k=await A.json().catch(()=>({}));if(!A.ok||(k==null?void 0:k.success)===!1){let R=((j=k==null?void 0:k.errors)==null?void 0:j.join(`
520
+ `))||(k==null?void 0:k.error)||"Failed to create bullet system.";alert(R);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(S=(L=this.options).onRefresh)==null||S.call(L)}catch(A){alert(`Failed to create bullet system: ${A instanceof Error?A.message:String(A)}`)}if(e==="spawner"){let A=await this.promptSpawnerConfig();if(!A)return;let{templateId:k,instanceId:R,spawnerProps:M}=A;try{let O=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,templateId:k,instanceId:R,spawnerProps:M,forceSync:!0})}),D=await O.json().catch(()=>({}));if(!O.ok||(D==null?void 0:D.success)===!1){let N=((x=D==null?void 0:D.errors)==null?void 0:x.join(`
521
+ `))||(D==null?void 0:D.error)||"Failed to create spawner.";alert(N);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(C=(E=this.options).onRefresh)==null||C.call(E)}catch(O){alert(`Failed to create spawner: ${O instanceof Error?O.message:String(O)}`)}}}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}async syncScreens(){try{let e=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})})}catch(e){console.warn("[AddObjectMenu] Failed to sync screens:",e)}}};var si=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.isContextMenuOpen=!1;this.systemBundles=new Map;this.collapsedGroups=new Set}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getCollapseStorageKey(){return`handler_preview_scene_collapsed::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}loadCollapsedGroups(){try{let e=window.localStorage.getItem(this.getCollapseStorageKey());if(!e)return;let t=JSON.parse(e);Array.isArray(t)&&(this.collapsedGroups=new Set(t.filter(i=>typeof i=="string")))}catch{}}persistCollapsedGroups(){try{window.localStorage.setItem(this.getCollapseStorageKey(),JSON.stringify(Array.from(this.collapsedGroups)))}catch{}}isCollapsed(e){return this.collapsedGroups.has(e)}setCollapsed(e,t){t?this.collapsedGroups.add(e):this.collapsedGroups.delete(e),this.persistCollapsedGroups()}getCollapseKey(e){return encodeURIComponent(e)}getSystemBundleKey(e,t){return this.getCollapseKey(`bundle:${e}::${t}`)}render(){return`
522
522
  <div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects">
523
523
  <div class="scene-panel-header" data-panel-handle>
524
524
  <div class="panel-title">
@@ -553,7 +553,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
553
553
  </div>
554
554
  <div class="panel-resize-handle-v" data-panel-resize-v></div>
555
555
  </div>
556
- `}initialize(e,t){var a,s,r,l,c,d,p,u;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(s=this.root)==null?void 0:s.querySelector("#scene-object-search"),(r=this.searchInput)==null||r.addEventListener("input",()=>this.refreshObjects()),this.loadCollapsedGroups(),(l=this.listContainer)==null||l.addEventListener("click",g=>{var v;let h=g.target,m=h==null?void 0:h.closest("[data-collapse-key]");if(m){let T=m.dataset.collapseKey||"";if(!T)return;let P=(v=this.listContainer)==null?void 0:v.querySelector(`[data-collapse-content="${T}"]`),_=this.isCollapsed(T);P&&(P.style.display=_?"":"none"),m.textContent=_?"\u25BE":"\u25B8",this.setCollapsed(T,!_),g.preventDefault(),g.stopPropagation();return}let f=h==null?void 0:h.closest("[data-object-visibility-toggle][data-object-id]");if(f){let T=f.dataset.objectId;if(!T)return;g.preventDefault(),g.stopPropagation(),this.toggleObjectVisibility(T);return}let b=h==null?void 0:h.closest("[data-system-bundle-action][data-system-bundle-id]");if(!b)return;g.preventDefault(),g.stopPropagation();let y=b.dataset.systemBundleAction,w=b.dataset.systemBundleId;if(!(!y||!w)){if(y==="toggle-visibility"){this.toggleSystemBundleVisibility(w);return}y==="delete"&&this.deleteSystemBundle(w)}});let i=(c=this.root)==null?void 0:c.querySelector("[data-add-object]");i==null||i.addEventListener("click",g=>{g.stopPropagation();let h=i.getBoundingClientRect();this.openAddObjectMenu({x:h.left,y:h.bottom+4})});let n=(d=this.root)==null?void 0:d.querySelector("#scene-screen-filter");if(n){this.screenFilter="all";try{window.localStorage.removeItem(this.getScreenFilterStorageKey()),console.log('[CONFIGTTEST] Inspector panel initialized - forcing screen filter to "all"')}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{}try{let g=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof g=="function"&&g().catch(()=>{})}catch{}n.addEventListener("change",()=>{let g=n.value||"all";this.screenFilter=g;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{}try{let h=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof h=="function"&&h().catch(()=>{})}catch{}this.refreshObjects()})}(p=this.root)==null||p.addEventListener("click",g=>{let h=g.target;if(!h||h.closest("[data-context-menu]"))return;if(h.tagName==="INPUT"&&h.classList.contains("scene-object-checkbox")){let v=h.dataset.objectId;if(!v)return;g.stopPropagation(),this.toggleBatchSelect(v);return}let m=h.closest(".scene-object-item[data-object-id]");if(!m)return;let f=m.dataset.objectId;if(!f)return;let b=g.ctrlKey||g.metaKey;g.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,f):b?this.toggleBatchSelect(f):this.select(f)}),(u=this.listContainer)==null||u.addEventListener("contextmenu",g=>{var v;let h=g.target,m=h==null?void 0:h.closest("[data-object-id]");if(!m)return;let f=m.dataset.objectId;if(!f)return;g.preventDefault();let b=window.getEditableObjectConfig,y=typeof b=="function"?b(f):null;if(!y){let T=window.__editableObjectConfigs;T&&typeof T.get=="function"&&(y=(v=T.get(f))!=null?v:null)}let w=this.inferScreen(f,y);this.showContextMenu(f,w,g.clientX,g.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,r,l,c;if(!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{let p=d.dataset.objectId,u=p?this.selectedIds.has(p):!1,g=p===this.selectedId;d.classList.toggle("selected",u),d.classList.toggle("active",g);let h=d.closest(".scene-object-item-wrapper"),m=h==null?void 0:h.querySelector(".scene-object-checkbox");m&&(m.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),n=(r=this.root)==null?void 0:r.querySelector("[data-breadcrumb-object]");if(t&&i&&n){let d=this.selectedIds.size===1?this.selectedId:null;if(d){let p=window.getEditableObjectConfig,u=typeof p=="function"?p(d):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(l=b.get(d))!=null?l:null)}let g=this.inferScreen(d,u),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},m=(((c=u==null?void 0:u.identity)==null?void 0:c.id)||d).toString(),f=this.formatDisplayName(m);i.textContent=h[g]||g,n.textContent=f,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var u;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectListAll,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"&&typeof t!="function"){this.scheduleRetry();return}let n=typeof t=="function"?t():e();if(!Array.isArray(n)||n.length===0){let g=window.__editableObjectConfigs;g&&typeof g.keys=="function"&&(n=Array.from(g.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let a=(((u=this.searchInput)==null?void 0:u.value)||"").trim().toLowerCase(),s=["loading","start","gameplay","tutorial","endgame"],r={loading:{templates:[],systems:[],objects:[],bundles:new Map},start:{templates:[],systems:[],objects:[],bundles:new Map},gameplay:{templates:[],systems:[],objects:[],bundles:new Map},tutorial:{templates:[],systems:[],objects:[],bundles:new Map},endgame:{templates:[],systems:[],objects:[],bundles:new Map}};this.systemBundles=new Map;let l=g=>{var f,b,y,w,v;let h=(w=(y=(b=(f=window.__editableConfig)==null?void 0:f.objects)==null?void 0:b.get)==null?void 0:y.call(b,g))!=null?w:null;if(h)return h;let m=window.__editableObjectConfigs;return m&&typeof m.get=="function"&&(v=m.get(g))!=null?v:null};n.forEach(g=>{var A,C,k,R,M,O,D;let h=l(g),m=(((A=h==null?void 0:h.identity)==null?void 0:A.category)||"scene").toString(),f=(((C=h==null?void 0:h.identity)==null?void 0:C.id)||g).toString(),b=m.toLowerCase(),y=f.toLowerCase(),w=b.includes("ui")||y.startsWith("ui")||y.includes("label"),v=b==="system",T=((k=h==null?void 0:h.identity)==null?void 0:k.is_template)===!0||y.includes(".template")||g.toLowerCase().includes(".template"),P=typeof((R=h==null?void 0:h.identity)==null?void 0:R.system_group)=="string"?h.identity.system_group:null,_=typeof((M=h==null?void 0:h.identity)==null?void 0:M.system_label)=="string"?h.identity.system_label:P?this.formatDisplayName(P):null,I=this.formatDisplayName(f||g),j=((O=h==null?void 0:h.render)==null?void 0:O.visible)===!1||(h==null?void 0:h.enabled)===!1,L=this.getObjectType(h),S={id:g,label:I,category:m,isUi:w,isTemplate:T,isUnused:j,objectType:L,systemGroupId:P,systemLabel:_},x=this.inferScreen(S.id,h);if(!(this.screenFilter!=="all"&&x!==this.screenFilter||!(!a||S.id.toLowerCase().includes(a)||S.label.toLowerCase().includes(a)))){if(P){let N=this.getSystemBundleKey(x,P),q=_!=null?_:P,$=r[x],H=$.bundles.get(N);H?(H.entries.push(S),H.objectIds.push(g)):$.bundles.set(N,{key:N,label:q,objectIds:[g],entries:[S]});let z=(D=this.systemBundles.get(N))!=null?D:{label:q,objectIds:[]};z.label=q,z.objectIds.push(g),this.systemBundles.set(N,z);return}if(T){r[x].templates.push(S);return}v?r[x].systems.push(S):r[x].objects.push(S)}});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},d=this.screenFilter==="all"?s:[this.screenFilter],p=d.map(g=>this.renderScreenGroup(g,c[g],r[g])).join("");this.listContainer.innerHTML=p,this.objectEntries=[];for(let g of d){let h=r[g];this.objectEntries.push(...h.templates),h.bundles.forEach(m=>this.objectEntries.push(...m.entries)),this.objectEntries.push(...h.systems),this.objectEntries.push(...h.objects)}for(let g of d){let h=r[g];if(!h.systems.length)continue;let m=this.listContainer.querySelector(`[data-delete-system-group="${g}"]`);m==null||m.addEventListener("click",f=>{f.stopPropagation(),this.deleteSystemGroup(h.systems)})}this.updateSelectionUI()}renderSystemBundle(e,t,i,n){let a=this.isBundleAllHidden(i),s=a?"Show all objects in this system":"Hide all objects in this system",r=a?"is-hidden":"",l=n.map(g=>this.renderEntryItem(g)).join(""),c=this.escapeHtml(e),d=this.getCollapseKey(`system:${e}`),p=this.isCollapsed(d);return`
556
+ `}initialize(e,t){var a,s,r,l,c,d,p,u;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(s=this.root)==null?void 0:s.querySelector("#scene-object-search"),(r=this.searchInput)==null||r.addEventListener("input",()=>this.refreshObjects()),this.loadCollapsedGroups(),(l=this.listContainer)==null||l.addEventListener("click",g=>{var v;let h=g.target,m=h==null?void 0:h.closest("[data-collapse-key]");if(m){let T=m.dataset.collapseKey||"";if(!T)return;let P=(v=this.listContainer)==null?void 0:v.querySelector(`[data-collapse-content="${T}"]`),_=this.isCollapsed(T);P&&(P.style.display=_?"":"none"),m.textContent=_?"\u25BE":"\u25B8",this.setCollapsed(T,!_),g.preventDefault(),g.stopPropagation();return}let f=h==null?void 0:h.closest("[data-object-visibility-toggle][data-object-id]");if(f){let T=f.dataset.objectId;if(!T)return;g.preventDefault(),g.stopPropagation(),this.toggleObjectVisibility(T);return}let b=h==null?void 0:h.closest("[data-system-bundle-action][data-system-bundle-id]");if(!b)return;g.preventDefault(),g.stopPropagation();let y=b.dataset.systemBundleAction,w=b.dataset.systemBundleId;if(!(!y||!w)){if(y==="toggle-visibility"){this.toggleSystemBundleVisibility(w);return}y==="delete"&&this.deleteSystemBundle(w)}});let i=(c=this.root)==null?void 0:c.querySelector("[data-add-object]");i==null||i.addEventListener("click",g=>{g.stopPropagation();let h=i.getBoundingClientRect();this.openAddObjectMenu({x:h.left,y:h.bottom+4})});let n=(d=this.root)==null?void 0:d.querySelector("#scene-screen-filter");if(n){this.screenFilter="all";try{window.localStorage.removeItem(this.getScreenFilterStorageKey()),console.log('[CONFIGTTEST] Inspector panel initialized - forcing screen filter to "all"')}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{}try{let g=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof g=="function"&&g().catch(()=>{})}catch{}n.addEventListener("change",()=>{let g=n.value||"all";this.screenFilter=g;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{}try{let h=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof h=="function"&&h().catch(()=>{})}catch{}this.refreshObjects()})}(p=this.root)==null||p.addEventListener("click",g=>{let h=g.target;if(!h||h.closest("[data-context-menu]"))return;if(h.tagName==="INPUT"&&h.classList.contains("scene-object-checkbox")){let v=h.dataset.objectId;if(!v)return;g.stopPropagation(),this.toggleBatchSelect(v);return}let m=h.closest(".scene-object-item[data-object-id]");if(!m)return;let f=m.dataset.objectId;if(!f)return;let b=g.ctrlKey||g.metaKey;g.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,f):b?this.toggleBatchSelect(f):this.select(f)}),(u=this.listContainer)==null||u.addEventListener("contextmenu",g=>{var v;let h=g.target,m=h==null?void 0:h.closest("[data-object-id]");if(!m)return;let f=m.dataset.objectId;if(!f)return;g.preventDefault();let b=window.getEditableObjectConfig,y=typeof b=="function"?b(f):null;if(!y){let T=window.__editableObjectConfigs;T&&typeof T.get=="function"&&(y=(v=T.get(f))!=null?v:null)}let w=this.inferScreen(f,y);this.showContextMenu(f,w,g.clientX,g.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,r,l,c;if(!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{let p=d.dataset.objectId,u=p?this.selectedIds.has(p):!1,g=p===this.selectedId;d.classList.toggle("selected",u),d.classList.toggle("active",g);let h=d.closest(".scene-object-item-wrapper"),m=h==null?void 0:h.querySelector(".scene-object-checkbox");m&&(m.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),n=(r=this.root)==null?void 0:r.querySelector("[data-breadcrumb-object]");if(t&&i&&n){let d=this.selectedIds.size===1?this.selectedId:null;if(d){let p=window.getEditableObjectConfig,u=typeof p=="function"?p(d):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(l=b.get(d))!=null?l:null)}let g=this.inferScreen(d,u),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},m=(((c=u==null?void 0:u.identity)==null?void 0:c.id)||d).toString(),f=this.formatDisplayName(m);i.textContent=h[g]||g,n.textContent=f,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var u;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectListAll,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"&&typeof t!="function"){this.scheduleRetry();return}let n=typeof t=="function"?t():e();if(!Array.isArray(n)||n.length===0){let g=window.__editableObjectConfigs;g&&typeof g.keys=="function"&&(n=Array.from(g.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let a=(((u=this.searchInput)==null?void 0:u.value)||"").trim().toLowerCase(),s=["loading","start","gameplay","tutorial","endgame"],r={loading:{templates:[],systems:[],objects:[],bundles:new Map},start:{templates:[],systems:[],objects:[],bundles:new Map},gameplay:{templates:[],systems:[],objects:[],bundles:new Map},tutorial:{templates:[],systems:[],objects:[],bundles:new Map},endgame:{templates:[],systems:[],objects:[],bundles:new Map}};this.systemBundles=new Map;let l=g=>{var f,b,y,w,v;let h=(w=(y=(b=(f=window.__editableConfig)==null?void 0:f.objects)==null?void 0:b.get)==null?void 0:y.call(b,g))!=null?w:null;if(h)return h;let m=window.__editableObjectConfigs;return m&&typeof m.get=="function"&&(v=m.get(g))!=null?v:null};n.forEach(g=>{var C,A,k,R,M,O,D;let h=l(g),m=(((C=h==null?void 0:h.identity)==null?void 0:C.category)||"scene").toString(),f=(((A=h==null?void 0:h.identity)==null?void 0:A.id)||g).toString(),b=m.toLowerCase(),y=f.toLowerCase(),w=b.includes("ui")||y.startsWith("ui")||y.includes("label"),v=b==="system",T=((k=h==null?void 0:h.identity)==null?void 0:k.is_template)===!0||y.includes(".template")||g.toLowerCase().includes(".template"),P=typeof((R=h==null?void 0:h.identity)==null?void 0:R.system_group)=="string"?h.identity.system_group:null,_=typeof((M=h==null?void 0:h.identity)==null?void 0:M.system_label)=="string"?h.identity.system_label:P?this.formatDisplayName(P):null,I=this.formatDisplayName(f||g),j=((O=h==null?void 0:h.render)==null?void 0:O.visible)===!1||(h==null?void 0:h.enabled)===!1,L=this.getObjectType(h),S={id:g,label:I,category:m,isUi:w,isTemplate:T,isUnused:j,objectType:L,systemGroupId:P,systemLabel:_},x=this.inferScreen(S.id,h);if(!(this.screenFilter!=="all"&&x!==this.screenFilter||!(!a||S.id.toLowerCase().includes(a)||S.label.toLowerCase().includes(a)))){if(P){let N=this.getSystemBundleKey(x,P),q=_!=null?_:P,$=r[x],H=$.bundles.get(N);H?(H.entries.push(S),H.objectIds.push(g)):$.bundles.set(N,{key:N,label:q,objectIds:[g],entries:[S]});let z=(D=this.systemBundles.get(N))!=null?D:{label:q,objectIds:[]};z.label=q,z.objectIds.push(g),this.systemBundles.set(N,z);return}if(T){r[x].templates.push(S);return}v?r[x].systems.push(S):r[x].objects.push(S)}});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},d=this.screenFilter==="all"?s:[this.screenFilter],p=d.map(g=>this.renderScreenGroup(g,c[g],r[g])).join("");this.listContainer.innerHTML=p,this.objectEntries=[];for(let g of d){let h=r[g];this.objectEntries.push(...h.templates),h.bundles.forEach(m=>this.objectEntries.push(...m.entries)),this.objectEntries.push(...h.systems),this.objectEntries.push(...h.objects)}for(let g of d){let h=r[g];if(!h.systems.length)continue;let m=this.listContainer.querySelector(`[data-delete-system-group="${g}"]`);m==null||m.addEventListener("click",f=>{f.stopPropagation(),this.deleteSystemGroup(h.systems)})}this.updateSelectionUI()}renderSystemBundle(e,t,i,n){let a=this.isBundleAllHidden(i),s=a?"Show all objects in this system":"Hide all objects in this system",r=a?"is-hidden":"",l=n.map(g=>this.renderEntryItem(g)).join(""),c=this.escapeHtml(e),d=this.getCollapseKey(`system:${e}`),p=this.isCollapsed(d);return`
557
557
  <div class="scene-object-group scene-object-group-bundle" data-system-bundle="${c}">
558
558
  <div class="scene-object-group-title">
559
559
  <button class="scene-object-group-toggle" type="button" data-collapse-key="${d}">${p?"\u25B8":"\u25BE"}</button>
@@ -685,7 +685,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
685
685
  </div>
686
686
  </div>
687
687
  </div>
688
- `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="scene-tools-corner"]'),!this.root)return;let i=localStorage.getItem("scene-tools-collapsed");i!==null&&(this.isCollapsed=i==="true",this.root.classList.toggle("collapsed",this.isCollapsed));let n=this.root.querySelector("[data-tools-collapse]");n==null||n.addEventListener("click",()=>{var x;this.isCollapsed=!this.isCollapsed,(x=this.root)==null||x.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let a=(x,E)=>{var C;let A=(C=this.root)==null?void 0:C.querySelector(`[data-status="${x}"]`);A&&A.classList.toggle("active",E)},s=this.root.querySelector("#debug-highlight-object");s==null||s.addEventListener("change",()=>{var x;(x=this.options)==null||x.onHighlightObject(!!s.checked),a("bounds",s.checked)});let r=this.root.querySelector("#debug-highlight-anchor");r==null||r.addEventListener("change",()=>{var x;(x=this.options)==null||x.onHighlightAnchor(!!r.checked),a("anchor",r.checked),window.dispatchEvent(new CustomEvent("scene-editor:highlight-anchor",{detail:{enabled:r.checked}}));try{localStorage.setItem(this.getSceneStorageKey("highlight_anchor"),r.checked?"true":"false")}catch{}});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{a("nudge",l.checked)});let c=this.root.querySelector("#scene-grid-enabled"),d=this.root.querySelector("#scene-grid-gap"),p=this.root.querySelector("#scene-grid-alpha"),u=this.root.querySelector("#scene-grid-alpha-value"),g=this.root.querySelector("#scene-play-mode"),h=this.root.querySelector("#scene-background-cover"),m=this.root.querySelector("#scene-background-lock"),f=this.root.querySelector("[data-grid-toggle-btn]"),b=this.root.querySelector("[data-play-toggle-btn]"),y=()=>{if(!p)return .25;let x=Number(p.value),E=Number.isFinite(x)?Math.min(1,Math.max(0,x)):.25;return p.value=String(E),u&&(u.textContent=`${Math.round(E*100)}%`),E},w=(x,E,A)=>{var k,R;let C=A!==void 0?A:y();(R=(k=this.options)==null?void 0:k.onGridToggle)==null||R.call(k,x,E,C),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:x,gap:E,alpha:C}}))},v=x=>{var A,C;let E=y();(C=(A=this.options)==null?void 0:A.onGridGapChange)==null||C.call(A,x),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:x,alpha:E}}))},T=x=>{var E,A;(A=(E=this.options)==null?void 0:E.onGridAlphaChange)==null||A.call(E,x),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:j(),alpha:x}}))},P=x=>{var E,A;(A=(E=this.options)==null?void 0:E.onPlayModeChange)==null||A.call(E,x),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:x}}))},_=x=>{var E,A;(A=(E=this.options)==null?void 0:E.onBackgroundCoverChange)==null||A.call(E,x),window.dispatchEvent(new CustomEvent("scene-editor:background-cover",{detail:{enabled:x}}))},I=x=>{var E,A;(A=(E=this.options)==null?void 0:E.onBackgroundLockChange)==null||A.call(E,x),window.dispatchEvent(new CustomEvent("scene-editor:background-lock",{detail:{enabled:x}}))},j=()=>{if(!d)return 50;let x=Number(d.value),E=Number.isFinite(x)?Math.min(200,Math.max(4,x)):50;return d.value=String(E),E},L=x=>{c&&(c.checked=x),d&&(d.disabled=!x),p&&(p.disabled=!x),f==null||f.classList.toggle("active",x)},S=x=>{g&&(g.checked=x),b==null||b.classList.toggle("active",x)};try{let x=localStorage.getItem(this.getSceneStorageKey("grid_enabled")),E=localStorage.getItem(this.getSceneStorageKey("grid_gap")),A=localStorage.getItem(this.getSceneStorageKey("grid_alpha")),C=localStorage.getItem(this.getSceneStorageKey("highlight_anchor")),k=localStorage.getItem(this.getSceneStorageKey("background_cover")),R=localStorage.getItem(this.getSceneStorageKey("background_lock")),M=x?x==="true":!1;L(M),d&&(d.value=E||"50",d.disabled=!M),p&&(p.value=A||"0.25",p.disabled=!M,y()),r&&(r.checked=C==="true",a("anchor",r.checked));let O=!0;S(O),g&&(g.disabled=!0),b&&(b.disabled=!0);try{localStorage.setItem(this.getSceneStorageKey("play_mode"),O?"true":"false")}catch{}w(M,j(),y()),P(O);let D=k?k==="true":!0,N=R?R==="true":!0;h&&(h.checked=D),m&&(m.checked=N),_(D),I(N),r&&window.dispatchEvent(new CustomEvent("scene-editor:highlight-anchor",{detail:{enabled:r.checked}}))}catch{}c==null||c.addEventListener("change",()=>{let x=j(),E=y();d&&(d.disabled=!c.checked),p&&(p.disabled=!c.checked),f==null||f.classList.toggle("active",c.checked);try{localStorage.setItem(this.getSceneStorageKey("grid_enabled"),c.checked?"true":"false"),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(x)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(E))}catch{}w(c.checked,x,E)}),d==null||d.addEventListener("input",()=>{let x=j(),E=y();try{localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(x)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(E))}catch{}v(x)}),p==null||p.addEventListener("input",()=>{let x=y(),E=j();try{localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(x)),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(E))}catch{}T(x)}),g==null||g.addEventListener("change",()=>{try{localStorage.setItem(this.getSceneStorageKey("play_mode"),g.checked?"true":"false")}catch{}b==null||b.classList.toggle("active",g.checked),P(g.checked)}),h==null||h.addEventListener("change",()=>{try{localStorage.setItem(this.getSceneStorageKey("background_cover"),h.checked?"true":"false")}catch{}_(h.checked)}),m==null||m.addEventListener("change",()=>{try{localStorage.setItem(this.getSceneStorageKey("background_lock"),m.checked?"true":"false")}catch{}I(m.checked)}),f==null||f.addEventListener("click",()=>{c&&(c.checked=!c.checked,c.dispatchEvent(new Event("change")))}),b==null||b.addEventListener("click",()=>{g&&(g.checked=!g.checked,g.dispatchEvent(new Event("change")))})}updateInfo(e){}};var oi=class{constructor(){this.root=null;this.options=null}render(){return`
688
+ `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="scene-tools-corner"]'),!this.root)return;let i=localStorage.getItem("scene-tools-collapsed");i!==null&&(this.isCollapsed=i==="true",this.root.classList.toggle("collapsed",this.isCollapsed));let n=this.root.querySelector("[data-tools-collapse]");n==null||n.addEventListener("click",()=>{var x;this.isCollapsed=!this.isCollapsed,(x=this.root)==null||x.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let a=(x,E)=>{var A;let C=(A=this.root)==null?void 0:A.querySelector(`[data-status="${x}"]`);C&&C.classList.toggle("active",E)},s=this.root.querySelector("#debug-highlight-object");s==null||s.addEventListener("change",()=>{var x;(x=this.options)==null||x.onHighlightObject(!!s.checked),a("bounds",s.checked)});let r=this.root.querySelector("#debug-highlight-anchor");r==null||r.addEventListener("change",()=>{var x;(x=this.options)==null||x.onHighlightAnchor(!!r.checked),a("anchor",r.checked),window.dispatchEvent(new CustomEvent("scene-editor:highlight-anchor",{detail:{enabled:r.checked}}));try{localStorage.setItem(this.getSceneStorageKey("highlight_anchor"),r.checked?"true":"false")}catch{}});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{a("nudge",l.checked)});let c=this.root.querySelector("#scene-grid-enabled"),d=this.root.querySelector("#scene-grid-gap"),p=this.root.querySelector("#scene-grid-alpha"),u=this.root.querySelector("#scene-grid-alpha-value"),g=this.root.querySelector("#scene-play-mode"),h=this.root.querySelector("#scene-background-cover"),m=this.root.querySelector("#scene-background-lock"),f=this.root.querySelector("[data-grid-toggle-btn]"),b=this.root.querySelector("[data-play-toggle-btn]"),y=()=>{if(!p)return .25;let x=Number(p.value),E=Number.isFinite(x)?Math.min(1,Math.max(0,x)):.25;return p.value=String(E),u&&(u.textContent=`${Math.round(E*100)}%`),E},w=(x,E,C)=>{var k,R;let A=C!==void 0?C:y();(R=(k=this.options)==null?void 0:k.onGridToggle)==null||R.call(k,x,E,A),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:x,gap:E,alpha:A}}))},v=x=>{var C,A;let E=y();(A=(C=this.options)==null?void 0:C.onGridGapChange)==null||A.call(C,x),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:x,alpha:E}}))},T=x=>{var E,C;(C=(E=this.options)==null?void 0:E.onGridAlphaChange)==null||C.call(E,x),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:j(),alpha:x}}))},P=x=>{var E,C;(C=(E=this.options)==null?void 0:E.onPlayModeChange)==null||C.call(E,x),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:x}}))},_=x=>{var E,C;(C=(E=this.options)==null?void 0:E.onBackgroundCoverChange)==null||C.call(E,x),window.dispatchEvent(new CustomEvent("scene-editor:background-cover",{detail:{enabled:x}}))},I=x=>{var E,C;(C=(E=this.options)==null?void 0:E.onBackgroundLockChange)==null||C.call(E,x),window.dispatchEvent(new CustomEvent("scene-editor:background-lock",{detail:{enabled:x}}))},j=()=>{if(!d)return 50;let x=Number(d.value),E=Number.isFinite(x)?Math.min(200,Math.max(4,x)):50;return d.value=String(E),E},L=x=>{c&&(c.checked=x),d&&(d.disabled=!x),p&&(p.disabled=!x),f==null||f.classList.toggle("active",x)},S=x=>{g&&(g.checked=x),b==null||b.classList.toggle("active",x)};try{let x=localStorage.getItem(this.getSceneStorageKey("grid_enabled")),E=localStorage.getItem(this.getSceneStorageKey("grid_gap")),C=localStorage.getItem(this.getSceneStorageKey("grid_alpha")),A=localStorage.getItem(this.getSceneStorageKey("highlight_anchor")),k=localStorage.getItem(this.getSceneStorageKey("background_cover")),R=localStorage.getItem(this.getSceneStorageKey("background_lock")),M=x?x==="true":!1;L(M),d&&(d.value=E||"50",d.disabled=!M),p&&(p.value=C||"0.25",p.disabled=!M,y()),r&&(r.checked=A==="true",a("anchor",r.checked));let O=!0;S(O),g&&(g.disabled=!0),b&&(b.disabled=!0);try{localStorage.setItem(this.getSceneStorageKey("play_mode"),O?"true":"false")}catch{}w(M,j(),y()),P(O);let D=k?k==="true":!0,N=R?R==="true":!0;h&&(h.checked=D),m&&(m.checked=N),_(D),I(N),r&&window.dispatchEvent(new CustomEvent("scene-editor:highlight-anchor",{detail:{enabled:r.checked}}))}catch{}c==null||c.addEventListener("change",()=>{let x=j(),E=y();d&&(d.disabled=!c.checked),p&&(p.disabled=!c.checked),f==null||f.classList.toggle("active",c.checked);try{localStorage.setItem(this.getSceneStorageKey("grid_enabled"),c.checked?"true":"false"),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(x)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(E))}catch{}w(c.checked,x,E)}),d==null||d.addEventListener("input",()=>{let x=j(),E=y();try{localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(x)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(E))}catch{}v(x)}),p==null||p.addEventListener("input",()=>{let x=y(),E=j();try{localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(x)),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(E))}catch{}T(x)}),g==null||g.addEventListener("change",()=>{try{localStorage.setItem(this.getSceneStorageKey("play_mode"),g.checked?"true":"false")}catch{}b==null||b.classList.toggle("active",g.checked),P(g.checked)}),h==null||h.addEventListener("change",()=>{try{localStorage.setItem(this.getSceneStorageKey("background_cover"),h.checked?"true":"false")}catch{}_(h.checked)}),m==null||m.addEventListener("change",()=>{try{localStorage.setItem(this.getSceneStorageKey("background_lock"),m.checked?"true":"false")}catch{}I(m.checked)}),f==null||f.addEventListener("click",()=>{c&&(c.checked=!c.checked,c.dispatchEvent(new Event("change")))}),b==null||b.addEventListener("click",()=>{g&&(g.checked=!g.checked,g.dispatchEvent(new Event("change")))})}updateInfo(e){}};var oi=class{constructor(){this.root=null;this.options=null}render(){return`
689
689
  <div class="nudge-panel hidden" data-panel="nudge-panel">
690
690
  <div class="nudge-panel-header" data-panel-handle>
691
691
  <span class="nudge-panel-title">Nudge Controls</span>
@@ -770,7 +770,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
770
770
  </div>
771
771
  <div class="panel-resize-handle" data-panel-resize></div>
772
772
  </div>
773
- `}initialize(e,t){var a,s,r,l,c,d,p,u;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]"),this.assetsContainer=(s=this.root)==null?void 0:s.querySelector("[data-library-assets]"),this.assetSearchInput=(r=this.root)==null?void 0:r.querySelector("[data-library-asset-search]"),this.slotSearchInput=(l=this.root)==null?void 0:l.querySelector("[data-library-slot-search]");let i=(c=this.root)==null?void 0:c.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(d=this.root)==null?void 0:d.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),(p=this.assetSearchInput)==null||p.addEventListener("input",()=>this.scheduleRenderAssets()),(u=this.slotSearchInput)==null||u.addEventListener("input",()=>this.scheduleRenderSlots()),window.addEventListener("preview:select",g=>{var m;let h=(m=g.detail)==null?void 0:m.objectId;h&&this.highlightCurrentObject(h)}),this.loadAssetRegistry()}highlightCurrentObject(e){if(!this.registry)return;let t=this.registry.slots.find(i=>i.objectId===e);t&&(this.selectedSlotId=t.slotId,this.scheduleRenderSlots(),setTimeout(()=>{var n;let i=(n=this.slotsContainer)==null?void 0:n.querySelector(`[data-slot-id="${t.slotId}"]`);i&&i.scrollIntoView({behavior:"smooth",block:"center"})},100))}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),a=this.mergeRegistries(t,n);window.getEditableAssets=()=>a,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}resetSearch(){this.assetSearchInput&&(this.assetSearchInput.value=""),this.slotSearchInput&&(this.slotSearchInput.value=""),this.scheduleRenderAssets(),this.scheduleRenderSlots()}loadAssetRegistry(e=0){var i,n,a,s;let t=window.getEditableAssets;if(typeof t=="function"){let r=t();if(r!=null&&r.slots&&Array.isArray(r.slots)&&r.slots.length>0){if(this.registry=r,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.cacheBust=Date.now(),this.cachedAssets={},this.pendingAssetFetches={},this.missingPreviewPaths.clear(),!(this.selectedSlotId&&this.registry.slots.some(c=>c.slotId===this.selectedSlotId))){let c=window.__getSelectedObjectId,d=typeof c=="function"?c():null;if(d){let p=this.registry.slots.find(u=>u.objectId===d);p?this.selectedSlotId=p.slotId:this.selectedSlotId=(n=(i=this.registry.slots[0])==null?void 0:i.slotId)!=null?n:null}else this.selectedSlotId=(s=(a=this.registry.slots[0])==null?void 0:a.slotId)!=null?s:null}this.renderSlots(),this.renderAssets();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){var n;if(!this.slotsContainer||!this.registry)return;let e={};for(let a of this.registry.slots)e[a.category]||(e[a.category]=[]),e[a.category].push(a);let t=this.cacheBust||Date.now(),i=(((n=this.slotSearchInput)==null?void 0:n.value)||"").trim().toLowerCase();this.slotsContainer.innerHTML="";for(let a of this.getCategories()){let s=(e[a]||[]).filter(d=>i?`${d.displayName} ${d.slotId} ${d.objectId} ${d.currentAsset}`.toLowerCase().includes(i):!0);if(s.length===0)continue;let r=document.createElement("div");r.className="library-category";let l=document.createElement("div");l.className="library-category-header",l.textContent=this.formatCategoryName(a),r.appendChild(l);let c=document.createElement("div");c.className="library-category-slots";for(let d of s){let p=this.createSlotElement(d,t);c.appendChild(p)}r.appendChild(c),this.slotsContainer.appendChild(r)}if(!this.slotsContainer.hasChildNodes()){let a=document.createElement("div");a.className="library-info",a.textContent=i?"No slots match your search":"No editable slots available",this.slotsContainer.appendChild(a)}}createSlotElement(e,t){var y,w;let i=this.selectedSlotId===e.slotId,n=window.__getSelectedObjectId,s=(typeof n=="function"?n():null)===e.objectId,r=document.createElement("div");r.className=`library-slot ${i?"expanded":""} ${s?"current-object":""}`,r.dataset.slotId=e.slotId,r.dataset.objectId=e.objectId;let l=document.createElement("div");l.className="slot-header";let c=document.createElement("div");if(c.className="slot-current",(y=e.currentAsset)==null?void 0:y.toLowerCase().endsWith(".json")){let v=document.createElement("div");v.className="slot-thumbnail slot-thumbnail-json",v.textContent="\u{1F3AC}",v.title="Lottie/JSON Animation",c.appendChild(v)}else{let v=document.createElement("img"),T=this.resolveSlotPreviewPaths(e),P=T.primary,_=(w=T.fallback)!=null?w:null;if(!P)v.style.display="none";else if(this.missingPreviewPaths.has(P.key)&&(!_||this.missingPreviewPaths.has(_.key)))v.style.display="none";else{v.src=P.src(t),v.alt=e.displayName,v.className="slot-thumbnail",v.loading="lazy";let I=!1;v.onerror=()=>{if(I){v.onerror=null,v.style.display="none";return}if(this.missingPreviewPaths.add(P.key),_&&!this.missingPreviewPaths.has(_.key)){I=!0,v.src=_.src(t);return}_&&this.missingPreviewPaths.add(_.key),v.style.display="none"}}c.appendChild(v)}l.appendChild(c);let p=document.createElement("div");p.className="slot-info";let u=document.createElement("div");u.className="slot-name",u.textContent=e.displayName;let g=document.createElement("div");g.className="slot-asset",g.textContent=e.currentAsset,p.appendChild(u),p.appendChild(g),l.appendChild(p);let h=document.createElement("div");h.className="slot-actions";let m=document.createElement("button");m.className="slot-ai-edit",m.title="Edit with AI",m.textContent="\u2728 AI",m.addEventListener("click",async v=>{v.stopPropagation(),await this.handleAIEdit(e)}),h.appendChild(m);let f=document.createElement("button");f.className="slot-upload",f.title="Upload new asset",f.textContent="\u{1F4E4}",f.addEventListener("click",async v=>{v.stopPropagation(),await this.handleUpload(e)}),h.appendChild(f);let b=document.createElement("button");return b.className="slot-reset",b.title="Reset to default",b.textContent="\u21BA",b.addEventListener("click",async v=>{v.stopPropagation(),await this.handleReset(e)}),h.appendChild(b),l.appendChild(h),l.addEventListener("click",()=>{this.selectedSlotId=e.slotId,this.renderSlots(),this.renderAssets()}),r.appendChild(l),r}renderAssets(){var l;if(!this.assetsContainer||!this.registry)return;let e=this.cacheBust||Date.now(),t=(((l=this.assetSearchInput)==null?void 0:l.value)||"").trim().toLowerCase(),i=this.getSelectedSlot();this.assetsContainer.innerHTML="";let n=document.createElement("div");n.className="library-selected",n.textContent=i?`Selected slot: ${i.displayName} (${i.currentAsset||"no asset"})`:"Select a slot to apply assets",n.style.gridColumn="1 / -1",this.assetsContainer.appendChild(n);let a=this.getCategories(),s=!1,r=!1;for(let c of a){let d=this.getCategoryAssets(c,e);if(!d){let m=document.createElement("div");m.className="library-empty",m.textContent=`Loading ${this.formatCategoryName(c)} assets...`,this.assetsContainer.appendChild(m),r=!0;continue}let p=d.filter(m=>t?`${m.displayName} ${m.filename} ${c}`.toLowerCase().includes(t):!0);if(p.length===0)continue;let u=document.createElement("div");u.className="library-category";let g=document.createElement("div");g.className="library-category-header",g.textContent=this.formatCategoryName(c),u.appendChild(g);let h=document.createElement("div");h.className="slot-library",h.style.borderTop="none",h.style.padding="10px";for(let m of p){let f=document.createElement("div");f.className="library-item",i&&i.currentAsset===m.filename&&i.libraryFolder===c&&f.classList.add("selected");let b=document.createElement("img"),y=this.resolveLibraryAssetPath(c,m.filename);this.missingPreviewPaths.has(y.key)?b.style.display="none":b.src=y.src(e),b.alt=m.displayName,b.className="library-thumbnail",b.loading="lazy",b.onerror=()=>{this.missingPreviewPaths.add(y.key),b.style.opacity="0.3"},f.appendChild(b);let w=document.createElement("div");w.className="library-label",w.textContent=m.displayName,f.appendChild(w),f.addEventListener("click",async()=>{if(!i){alert("Select a slot first to apply an asset.");return}await this.handleApply(i,m.filename,c)}),h.appendChild(f),s=!0}u.appendChild(h),this.assetsContainer.appendChild(u)}if(!s&&!r){let c=document.createElement("div");c.className="library-empty",c.textContent=t?"No assets match your search":"No assets available",this.assetsContainer.appendChild(c)}}getCategoryAssets(e,t){var i;if(this.cachedAssets[e])return this.cachedAssets[e];if(!this.pendingAssetFetches[e]){let n=((i=this.registry)==null?void 0:i.libraryAssets[e])||[];this.pendingAssetFetches[e]=this.fetchFolderAssets(e,t).then(a=>{let s=new Map;for(let r of n)s.set(r.filename,r);for(let r of a)s.has(r.filename)||s.set(r.filename,r);return this.cachedAssets[e]=Array.from(s.values()),delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]}).catch(()=>(this.cachedAssets[e]=n,delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]))}return null}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],s=/href="([^"]+\.(png|jpg|jpeg))"/gi,r;for(;(r=s.exec(n))!==null;){let l=r[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t,i){var n,a,s;if(this.isApplying){console.warn("[LIBRARY] \u26A0\uFE0F Apply already in progress, ignoring duplicate click");return}this.isApplying=!0,console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let r=window.__wizardAssetPicker;if(r!=null&&r.onPick){let d=`raw/library/${i||e.libraryFolder||e.category}/${t}`;r.onPick(d),window.__wizardAssetPicker=null;return}let l=i||e.libraryFolder||e.category;if((n=this.options)!=null&&n.onApply){await this.options.onApply(e.objectId,t,l),await new Promise(d=>setTimeout(d,200));let c=window.getEditableObjectConfig;if(typeof c=="function"){let d=c(e.objectId),p=((s=(a=d==null?void 0:d.render)==null?void 0:a.asset)==null?void 0:s.path)||"",u=`raw/library/${l}/${t}`;if(p===u||p.includes(t))console.log("[LIBRARY] \u2705 Asset confirmed applied:",p);else throw console.error("[LIBRARY] \u274C Asset NOT applied! Expected:",u,"Got:",p),new Error(`Asset was not applied correctly. Expected: ${u}, Got: ${p}`)}}e.currentAsset=t,e.libraryFolder=l,this.renderSlots(),this.renderAssets()}catch(r){throw console.error("[LIBRARY] \u274C Failed to apply asset:",r),alert(`Failed to apply asset: ${r instanceof Error?r.message:String(r)}`),r}finally{this.isApplying=!1}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots(),this.renderAssets()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}getCategories(){if(!this.registry)return[];let e=new Set;if(Array.isArray(this.registry.categories))for(let t of this.registry.categories)t&&e.add(t);for(let t of Object.keys(this.registry.libraryAssets||{}))t&&e.add(t);for(let t of this.registry.slots||[])t!=null&&t.category&&e.add(t.category);return Array.from(e)}getSelectedSlot(){return!this.registry||!this.selectedSlotId?null:this.registry.slots.find(e=>e.slotId===this.selectedSlotId)||null}scheduleRenderSlots(){this.slotSearchDebounce&&window.clearTimeout(this.slotSearchDebounce),this.slotSearchDebounce=window.setTimeout(()=>{this.slotSearchDebounce=null,this.renderSlots()},150)}scheduleRenderAssets(){this.assetSearchDebounce&&window.clearTimeout(this.assetSearchDebounce),this.assetSearchDebounce=window.setTimeout(()=>{this.assetSearchDebounce=null,this.renderAssets()},150)}resolveSlotPreviewPaths(e){let t=(e.currentAsset||"").trim();if(!t)return{primary:null,fallback:null};let i=t.replace(/^\/+/,""),n=null,a=null;return i.startsWith("raw/")?n=i:i.startsWith("library/")?n=`raw/${i}`:i.includes("/")?n=i:e.libraryFolder?(n=`raw/library/${e.libraryFolder}/${i}`,a=`raw/${i}`):n=`raw/${i}`,{primary:n?{key:n,src:l=>`/${n}?t=${l}`}:null,fallback:a?{key:a,src:l=>`/${a}?t=${l}`}:null}}resolveLibraryAssetPath(e,t){let i=t.replace(/^\/+/,""),n="";return i.startsWith("raw/")?n=i:i.startsWith("library/")?n=`raw/${i}`:i.includes("/")?n=i:n=`raw/library/${e}/${i}`,{key:n,src:a=>`/${n}?t=${a}`}}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n,a,s,r,l;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let c=await this.fileToDataUrl(i);if(!c){alert("Failed to read file");return}let d=e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),p=((a=i.name.toLowerCase().match(/\.(png|jpg|jpeg|gif|webp)$/))==null?void 0:a[1])||"png",u=p==="jpg"?"jpeg":p,g=`${d}_uploaded_${Date.now()}.${u}`,h=e.category;console.log("[Library] Saving uploaded file:",g,"to category:",h);let f=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:h,filename:g,data:c,overwrite:!0})})).json();if(f.success){console.log("[Library] \u2705 Upload saved:",f.path),await new Promise(j=>setTimeout(j,100));let b=window.addAssetToRegistry;typeof b=="function"&&(b(h,g),console.log("[Library] \u2705 Added to registry:",h,g));let y=window.getEditableAssets;if(typeof y=="function"){let j=y();j&&!j.categories&&(j.categories=[]),j!=null&&j.categories&&!j.categories.includes(h)&&(j.categories.push(h),console.log(`[Library] Added category ${h} to registry`))}let w=!1,v=0,T=10;for(;!w&&v<T;){v++,console.log(`[Library] Refresh attempt ${v}/${T}...`);try{(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok&&console.log("[Library] \u2705 Registry rebuilt from disk")}catch(S){console.warn("[Library] Setup-library not available:",S)}await new Promise(S=>setTimeout(S,300)),await this.refresh();let j=window.reRenderAssetLibrary;typeof j=="function"&&(console.log("[Library] Re-rendering library panel..."),j());let L=window.getEditableAssets;if(typeof L=="function"){let S=L(),x=((s=S==null?void 0:S.libraryAssets)==null?void 0:s[h])||[];x.some(A=>(A==null?void 0:A.filename)===g)?(console.log("[Library] \u2705 Asset found in registry!"),w=!0):(console.log(`[Library] Asset not found yet, retrying... (found ${x.length} assets in ${h})`),await new Promise(A=>setTimeout(A,500)))}else v>=2&&(w=!0)}w||console.warn("[Library] \u26A0\uFE0F Asset not found in registry after retries, proceeding anyway...");let P=!1,_=0,I=5;for(;!P&&_<I;){_++;try{console.log(`[Library] Applying asset attempt ${_}/${I}...`),await this.handleApply(e,g,e.category),await new Promise(L=>setTimeout(L,200));let j=window.getEditableObjectConfig;if(typeof j=="function"){let L=j(e.objectId),S=((l=(r=L==null?void 0:L.render)==null?void 0:r.asset)==null?void 0:l.path)||"";S===f.path||S.includes(g)?(console.log("[Library] \u2705 Asset confirmed applied to object"),P=!0):(console.log(`[Library] Asset not applied yet (attempt ${_}), retrying...`),await new Promise(x=>setTimeout(x,300)))}else P=!0}catch(j){console.error(`[Library] Apply attempt ${_} failed:`,j),_<I&&await new Promise(L=>setTimeout(L,500))}}e.currentAsset=g,await this.refresh(),setTimeout(()=>{try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),console.log("[Library] Dispatched config:changed event")}catch(j){console.warn("[Library] Failed to refresh textures:",j)}},300),setTimeout(()=>{this.highlightSlot(e.objectId,h)},1e3),P?console.log("[Library] \u2705 Upload complete and applied!"):console.warn("[Library] \u26A0\uFE0F Upload succeeded but apply may have failed")}else console.error("[Library] \u274C Upload failed:",f.error),alert(`Upload failed: ${f.error}`)}catch(c){console.error("[Library] \u274C Upload error:",c),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.selectedSlotId=n.slotId,this.renderSlots(),this.renderAssets(),setTimeout(()=>{var s;let a=(s=this.slotsContainer)==null?void 0:s.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var li=class{detectType(e,t,i){let n=e.toLowerCase();return n==="logic_id"||n==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":n.includes("color")||n.includes("tint")?"color":typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":typeof t=="object"&&t!==null?"object":"text"}isHexColor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)}isImagePath(e){return/\.(png|jpg|jpeg|gif|svg)$/i.test(e)}};var ci=class{render(e,t,i,n){let a=this.formatLabel(t),s=i?this.getThumbnailUrl(i):"";return`
773
+ `}initialize(e,t){var a,s,r,l,c,d,p,u;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]"),this.assetsContainer=(s=this.root)==null?void 0:s.querySelector("[data-library-assets]"),this.assetSearchInput=(r=this.root)==null?void 0:r.querySelector("[data-library-asset-search]"),this.slotSearchInput=(l=this.root)==null?void 0:l.querySelector("[data-library-slot-search]");let i=(c=this.root)==null?void 0:c.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(d=this.root)==null?void 0:d.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),(p=this.assetSearchInput)==null||p.addEventListener("input",()=>this.scheduleRenderAssets()),(u=this.slotSearchInput)==null||u.addEventListener("input",()=>this.scheduleRenderSlots()),window.addEventListener("preview:select",g=>{var m;let h=(m=g.detail)==null?void 0:m.objectId;h&&this.highlightCurrentObject(h)}),this.loadAssetRegistry()}highlightCurrentObject(e){if(!this.registry)return;let t=this.registry.slots.find(i=>i.objectId===e);t&&(this.selectedSlotId=t.slotId,this.scheduleRenderSlots(),setTimeout(()=>{var n;let i=(n=this.slotsContainer)==null?void 0:n.querySelector(`[data-slot-id="${t.slotId}"]`);i&&i.scrollIntoView({behavior:"smooth",block:"center"})},100))}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),a=this.mergeRegistries(t,n);window.getEditableAssets=()=>a,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}resetSearch(){this.assetSearchInput&&(this.assetSearchInput.value=""),this.slotSearchInput&&(this.slotSearchInput.value=""),this.scheduleRenderAssets(),this.scheduleRenderSlots()}loadAssetRegistry(e=0){var i,n,a,s;let t=window.getEditableAssets;if(typeof t=="function"){let r=t();if(r!=null&&r.slots&&Array.isArray(r.slots)&&r.slots.length>0){if(this.registry=r,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.cacheBust=Date.now(),this.cachedAssets={},this.pendingAssetFetches={},this.missingPreviewPaths.clear(),!(this.selectedSlotId&&this.registry.slots.some(c=>c.slotId===this.selectedSlotId))){let c=window.__getSelectedObjectId,d=typeof c=="function"?c():null;if(d){let p=this.registry.slots.find(u=>u.objectId===d);p?this.selectedSlotId=p.slotId:this.selectedSlotId=(n=(i=this.registry.slots[0])==null?void 0:i.slotId)!=null?n:null}else this.selectedSlotId=(s=(a=this.registry.slots[0])==null?void 0:a.slotId)!=null?s:null}this.renderSlots(),this.renderAssets();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){var n;if(!this.slotsContainer||!this.registry)return;let e={};for(let a of this.registry.slots)e[a.category]||(e[a.category]=[]),e[a.category].push(a);let t=this.cacheBust||Date.now(),i=(((n=this.slotSearchInput)==null?void 0:n.value)||"").trim().toLowerCase();this.slotsContainer.innerHTML="";for(let a of this.getCategories()){let s=(e[a]||[]).filter(d=>i?`${d.displayName} ${d.slotId} ${d.objectId} ${d.currentAsset}`.toLowerCase().includes(i):!0);if(s.length===0)continue;let r=document.createElement("div");r.className="library-category";let l=document.createElement("div");l.className="library-category-header",l.textContent=this.formatCategoryName(a),r.appendChild(l);let c=document.createElement("div");c.className="library-category-slots";for(let d of s){let p=this.createSlotElement(d,t);c.appendChild(p)}r.appendChild(c),this.slotsContainer.appendChild(r)}if(!this.slotsContainer.hasChildNodes()){let a=document.createElement("div");a.className="library-info",a.textContent=i?"No slots match your search":"No editable slots available",this.slotsContainer.appendChild(a)}}createSlotElement(e,t){var y,w;let i=this.selectedSlotId===e.slotId,n=window.__getSelectedObjectId,s=(typeof n=="function"?n():null)===e.objectId,r=document.createElement("div");r.className=`library-slot ${i?"expanded":""} ${s?"current-object":""}`,r.dataset.slotId=e.slotId,r.dataset.objectId=e.objectId;let l=document.createElement("div");l.className="slot-header";let c=document.createElement("div");if(c.className="slot-current",(y=e.currentAsset)==null?void 0:y.toLowerCase().endsWith(".json")){let v=document.createElement("div");v.className="slot-thumbnail slot-thumbnail-json",v.textContent="\u{1F3AC}",v.title="Lottie/JSON Animation",c.appendChild(v)}else{let v=document.createElement("img"),T=this.resolveSlotPreviewPaths(e),P=T.primary,_=(w=T.fallback)!=null?w:null;if(!P)v.style.display="none";else if(this.missingPreviewPaths.has(P.key)&&(!_||this.missingPreviewPaths.has(_.key)))v.style.display="none";else{v.src=P.src(t),v.alt=e.displayName,v.className="slot-thumbnail",v.loading="lazy";let I=!1;v.onerror=()=>{if(I){v.onerror=null,v.style.display="none";return}if(this.missingPreviewPaths.add(P.key),_&&!this.missingPreviewPaths.has(_.key)){I=!0,v.src=_.src(t);return}_&&this.missingPreviewPaths.add(_.key),v.style.display="none"}}c.appendChild(v)}l.appendChild(c);let p=document.createElement("div");p.className="slot-info";let u=document.createElement("div");u.className="slot-name",u.textContent=e.displayName;let g=document.createElement("div");g.className="slot-asset",g.textContent=e.currentAsset,p.appendChild(u),p.appendChild(g),l.appendChild(p);let h=document.createElement("div");h.className="slot-actions";let m=document.createElement("button");m.className="slot-ai-edit",m.title="Edit with AI",m.textContent="\u2728 AI",m.addEventListener("click",async v=>{v.stopPropagation(),await this.handleAIEdit(e)}),h.appendChild(m);let f=document.createElement("button");f.className="slot-upload",f.title="Upload new asset",f.textContent="\u{1F4E4}",f.addEventListener("click",async v=>{v.stopPropagation(),await this.handleUpload(e)}),h.appendChild(f);let b=document.createElement("button");return b.className="slot-reset",b.title="Reset to default",b.textContent="\u21BA",b.addEventListener("click",async v=>{v.stopPropagation(),await this.handleReset(e)}),h.appendChild(b),l.appendChild(h),l.addEventListener("click",()=>{this.selectedSlotId=e.slotId,this.renderSlots(),this.renderAssets()}),r.appendChild(l),r}renderAssets(){var l;if(!this.assetsContainer||!this.registry)return;let e=this.cacheBust||Date.now(),t=(((l=this.assetSearchInput)==null?void 0:l.value)||"").trim().toLowerCase(),i=this.getSelectedSlot();this.assetsContainer.innerHTML="";let n=document.createElement("div");n.className="library-selected",n.textContent=i?`Selected slot: ${i.displayName} (${i.currentAsset||"no asset"})`:"Select a slot to apply assets",n.style.gridColumn="1 / -1",this.assetsContainer.appendChild(n);let a=this.getCategories(),s=!1,r=!1;for(let c of a){let d=this.getCategoryAssets(c,e);if(!d){let m=document.createElement("div");m.className="library-empty",m.textContent=`Loading ${this.formatCategoryName(c)} assets...`,this.assetsContainer.appendChild(m),r=!0;continue}let p=d.filter(m=>t?`${m.displayName} ${m.filename} ${c}`.toLowerCase().includes(t):!0);if(p.length===0)continue;let u=document.createElement("div");u.className="library-category";let g=document.createElement("div");g.className="library-category-header",g.textContent=this.formatCategoryName(c),u.appendChild(g);let h=document.createElement("div");h.className="slot-library",h.style.borderTop="none",h.style.padding="10px";for(let m of p){let f=document.createElement("div");f.className="library-item",i&&i.currentAsset===m.filename&&i.libraryFolder===c&&f.classList.add("selected");let b=document.createElement("img"),y=this.resolveLibraryAssetPath(c,m.filename);this.missingPreviewPaths.has(y.key)?b.style.display="none":b.src=y.src(e),b.alt=m.displayName,b.className="library-thumbnail",b.loading="lazy",b.onerror=()=>{this.missingPreviewPaths.add(y.key),b.style.opacity="0.3"},f.appendChild(b);let w=document.createElement("div");w.className="library-label",w.textContent=m.displayName,f.appendChild(w),f.addEventListener("click",async()=>{if(!i){alert("Select a slot first to apply an asset.");return}await this.handleApply(i,m.filename,c)}),h.appendChild(f),s=!0}u.appendChild(h),this.assetsContainer.appendChild(u)}if(!s&&!r){let c=document.createElement("div");c.className="library-empty",c.textContent=t?"No assets match your search":"No assets available",this.assetsContainer.appendChild(c)}}getCategoryAssets(e,t){var i;if(this.cachedAssets[e])return this.cachedAssets[e];if(!this.pendingAssetFetches[e]){let n=((i=this.registry)==null?void 0:i.libraryAssets[e])||[];this.pendingAssetFetches[e]=this.fetchFolderAssets(e,t).then(a=>{let s=new Map;for(let r of n)s.set(r.filename,r);for(let r of a)s.has(r.filename)||s.set(r.filename,r);return this.cachedAssets[e]=Array.from(s.values()),delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]}).catch(()=>(this.cachedAssets[e]=n,delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]))}return null}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],s=/href="([^"]+\.(png|jpg|jpeg))"/gi,r;for(;(r=s.exec(n))!==null;){let l=r[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t,i){var n,a,s;if(this.isApplying){console.warn("[LIBRARY] \u26A0\uFE0F Apply already in progress, ignoring duplicate click");return}this.isApplying=!0,console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let r=window.__wizardAssetPicker;if(r!=null&&r.onPick){let d=`raw/library/${i||e.libraryFolder||e.category}/${t}`;r.onPick(d),window.__wizardAssetPicker=null;return}let l=i||e.libraryFolder||e.category;if((n=this.options)!=null&&n.onApply){await this.options.onApply(e.objectId,t,l),await new Promise(d=>setTimeout(d,200));let c=window.getEditableObjectConfig;if(typeof c=="function"){let d=c(e.objectId),p=((s=(a=d==null?void 0:d.render)==null?void 0:a.asset)==null?void 0:s.path)||"",u=`raw/library/${l}/${t}`;if(p===u||p.includes(t))console.log("[LIBRARY] \u2705 Asset confirmed applied:",p);else throw console.error("[LIBRARY] \u274C Asset NOT applied! Expected:",u,"Got:",p),new Error(`Asset was not applied correctly. Expected: ${u}, Got: ${p}`)}}e.currentAsset=t,e.libraryFolder=l,this.renderSlots(),this.renderAssets()}catch(r){throw console.error("[LIBRARY] \u274C Failed to apply asset:",r),alert(`Failed to apply asset: ${r instanceof Error?r.message:String(r)}`),r}finally{this.isApplying=!1}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots(),this.renderAssets()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}getCategories(){if(!this.registry)return[];let e=new Set;if(Array.isArray(this.registry.categories))for(let t of this.registry.categories)t&&e.add(t);for(let t of Object.keys(this.registry.libraryAssets||{}))t&&e.add(t);for(let t of this.registry.slots||[])t!=null&&t.category&&e.add(t.category);return Array.from(e)}getSelectedSlot(){return!this.registry||!this.selectedSlotId?null:this.registry.slots.find(e=>e.slotId===this.selectedSlotId)||null}scheduleRenderSlots(){this.slotSearchDebounce&&window.clearTimeout(this.slotSearchDebounce),this.slotSearchDebounce=window.setTimeout(()=>{this.slotSearchDebounce=null,this.renderSlots()},150)}scheduleRenderAssets(){this.assetSearchDebounce&&window.clearTimeout(this.assetSearchDebounce),this.assetSearchDebounce=window.setTimeout(()=>{this.assetSearchDebounce=null,this.renderAssets()},150)}resolveSlotPreviewPaths(e){let t=(e.currentAsset||"").trim();if(!t)return{primary:null,fallback:null};let i=t.replace(/^\/+/,""),n=null,a=null;return i.startsWith("raw/")?n=i:i.startsWith("library/")?n=`raw/${i}`:i.includes("/")?n=i:e.libraryFolder?(n=`raw/library/${e.libraryFolder}/${i}`,a=`raw/${i}`):n=`raw/${i}`,{primary:n?{key:n,src:l=>`/${n}?t=${l}`}:null,fallback:a?{key:a,src:l=>`/${a}?t=${l}`}:null}}resolveLibraryAssetPath(e,t){let i=t.replace(/^\/+/,""),n="";return i.startsWith("raw/")?n=i:i.startsWith("library/")?n=`raw/${i}`:i.includes("/")?n=i:n=`raw/library/${e}/${i}`,{key:n,src:a=>`/${n}?t=${a}`}}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n,a,s,r,l;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let c=await this.fileToDataUrl(i);if(!c){alert("Failed to read file");return}let d=e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),p=((a=i.name.toLowerCase().match(/\.(png|jpg|jpeg|gif|webp)$/))==null?void 0:a[1])||"png",u=p==="jpg"?"jpeg":p,g=`${d}_uploaded_${Date.now()}.${u}`,h=e.category;console.log("[Library] Saving uploaded file:",g,"to category:",h);let f=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:h,filename:g,data:c,overwrite:!0})})).json();if(f.success){console.log("[Library] \u2705 Upload saved:",f.path),await new Promise(j=>setTimeout(j,100));let b=window.addAssetToRegistry;typeof b=="function"&&(b(h,g),console.log("[Library] \u2705 Added to registry:",h,g));let y=window.getEditableAssets;if(typeof y=="function"){let j=y();j&&!j.categories&&(j.categories=[]),j!=null&&j.categories&&!j.categories.includes(h)&&(j.categories.push(h),console.log(`[Library] Added category ${h} to registry`))}let w=!1,v=0,T=10;for(;!w&&v<T;){v++,console.log(`[Library] Refresh attempt ${v}/${T}...`);try{(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok&&console.log("[Library] \u2705 Registry rebuilt from disk")}catch(S){console.warn("[Library] Setup-library not available:",S)}await new Promise(S=>setTimeout(S,300)),await this.refresh();let j=window.reRenderAssetLibrary;typeof j=="function"&&(console.log("[Library] Re-rendering library panel..."),j());let L=window.getEditableAssets;if(typeof L=="function"){let S=L(),x=((s=S==null?void 0:S.libraryAssets)==null?void 0:s[h])||[];x.some(C=>(C==null?void 0:C.filename)===g)?(console.log("[Library] \u2705 Asset found in registry!"),w=!0):(console.log(`[Library] Asset not found yet, retrying... (found ${x.length} assets in ${h})`),await new Promise(C=>setTimeout(C,500)))}else v>=2&&(w=!0)}w||console.warn("[Library] \u26A0\uFE0F Asset not found in registry after retries, proceeding anyway...");let P=!1,_=0,I=5;for(;!P&&_<I;){_++;try{console.log(`[Library] Applying asset attempt ${_}/${I}...`),await this.handleApply(e,g,e.category),await new Promise(L=>setTimeout(L,200));let j=window.getEditableObjectConfig;if(typeof j=="function"){let L=j(e.objectId),S=((l=(r=L==null?void 0:L.render)==null?void 0:r.asset)==null?void 0:l.path)||"";S===f.path||S.includes(g)?(console.log("[Library] \u2705 Asset confirmed applied to object"),P=!0):(console.log(`[Library] Asset not applied yet (attempt ${_}), retrying...`),await new Promise(x=>setTimeout(x,300)))}else P=!0}catch(j){console.error(`[Library] Apply attempt ${_} failed:`,j),_<I&&await new Promise(L=>setTimeout(L,500))}}e.currentAsset=g,await this.refresh(),setTimeout(()=>{try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),console.log("[Library] Dispatched config:changed event")}catch(j){console.warn("[Library] Failed to refresh textures:",j)}},300),setTimeout(()=>{this.highlightSlot(e.objectId,h)},1e3),P?console.log("[Library] \u2705 Upload complete and applied!"):console.warn("[Library] \u26A0\uFE0F Upload succeeded but apply may have failed")}else console.error("[Library] \u274C Upload failed:",f.error),alert(`Upload failed: ${f.error}`)}catch(c){console.error("[Library] \u274C Upload error:",c),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.selectedSlotId=n.slotId,this.renderSlots(),this.renderAssets(),setTimeout(()=>{var s;let a=(s=this.slotsContainer)==null?void 0:s.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var li=class{detectType(e,t,i){let n=e.toLowerCase();return n==="logic_id"||n==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":n.includes("color")||n.includes("tint")?"color":typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":typeof t=="object"&&t!==null?"object":"text"}isHexColor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)}isImagePath(e){return/\.(png|jpg|jpeg|gif|svg)$/i.test(e)}};var ci=class{render(e,t,i,n){let a=this.formatLabel(t),s=i?this.getThumbnailUrl(i):"";return`
774
774
  <div class="inspector-property" data-property-type="image">
775
775
  <div class="inspector-property-header">
776
776
  <label class="inspector-label">${a}</label>
@@ -1079,7 +1079,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
1079
1079
  </div>
1080
1080
  </div>
1081
1081
  </div>
1082
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};import{Graphics as Wr}from"pixi.js";var ze={width:400,height:600,designWidth:400,scaleFactor:1},xi={scale:1,position:1},Si=[];function Kr(o,e,t,i,n,a,s){Si.push({element:o,originalScale:a,positionHelper:e,heightPercent:n}),e(o,t,i,n,a,s,!1)}function Xr(){Si.forEach(({element:o,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*ze.scaleFactor;t(o,ze.width,ze.height,i,n,!0,!1)})}function Jr(){Si.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function fn(o,e){console.log(`[SCREEN] updateScreenState called: ${o}x${e}`),ze.width=o,ze.height=e,ze.scaleFactor=Math.min(o/ze.designWidth,1.15),xi.scale=ze.scaleFactor,xi.position=1,console.log(`[SCREEN] Global multipliers - scale: ${xi.scale.toFixed(3)}`),Xr()}var ae={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 Zr(o,e,t){let i=ae[o];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${o}.${e} = ${t}`))}function Qr(){return ae}var eo={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 wi(o,e){return typeof o=="number"&&Number.isFinite(o)?o:e}function $e(o,e={x:.5,y:.5}){var t;if(Array.isArray(o))return{x:wi(o[0],e.x),y:wi(o[1],e.y)};if(o&&typeof o=="object"){let i=o;return{x:wi(i.x,e.x),y:wi(i.y,e.y)}}if(typeof o=="string"){let i=o.trim().toLowerCase();return(t=eo[i])!=null?t:e}return e}function Se(o,e,t,i={}){var g,h,m,f,b,y;let n=$e(t),a=(g=i.inset)!=null?g:{},s=(h=i.padding)!=null?h:{x:0,y:0},r=((m=a.left)!=null?m:0)+s.x,l=((f=a.right)!=null?f:0)+s.x,c=((b=a.top)!=null?b:0)+s.y,d=((y=a.bottom)!=null?y:0)+s.y,p=Math.max(0,o-r-l),u=Math.max(0,e-c-d);return{x:r+p*n.x,y:c+u*n.y}}function De(o,e,t,i={}){var m,f,b,y,w,v;let n=(m=i.inset)!=null?m:{},a=(f=i.padding)!=null?f:{x:0,y:0},s=((b=n.left)!=null?b:0)+a.x,r=((y=n.right)!=null?y:0)+a.x,l=((w=n.top)!=null?w:0)+a.y,c=((v=n.bottom)!=null?v:0)+a.y,d=Math.max(0,o-s-r),p=Math.max(0,e-l-c),u=$e(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:s+d*g,y:l+p*h}}function bn(o,e,t,i={}){var d,p,u;if(!o)return;let n=i.positionRatio?De(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Se(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,r=n.y+a.y;o.anchor&&i.renderAnchor&&o.anchor.set(i.renderAnchor.x,i.renderAnchor.y),Ee(o,s,r);let l=(p=i.scale)!=null?p:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&Ie(o,l*c)}if(typeof window!="undefined"){let o=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==o||n!==e)&&(o=i,e=n,fn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),fn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Zr,window.getDebugConfig=Qr,window.copyConfig=uo,window.applyConfig=jt,window.applyConfigForRatio=go,window.positionAtBottom=ks,window.positionAtTop=no,window.positionAtCenter=ao,window.positionAtLeft=so,window.positionAtRight=ro,window.positionAtBottomLeft=oo,window.positionAtBottomRight=lo,window.positionAtTopLeft=co,window.positionAtTopRight=po,window.applyPositionContract=io,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 Ei(o,e,t=0){return o*e+t}function Ai(o,e,t=0){return o*(1-e)+t}function Ci(o,e,t=0){return o*e+t}function Li(o,e,t=0){return o*(1-e)+t}function ve(o,e=0){return o/2+e}function to(o,e){return o*e}function io(o,e,t,i){var s,r,l,c,d,p,u,g,h,m,f,b,y,w,v,T,P,_,I,j;let n=0,a=0;switch(i.type){case"top":n=ve(e,(r=(s=i.offset)==null?void 0:s.x)!=null?r:0),a=Ei(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ve(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=Ai(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Ci(e,i.percent,(m=(h=i.offset)==null?void 0:h.x)!=null?m:0),a=ve(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":n=Li(e,i.percent,(w=(y=i.offset)==null?void 0:y.x)!=null?w:0),a=ve(t,(T=(v=i.offset)==null?void 0:v.y)!=null?T:0);break;case"center":n=ve(e,(_=(P=i.offset)==null?void 0:P.x)!=null?_:0),a=ve(t,(j=(I=i.offset)==null?void 0:I.y)!=null?j:0);break}o.position?o.position.set(n,a):(o.x=n,o.y=a),i.scale!==void 0&&i.scale!==1&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(i.scale,i.scale):(o.scale.x=i.scale,o.scale.y=i.scale))}function ks(o,e,t,i=.2,n=1,a=!0,s=!1){let r=to(t,i),l=Ai(t,i/2);Ee(o,ve(e),l);let c=a?n*ze.scaleFactor:n;Ie(o,c),s&&!Si.find(d=>d.element===o)&&Kr(o,ks,e,t,i,n,a)}function no(o,e,t,i=.1,n=1){Ee(o,ve(e),Ei(t,i)),Ie(o,n)}function ao(o,e,t,i=0,n=0,a=1){Ee(o,ve(e,i),ve(t,n)),Ie(o,a)}function so(o,e,t,i=.1,n=1){Ee(o,Ci(e,i),ve(t)),Ie(o,n)}function ro(o,e,t,i=.1,n=1){Ee(o,Li(e,i),ve(t)),Ie(o,n)}function oo(o,e,t,i=.05,n=.05,a=1){Ee(o,Ci(e,n),Ai(t,i)),Ie(o,a)}function lo(o,e,t,i=.05,n=.05,a=1){Ee(o,Li(e,n),Ai(t,i)),Ie(o,a)}function co(o,e,t,i=.05,n=.05,a=1){Ee(o,Ci(e,n),Ei(t,i)),Ie(o,a)}function po(o,e,t,i=.05,n=.05,a=1){Ee(o,Li(e,n),Ei(t,i)),Ie(o,a)}function Ee(o,e,t){o&&o.position?typeof o.position.set=="function"?o.position.set(e,t):(o.position.x=e,o.position.y=t):o&&(o.x=e,o.y=t)}function Ie(o,e){e!==1&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(e,e):o.scale.x!==void 0&&o.scale.y!==void 0&&(o.scale.x=e,o.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 uo(o){return o&&Qe[o]?JSON.parse(JSON.stringify(Qe[o])):JSON.parse(JSON.stringify(ae))}function jt(o){Object.keys(o).forEach(e=>{let t=e;ae[t]&&o[t]&&Object.assign(ae[t],o[t])}),console.log("Config applied:",o)}function go(o,e){let t=o/e;t>1.6?(jt(Qe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(jt(Qe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(jt(Qe.square),console.log("Applied SQUARE config for ratio:",t)):(jt(Qe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let o=window;o.configPresets=Qe,o.resolveAnchorVec2=o.resolveAnchorVec2||$e,o.resolveScreenAnchorPoint=o.resolveScreenAnchorPoint||Se,o.resolveScreenRatioPoint=o.resolveScreenRatioPoint||De}var fe=null,Ls=new Map;function ho(o,e,t,i,n,a={}){var N,q,$,H,z,G,Y,V,F,Q,W,K,X,de,ee,we,J,le,ie,se,Ce,Re,Kt,ma,fa,ba,ya,va,wa,xa,Sa,Ea,Aa,Ca,La,ka,Ta,Pa,Ia,Ma,ja,_a,Ra,Oa,za,$a,Da,Ha,Na;let s=(N=a.enableDebugLogs)!=null?N:!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:r,label:l,background:c,backgroundTexture:d,app:p}=o;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 h=u*ae.layout.screen_scale_x,m=g*ae.layout.screen_scale_y,f=u/2,b=e.engine.runtime||{},y=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:ae.layout.screen_scale_x,screen_scale_y:ae.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:h,height:m,midX:f}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",y));let w=m>h,v=(q=y.design_width_portrait)!=null?q:w?400:600,T=($=y.design_height_portrait)!=null?$:w?600:400,P=Math.min(h/v,m/T);P=Math.min(P,1.15);let _=P*((H=ae.engine.scale)!=null?H:1),I=(z=a.skipMainContainerTransform)!=null?z:!1;!I&&r&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(_):(r.scale.x=_,r.scale.y=_));let j=(G=y.main_container_anchor)!=null?G:"center",L=(Y=y.main_container_position_ratio)!=null?Y:{x:.5,y:.5},S=(V=y.main_container_offset)!=null?V:{x:0,y:0},x=y.main_container_position_ratio?De(u,g,L):Se(u,g,j),E=x.x+S.x+ae.layout.position_offset.x,A=x.y+S.y+ae.layout.position_offset.y;if(!I&&r&&r.position&&(typeof r.position.set=="function"?r.position.set(E,A):(r.position.x=E,r.position.y=A)),n&&(r!=null&&r.toLocal)){let ue=g>u,me=(F=y.design_width_portrait)!=null?F:ue?320:480,ce=(Q=y.design_height_portrait)!=null?Q:ue?480:320;for(let[Le,ke]of e.objects.entries()){let he=ke==null?void 0:ke.transform;if(!he||((W=he.position_mode)!=null?W:"static")!=="static")continue;let Z=(K=n.get)==null?void 0:K.call(n,Le),kt=((X=Z==null?void 0:Z.getDisplayObject)==null?void 0:X.call(Z))||(Z==null?void 0:Z.pixiObject)||Z;if(!kt||kt.parent!==r)continue;let Oe=(de=he.anchor)!=null?de:"bottom-left";Oe==="bottom-left"&&he.anchor==null&&console.log("[DEBUG FALLBACK] LayoutManager transform.anchor \u2192 bottom-left");let nt=he.position_ratio!=null?De(me,ce,he.position_ratio):Se(me,ce,Oe),at=(ee=he.position)!=null?ee:{x:0,y:0},Tt=nt.x-me/2+at.x,Je=nt.y-ce/2+at.y;typeof(Z==null?void 0:Z.setPosition)=="function"?Z.setPosition(Tt,Je):(Ee(kt,Tt,Je),(we=Z==null?void 0:Z.transform)!=null&&we.position&&(Z.transform.position.x=Tt,Z.transform.position.y=Je))}}let C=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,R=((C==null?void 0:C.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(ae.layout.debug_rect_visible&&R){(!fe||fe.parent!==p.stage)&&(fe==null||fe.destroy(),fe=new Wr,fe.zIndex=9999,p.stage.addChild(fe)),fe.clear();let ue=ae.layout.debug_rect_scale_x,me=ae.layout.debug_rect_scale_y,ce=(u-4)*ue,Le=(g-4)*me,ke=(u-ce)/2,he=(g-Le)/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:ce,rectH:Le,offsetX:ke,offsetY:he}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+ke,y:2+he,width:ce,height:Le})),fe.rect(2+ke,2+he,ce,Le).stroke({width:ae.layout.debug_rect_thickness,color:ae.layout.debug_rect_color})}else fe&&(fe.destroy(),fe=null);let M=((J=o.label)==null?void 0:J.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&M){let ue=(ie=(le=M==null?void 0:M.transform)==null?void 0:le.anchor)!=null?ie:"center",me=(se=M==null?void 0:M.transform)==null?void 0:se.position_ratio,ce=((Ce=M==null?void 0:M.transform)==null?void 0:Ce.offset)||{x:0,y:0};bn(l,u,g,{anchor:ue,positionRatio:me,offset:{x:ce.x*_,y:ce.y*_},renderAnchor:$e(ue)})}if(l&&l.alpha>0){let ue=1+Math.sin(t*ae.engine.label_pulse_speed)*ae.engine.label_pulse_intensity,me=(Kt=(Re=M==null?void 0:M.transform)==null?void 0:Re.scale)!=null?Kt:1,ce=ue*_*me;l.scale&&(typeof l.scale.set=="function"?l.scale.set(ce):(l.scale.x=ce,l.scale.y=ce))}s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING =====");let O=c?e.objects.get("background_1"):null,D=!!O&&(c==null?void 0:c.parent)===r;if(c&&!D){s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(ma=c.constructor)==null?void 0:ma.name)),c.alpha=((ba=(fa=b.background)==null?void 0:fa.alpha)!=null?ba:.98)*ae.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha),s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",O);let ue=(O==null?void 0:O.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ue);let me=ue.offset||{x:0,y:0},ce=((va=(ya=b.background)==null?void 0:ya.offset_y)!=null?va:0)+ae.engine.background_offset_y,Le=(wa=ue.anchor)!=null?wa:"center",ke=ue.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:me,bgRuntimeOffsetY:ce,bgScreenAnchor:Le,bgPositionRatio:ke,baseWidth:u,baseHeight:g,finalScale:_}),bn(c,u,g,{anchor:Le,positionRatio:ke,offset:{x:me.x*_,y:me.y*_+ce},renderAnchor:$e(Le)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(xa=c.scale)==null?void 0:xa.x,scaleY:(Sa=c.scale)==null?void 0:Sa.y,anchorX:(Ea=c.anchor)==null?void 0:Ea.x,anchorY:(Aa=c.anchor)==null?void 0:Aa.y,pivotX:(Ca=c.pivot)==null?void 0:Ca.x,pivotY:(La=c.pivot)==null?void 0:La.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 nt=Math.max(h/d.width,m/d.height),at=(Ta=(ka=b.background)==null?void 0:ka.scale_multiplier)!=null?Ta:1.05,Tt=(Pa=ue.scale)!=null?Pa:1,Je=nt*at*ae.engine.background_scale*Tt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Je):(c.scale.x=Je,c.scale.y=Je))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-h/2,-m/2,h,m).fill({color:1444375}));let he=`${u}x${g}`,te=Ls.get(he),Z={x:Number((Ia=c.x)!=null?Ia:0),y:Number((Ma=c.y)!=null?Ma:0),scaleX:Number((_a=(ja=c.scale)==null?void 0:ja.x)!=null?_a:1),scaleY:Number((Oa=(Ra=c.scale)==null?void 0:Ra.y)!=null?Oa:1),rotation:Number.isFinite(c.rotation)?c.rotation:void 0,anchorX:Number.isFinite((za=c.anchor)==null?void 0:za.x)?c.anchor.x:void 0,anchorY:Number.isFinite(($a=c.anchor)==null?void 0:$a.y)?c.anchor.y:void 0,pivotX:Number.isFinite((Da=c.pivot)==null?void 0:Da.x)?c.pivot.x:void 0,pivotY:Number.isFinite((Ha=c.pivot)==null?void 0:Ha.y)?c.pivot.y:void 0},kt=Number.isFinite(Z.x)&&Number.isFinite(Z.y)&&Number.isFinite(Z.scaleX)&&Number.isFinite(Z.scaleY),Oe=Z;if(te){let nt=Math.hypot(Z.x-te.x,Z.y-te.y),at=Math.max(u,g)*.5;(!kt||nt>at)&&((Na=c.position)!=null&&Na.set?c.position.set(te.x,te.y):(c.x=te.x,c.y=te.y),c.scale&&(typeof c.scale.set=="function"?c.scale.set(te.scaleX,te.scaleY):(c.scale.x=te.scaleX,c.scale.y=te.scaleY)),Number.isFinite(te.rotation)&&typeof c.rotation=="number"&&(c.rotation=te.rotation),c.anchor&&Number.isFinite(te.anchorX)&&Number.isFinite(te.anchorY)&&c.anchor.set(te.anchorX,te.anchorY),c.pivot&&Number.isFinite(te.pivotX)&&Number.isFinite(te.pivotY)&&c.pivot.set(te.pivotX,te.pivotY),Oe=te)}Number.isFinite(Oe.x)&&Number.isFinite(Oe.y)&&Number.isFinite(Oe.scaleX)&&Number.isFinite(Oe.scaleY)&&Ls.set(he,Oe)}}var ki=class{constructor(){this.typeDetector=new li,this.imageRenderer=new ci,this.colorRenderer=new di,this.numberRenderer=new pi,this.textRenderer=new ui,this.booleanRenderer=new gi,this.arrayRenderer=new hi(this),this.objectRenderer=new mi(this),this.selectRenderer=new fi,this.jsonRenderer=new bi,this.spawnPointsRenderer=new yi,this.spawnTemplatesRenderer=new vi(this)}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,a=n==null?void 0:n.schemas;if(!a)return null;let s=String(e||"").split(".").filter(Boolean);if(s.length<2)return null;let r=s[0],l=s.slice(1).join("."),c=a instanceof Map?a.get(r):a==null?void 0:a[r];if(!c)return null;let d=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof d!="string"||!d.startsWith("enum:"))return null;let u=d.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove","DrawCanvas","HtmlComponent"],...t].map(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,s)=>a.localeCompare(s))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),s=a==="logic"||a==="logic_id"||a==="logicid",r=a==="id"&&n.toLowerCase().includes("logic");if((s||r)&&typeof i=="string"){let h=this.getLogicOptions(),m=this.selectRenderer.render(e,t,i,n,h);return s?`
1082
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};import{Graphics as Wr}from"pixi.js";var ze={width:400,height:600,designWidth:400,scaleFactor:1},xi={scale:1,position:1},Si=[];function Kr(o,e,t,i,n,a,s){Si.push({element:o,originalScale:a,positionHelper:e,heightPercent:n}),e(o,t,i,n,a,s,!1)}function Xr(){Si.forEach(({element:o,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*ze.scaleFactor;t(o,ze.width,ze.height,i,n,!0,!1)})}function Jr(){Si.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function fn(o,e){console.log(`[SCREEN] updateScreenState called: ${o}x${e}`),ze.width=o,ze.height=e,ze.scaleFactor=Math.min(o/ze.designWidth,1.15),xi.scale=ze.scaleFactor,xi.position=1,console.log(`[SCREEN] Global multipliers - scale: ${xi.scale.toFixed(3)}`),Xr()}var ae={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 Zr(o,e,t){let i=ae[o];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${o}.${e} = ${t}`))}function Qr(){return ae}var eo={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 wi(o,e){return typeof o=="number"&&Number.isFinite(o)?o:e}function $e(o,e={x:.5,y:.5}){var t;if(Array.isArray(o))return{x:wi(o[0],e.x),y:wi(o[1],e.y)};if(o&&typeof o=="object"){let i=o;return{x:wi(i.x,e.x),y:wi(i.y,e.y)}}if(typeof o=="string"){let i=o.trim().toLowerCase();return(t=eo[i])!=null?t:e}return e}function Se(o,e,t,i={}){var g,h,m,f,b,y;let n=$e(t),a=(g=i.inset)!=null?g:{},s=(h=i.padding)!=null?h:{x:0,y:0},r=((m=a.left)!=null?m:0)+s.x,l=((f=a.right)!=null?f:0)+s.x,c=((b=a.top)!=null?b:0)+s.y,d=((y=a.bottom)!=null?y:0)+s.y,p=Math.max(0,o-r-l),u=Math.max(0,e-c-d);return{x:r+p*n.x,y:c+u*n.y}}function De(o,e,t,i={}){var m,f,b,y,w,v;let n=(m=i.inset)!=null?m:{},a=(f=i.padding)!=null?f:{x:0,y:0},s=((b=n.left)!=null?b:0)+a.x,r=((y=n.right)!=null?y:0)+a.x,l=((w=n.top)!=null?w:0)+a.y,c=((v=n.bottom)!=null?v:0)+a.y,d=Math.max(0,o-s-r),p=Math.max(0,e-l-c),u=$e(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:s+d*g,y:l+p*h}}function bn(o,e,t,i={}){var d,p,u;if(!o)return;let n=i.positionRatio?De(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Se(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,r=n.y+a.y;o.anchor&&i.renderAnchor&&o.anchor.set(i.renderAnchor.x,i.renderAnchor.y),Ee(o,s,r);let l=(p=i.scale)!=null?p:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&Ie(o,l*c)}if(typeof window!="undefined"){let o=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==o||n!==e)&&(o=i,e=n,fn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),fn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Zr,window.getDebugConfig=Qr,window.copyConfig=uo,window.applyConfig=jt,window.applyConfigForRatio=go,window.positionAtBottom=ks,window.positionAtTop=no,window.positionAtCenter=ao,window.positionAtLeft=so,window.positionAtRight=ro,window.positionAtBottomLeft=oo,window.positionAtBottomRight=lo,window.positionAtTopLeft=co,window.positionAtTopRight=po,window.applyPositionContract=io,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 Ei(o,e,t=0){return o*e+t}function Ci(o,e,t=0){return o*(1-e)+t}function Ai(o,e,t=0){return o*e+t}function Li(o,e,t=0){return o*(1-e)+t}function ve(o,e=0){return o/2+e}function to(o,e){return o*e}function io(o,e,t,i){var s,r,l,c,d,p,u,g,h,m,f,b,y,w,v,T,P,_,I,j;let n=0,a=0;switch(i.type){case"top":n=ve(e,(r=(s=i.offset)==null?void 0:s.x)!=null?r:0),a=Ei(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ve(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=Ci(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Ai(e,i.percent,(m=(h=i.offset)==null?void 0:h.x)!=null?m:0),a=ve(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":n=Li(e,i.percent,(w=(y=i.offset)==null?void 0:y.x)!=null?w:0),a=ve(t,(T=(v=i.offset)==null?void 0:v.y)!=null?T:0);break;case"center":n=ve(e,(_=(P=i.offset)==null?void 0:P.x)!=null?_:0),a=ve(t,(j=(I=i.offset)==null?void 0:I.y)!=null?j:0);break}o.position?o.position.set(n,a):(o.x=n,o.y=a),i.scale!==void 0&&i.scale!==1&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(i.scale,i.scale):(o.scale.x=i.scale,o.scale.y=i.scale))}function ks(o,e,t,i=.2,n=1,a=!0,s=!1){let r=to(t,i),l=Ci(t,i/2);Ee(o,ve(e),l);let c=a?n*ze.scaleFactor:n;Ie(o,c),s&&!Si.find(d=>d.element===o)&&Kr(o,ks,e,t,i,n,a)}function no(o,e,t,i=.1,n=1){Ee(o,ve(e),Ei(t,i)),Ie(o,n)}function ao(o,e,t,i=0,n=0,a=1){Ee(o,ve(e,i),ve(t,n)),Ie(o,a)}function so(o,e,t,i=.1,n=1){Ee(o,Ai(e,i),ve(t)),Ie(o,n)}function ro(o,e,t,i=.1,n=1){Ee(o,Li(e,i),ve(t)),Ie(o,n)}function oo(o,e,t,i=.05,n=.05,a=1){Ee(o,Ai(e,n),Ci(t,i)),Ie(o,a)}function lo(o,e,t,i=.05,n=.05,a=1){Ee(o,Li(e,n),Ci(t,i)),Ie(o,a)}function co(o,e,t,i=.05,n=.05,a=1){Ee(o,Ai(e,n),Ei(t,i)),Ie(o,a)}function po(o,e,t,i=.05,n=.05,a=1){Ee(o,Li(e,n),Ei(t,i)),Ie(o,a)}function Ee(o,e,t){o&&o.position?typeof o.position.set=="function"?o.position.set(e,t):(o.position.x=e,o.position.y=t):o&&(o.x=e,o.y=t)}function Ie(o,e){e!==1&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(e,e):o.scale.x!==void 0&&o.scale.y!==void 0&&(o.scale.x=e,o.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 uo(o){return o&&Qe[o]?JSON.parse(JSON.stringify(Qe[o])):JSON.parse(JSON.stringify(ae))}function jt(o){Object.keys(o).forEach(e=>{let t=e;ae[t]&&o[t]&&Object.assign(ae[t],o[t])}),console.log("Config applied:",o)}function go(o,e){let t=o/e;t>1.6?(jt(Qe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(jt(Qe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(jt(Qe.square),console.log("Applied SQUARE config for ratio:",t)):(jt(Qe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let o=window;o.configPresets=Qe,o.resolveAnchorVec2=o.resolveAnchorVec2||$e,o.resolveScreenAnchorPoint=o.resolveScreenAnchorPoint||Se,o.resolveScreenRatioPoint=o.resolveScreenRatioPoint||De}var fe=null,Ls=new Map;function ho(o,e,t,i,n,a={}){var N,q,$,H,z,G,Y,V,F,Q,W,K,X,de,ee,we,J,le,ie,se,Ae,Re,Kt,ma,fa,ba,ya,va,wa,xa,Sa,Ea,Ca,Aa,La,ka,Ta,Pa,Ia,Ma,ja,_a,Ra,Oa,za,$a,Da,Ha,Na;let s=(N=a.enableDebugLogs)!=null?N:!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:r,label:l,background:c,backgroundTexture:d,app:p}=o;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 h=u*ae.layout.screen_scale_x,m=g*ae.layout.screen_scale_y,f=u/2,b=e.engine.runtime||{},y=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:ae.layout.screen_scale_x,screen_scale_y:ae.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:h,height:m,midX:f}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",y));let w=m>h,v=(q=y.design_width_portrait)!=null?q:w?400:600,T=($=y.design_height_portrait)!=null?$:w?600:400,P=Math.min(h/v,m/T);P=Math.min(P,1.15);let _=P*((H=ae.engine.scale)!=null?H:1),I=(z=a.skipMainContainerTransform)!=null?z:!1;!I&&r&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(_):(r.scale.x=_,r.scale.y=_));let j=(G=y.main_container_anchor)!=null?G:"center",L=(Y=y.main_container_position_ratio)!=null?Y:{x:.5,y:.5},S=(V=y.main_container_offset)!=null?V:{x:0,y:0},x=y.main_container_position_ratio?De(u,g,L):Se(u,g,j),E=x.x+S.x+ae.layout.position_offset.x,C=x.y+S.y+ae.layout.position_offset.y;if(!I&&r&&r.position&&(typeof r.position.set=="function"?r.position.set(E,C):(r.position.x=E,r.position.y=C)),n&&(r!=null&&r.toLocal)){let ue=g>u,me=(F=y.design_width_portrait)!=null?F:ue?320:480,ce=(Q=y.design_height_portrait)!=null?Q:ue?480:320;for(let[Le,ke]of e.objects.entries()){let he=ke==null?void 0:ke.transform;if(!he||((W=he.position_mode)!=null?W:"static")!=="static")continue;let Z=(K=n.get)==null?void 0:K.call(n,Le),kt=((X=Z==null?void 0:Z.getDisplayObject)==null?void 0:X.call(Z))||(Z==null?void 0:Z.pixiObject)||Z;if(!kt||kt.parent!==r)continue;let Oe=(de=he.anchor)!=null?de:"bottom-left";Oe==="bottom-left"&&he.anchor==null&&console.log("[DEBUG FALLBACK] LayoutManager transform.anchor \u2192 bottom-left");let nt=he.position_ratio!=null?De(me,ce,he.position_ratio):Se(me,ce,Oe),at=(ee=he.position)!=null?ee:{x:0,y:0},Tt=nt.x-me/2+at.x,Je=nt.y-ce/2+at.y;typeof(Z==null?void 0:Z.setPosition)=="function"?Z.setPosition(Tt,Je):(Ee(kt,Tt,Je),(we=Z==null?void 0:Z.transform)!=null&&we.position&&(Z.transform.position.x=Tt,Z.transform.position.y=Je))}}let A=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,R=((A==null?void 0:A.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(ae.layout.debug_rect_visible&&R){(!fe||fe.parent!==p.stage)&&(fe==null||fe.destroy(),fe=new Wr,fe.zIndex=9999,p.stage.addChild(fe)),fe.clear();let ue=ae.layout.debug_rect_scale_x,me=ae.layout.debug_rect_scale_y,ce=(u-4)*ue,Le=(g-4)*me,ke=(u-ce)/2,he=(g-Le)/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:ce,rectH:Le,offsetX:ke,offsetY:he}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+ke,y:2+he,width:ce,height:Le})),fe.rect(2+ke,2+he,ce,Le).stroke({width:ae.layout.debug_rect_thickness,color:ae.layout.debug_rect_color})}else fe&&(fe.destroy(),fe=null);let M=((J=o.label)==null?void 0:J.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&M){let ue=(ie=(le=M==null?void 0:M.transform)==null?void 0:le.anchor)!=null?ie:"center",me=(se=M==null?void 0:M.transform)==null?void 0:se.position_ratio,ce=((Ae=M==null?void 0:M.transform)==null?void 0:Ae.offset)||{x:0,y:0};bn(l,u,g,{anchor:ue,positionRatio:me,offset:{x:ce.x*_,y:ce.y*_},renderAnchor:$e(ue)})}if(l&&l.alpha>0){let ue=1+Math.sin(t*ae.engine.label_pulse_speed)*ae.engine.label_pulse_intensity,me=(Kt=(Re=M==null?void 0:M.transform)==null?void 0:Re.scale)!=null?Kt:1,ce=ue*_*me;l.scale&&(typeof l.scale.set=="function"?l.scale.set(ce):(l.scale.x=ce,l.scale.y=ce))}s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING =====");let O=c?e.objects.get("background_1"):null,D=!!O&&(c==null?void 0:c.parent)===r;if(c&&!D){s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(ma=c.constructor)==null?void 0:ma.name)),c.alpha=((ba=(fa=b.background)==null?void 0:fa.alpha)!=null?ba:.98)*ae.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha),s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",O);let ue=(O==null?void 0:O.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ue);let me=ue.offset||{x:0,y:0},ce=((va=(ya=b.background)==null?void 0:ya.offset_y)!=null?va:0)+ae.engine.background_offset_y,Le=(wa=ue.anchor)!=null?wa:"center",ke=ue.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:me,bgRuntimeOffsetY:ce,bgScreenAnchor:Le,bgPositionRatio:ke,baseWidth:u,baseHeight:g,finalScale:_}),bn(c,u,g,{anchor:Le,positionRatio:ke,offset:{x:me.x*_,y:me.y*_+ce},renderAnchor:$e(Le)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(xa=c.scale)==null?void 0:xa.x,scaleY:(Sa=c.scale)==null?void 0:Sa.y,anchorX:(Ea=c.anchor)==null?void 0:Ea.x,anchorY:(Ca=c.anchor)==null?void 0:Ca.y,pivotX:(Aa=c.pivot)==null?void 0:Aa.x,pivotY:(La=c.pivot)==null?void 0:La.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 nt=Math.max(h/d.width,m/d.height),at=(Ta=(ka=b.background)==null?void 0:ka.scale_multiplier)!=null?Ta:1.05,Tt=(Pa=ue.scale)!=null?Pa:1,Je=nt*at*ae.engine.background_scale*Tt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Je):(c.scale.x=Je,c.scale.y=Je))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-h/2,-m/2,h,m).fill({color:1444375}));let he=`${u}x${g}`,te=Ls.get(he),Z={x:Number((Ia=c.x)!=null?Ia:0),y:Number((Ma=c.y)!=null?Ma:0),scaleX:Number((_a=(ja=c.scale)==null?void 0:ja.x)!=null?_a:1),scaleY:Number((Oa=(Ra=c.scale)==null?void 0:Ra.y)!=null?Oa:1),rotation:Number.isFinite(c.rotation)?c.rotation:void 0,anchorX:Number.isFinite((za=c.anchor)==null?void 0:za.x)?c.anchor.x:void 0,anchorY:Number.isFinite(($a=c.anchor)==null?void 0:$a.y)?c.anchor.y:void 0,pivotX:Number.isFinite((Da=c.pivot)==null?void 0:Da.x)?c.pivot.x:void 0,pivotY:Number.isFinite((Ha=c.pivot)==null?void 0:Ha.y)?c.pivot.y:void 0},kt=Number.isFinite(Z.x)&&Number.isFinite(Z.y)&&Number.isFinite(Z.scaleX)&&Number.isFinite(Z.scaleY),Oe=Z;if(te){let nt=Math.hypot(Z.x-te.x,Z.y-te.y),at=Math.max(u,g)*.5;(!kt||nt>at)&&((Na=c.position)!=null&&Na.set?c.position.set(te.x,te.y):(c.x=te.x,c.y=te.y),c.scale&&(typeof c.scale.set=="function"?c.scale.set(te.scaleX,te.scaleY):(c.scale.x=te.scaleX,c.scale.y=te.scaleY)),Number.isFinite(te.rotation)&&typeof c.rotation=="number"&&(c.rotation=te.rotation),c.anchor&&Number.isFinite(te.anchorX)&&Number.isFinite(te.anchorY)&&c.anchor.set(te.anchorX,te.anchorY),c.pivot&&Number.isFinite(te.pivotX)&&Number.isFinite(te.pivotY)&&c.pivot.set(te.pivotX,te.pivotY),Oe=te)}Number.isFinite(Oe.x)&&Number.isFinite(Oe.y)&&Number.isFinite(Oe.scaleX)&&Number.isFinite(Oe.scaleY)&&Ls.set(he,Oe)}}var ki=class{constructor(){this.typeDetector=new li,this.imageRenderer=new ci,this.colorRenderer=new di,this.numberRenderer=new pi,this.textRenderer=new ui,this.booleanRenderer=new gi,this.arrayRenderer=new hi(this),this.objectRenderer=new mi(this),this.selectRenderer=new fi,this.jsonRenderer=new bi,this.spawnPointsRenderer=new yi,this.spawnTemplatesRenderer=new vi(this)}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,a=n==null?void 0:n.schemas;if(!a)return null;let s=String(e||"").split(".").filter(Boolean);if(s.length<2)return null;let r=s[0],l=s.slice(1).join("."),c=a instanceof Map?a.get(r):a==null?void 0:a[r];if(!c)return null;let d=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof d!="string"||!d.startsWith("enum:"))return null;let u=d.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove","DrawCanvas","HtmlComponent"],...t].map(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,s)=>a.localeCompare(s))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),s=a==="logic"||a==="logic_id"||a==="logicid",r=a==="id"&&n.toLowerCase().includes("logic");if((s||r)&&typeof i=="string"){let h=this.getLogicOptions(),m=this.selectRenderer.render(e,t,i,n,h);return s?`
1083
1083
  ${m}
1084
1084
  <div class="inspector-array-actions">
1085
1085
  <button class="inspector-button"
@@ -1187,10 +1187,10 @@ ${m}
1187
1187
  ${f.join("")}
1188
1188
  </div>
1189
1189
  </div>
1190
- `);let T=[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),_=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),I=[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(T.length||P.length||_.length||I.length||j.length){let S=(E,A)=>A.length?`
1190
+ `);let T=[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),_=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),I=[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(T.length||P.length||_.length||I.length||j.length){let S=(E,C)=>C.length?`
1191
1191
  <div class="inspector-motion-continuous-group">
1192
1192
  <div class="inspector-subsection-title">${E}</div>
1193
- <div class="inspector-subsection-content">${A.join("")}</div>
1193
+ <div class="inspector-subsection-content">${C.join("")}</div>
1194
1194
  </div>`:"",x=[S("Pulse",T),S("Swing",P),S("Move forever",_),S("Rotate (pivoting itself)",I),S("Rotate around",j)].filter(Boolean).join("");n.push(`
1195
1195
  <div class="inspector-subsection inspector-subsection-continuous">
1196
1196
  <div class="inspector-subsection-title">Continuous</div>
@@ -1211,7 +1211,7 @@ ${m}
1211
1211
  ${n.join("")}
1212
1212
  </div>
1213
1213
  </div>
1214
- `}attachEventListeners(){var v,T,P,_;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=mo((I,j,L)=>{var S,x;this.updateManager.updateProperty(I,j,L),(x=(S=this.options)==null?void 0:S.onPropertyChange)==null||x.call(S,I,j,L)},300),i=I=>I?/(^|\.)logic(\.\d+)?\.id$/.test(I):!1;e.forEach(I=>{let j=x=>{var k,R;let E=x.target,A=E.dataset.propertyPath,C=E.dataset.objectId;if(A&&C){let M=E.value;if(E.type==="checkbox")M=E.checked;else if(E.type==="number"){if(M=parseFloat(E.value),isNaN(M))return}else if(E.dataset.json==="true")try{M=JSON.parse(E.value)}catch{return}E.type==="text"||E.type==="range"||E.tagName==="TEXTAREA"?t(C,A,M):(this.updateManager.updateProperty(C,A,M),(R=(k=this.options)==null?void 0:k.onPropertyChange)==null||R.call(k,C,A,M))}},L=I.dataset.propertyPath;L&&(L.includes("transform.anchor")||L.includes("render.anchor"))&&I.tagName==="SELECT"?I.addEventListener("change",async x=>{var R,M,O,D,N;let E=x.target,A=E.dataset.propertyPath,C=E.dataset.objectId,k=E.value;if(!(!A||!C)&&k!=="custom")if(A.includes("transform.anchor")){let q=window.getEditableObjectConfig,$=typeof q=="function"?q(C):null,H=(R=$==null?void 0:$.transform)==null?void 0:R.anchor,z=H!=null&&H!==""?H:"top-left",G=k;await this.updateManager.updateProperty(C,A,k),(O=(M=this.options)==null?void 0:M.onPropertyChange)==null||O.call(M,C,A,k),z!==G&&window.dispatchEvent(new CustomEvent("scene-editor:anchor-changed",{detail:{objectId:C,previousAnchor:z,nextAnchor:G}}))}else await this.updateManager.updateProperty(C,A,k),(N=(D=this.options)==null?void 0:D.onPropertyChange)==null||N.call(D,C,A,k)}):i(L)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",L),I.addEventListener("change",async x=>{var N;let E=x.target,A=E.dataset.propertyPath,C=E.dataset.objectId,k=E.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",k),!A||!C)return;await this.updateManager.updateProperty(C,A,k),console.log("[Inspector v1.0.0] Logic ID updated");let R=window,M=(N=R==null?void 0:R.__HANDLER_LOGIC_META)==null?void 0:N[k],O=this.getDefaultPropsForLogic(k,M);console.log("[Inspector v1.0.0] New logic default props:",O);let D=A.replace(/\.id$/,".props");await this.updateManager.updateProperty(C,D,O),console.log("[Inspector v1.0.0] Logic props updated to:",O),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(C)})):(I.addEventListener("change",j),(I.tagName==="INPUT"||I.tagName==="TEXTAREA")&&I.addEventListener("input",j))}),this.contentContainer.querySelectorAll("[data-action]").forEach(I=>{I.addEventListener("click",j=>{let L=j.target,S=L.dataset.action,x=L.dataset.path,E=L.dataset.object;S&&x&&E&&this.quickActions.handleAction(S,E,x)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(I=>{I.addEventListener("click",j=>{var x,E;let L=j.target,S=L.dataset.sectionToggle||((x=L.closest("[data-section-toggle]"))==null?void 0:x.getAttribute("data-section-toggle"));if(S){let A=(E=this.contentContainer)==null?void 0:E.querySelector(`[data-section="${S}"]`);A==null||A.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(I=>{I.addEventListener("click",async j=>{let S=j.currentTarget.dataset.motionPreset;!S||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,S)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(I=>{I.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(I=>{I.addEventListener("click",async j=>{let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath;if(!S||!x)return;let E=window.getEditableObjectConfig,A=E==null?void 0:E(S);if(!A)return;let C=this.updateManager.getNestedProperty(A,x),k=Array.isArray(C)?[...C]:[];k.push({x:0,y:0}),await this.updateManager.updateProperty(S,x,k),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(I=>{I.addEventListener("click",async j=>{let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath,E=Number(L.dataset.index||"-1");if(!S||!x||E<0)return;let A=window.getEditableObjectConfig,C=A==null?void 0:A(S);if(!C)return;let k=this.updateManager.getNestedProperty(C,x);if(!Array.isArray(k))return;let R=k.filter((M,O)=>O!==E);await this.updateManager.updateProperty(S,x,R),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(I=>{I.addEventListener("click",async j=>{let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath;if(!S||!x)return;let E=window.getEditableObjectConfig,A=E==null?void 0:E(S);if(!A)return;let C=this.updateManager.getNestedProperty(A,x),k=Array.isArray(C)?[...C]:[];k.push({templateId:"",weight:1}),await this.updateManager.updateProperty(S,x,k),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(I=>{I.addEventListener("click",async j=>{var M;let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath,E=Number((M=L.dataset.index)!=null?M:-1);if(!S||!x||E<0)return;let A=window.getEditableObjectConfig,C=A==null?void 0:A(S);if(!C)return;let k=this.updateManager.getNestedProperty(C,x);if(!Array.isArray(k))return;let R=k.filter((O,D)=>D!==E);await this.updateManager.updateProperty(S,x,R),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(I=>{I.addEventListener("click",async j=>{var N;let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath;if(!S||!x)return;let E=window.getEditableObjectConfig,A=E==null?void 0:E(S);if(!A)return;let C=this.updateManager.getNestedProperty(A,x),k;Array.isArray(C)?k=[...C]:C!=null?typeof C=="string"?k=[{id:C,props:{}}]:typeof C=="object"?k=[C]:k=[]:k=[];let R=this.getDefaultLogicId(),M=window,O=(N=M==null?void 0:M.__HANDLER_LOGIC_META)==null?void 0:N[R],D=this.getDefaultPropsForLogic(R,O);k.push({id:R,props:D}),console.log("[InspectorPanel] Adding logic to array:",{objectId:S,path:x,current:C,next:k}),await this.updateManager.updateProperty(S,x,k),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(I=>{I.addEventListener("click",async j=>{var M;let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath,E=Number((M=L.dataset.index)!=null?M:-1);if(!S||!x||E<0)return;let A=window.getEditableObjectConfig,C=A==null?void 0:A(S);if(!C)return;let k=this.updateManager.getNestedProperty(C,x);if(!Array.isArray(k))return;let R=k.filter((O,D)=>D!==E);await this.updateManager.updateProperty(S,x,R),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(I=>{I.addEventListener("click",async j=>{var q,$;let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath,E=Number((q=L.dataset.index)!=null?q:-1);if(!S||!x||E<0)return;let A=window.getEditableObjectConfig,C=A==null?void 0:A(S);if(!C)return;let k=this.updateManager.getNestedProperty(C,x);if(!Array.isArray(k))return;let R=k[E];if(typeof R!="string")return;let M=window,O=($=M==null?void 0:M.__HANDLER_LOGIC_META)==null?void 0:$[R],D=this.getDefaultPropsForLogic(R,O),N=[...k];N[E]={id:R,props:D},await this.updateManager.updateProperty(S,x,N),this.loadObject(S)})});let f=(v=this.root)==null?void 0:v.querySelector("[data-inspector-advanced]");f==null||f.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(T=this.root)==null?void 0:T.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var j;let I=(j=this.root)==null?void 0:j.querySelector("[data-convert-menu]");I==null||I.classList.toggle("hidden")});let y=(P=this.contentContainer)==null?void 0:P.querySelector("[data-inspector-add-component-btn]"),w=(_=this.contentContainer)==null?void 0:_.querySelector("[data-inspector-component-select]");y==null||y.addEventListener("click",async()=>{let I=w.value;I&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,I)})}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},r={...(c=s.intro)!=null?c:{}};s.enabled=!0,r.enabled=!0,r.type=t,r.duration=typeof r.duration=="number"&&r.duration>0?r.duration:500,r.delay=typeof r.delay=="number"?r.delay:0,r.easing=typeof r.easing=="string"?r.easing:"easeOut",s.intro=r,await this.updateManager.updateProperty(e,"motion",s),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var r,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(r=i.motion)!=null?r: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,r=null;s instanceof Map?r=s.get(t):s&&typeof s=="object"&&(r=s[t]),r||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(r==null?void 0:r.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=`
1214
+ `}attachEventListeners(){var v,T,P,_;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=mo((I,j,L)=>{var S,x;this.updateManager.updateProperty(I,j,L),(x=(S=this.options)==null?void 0:S.onPropertyChange)==null||x.call(S,I,j,L)},300),i=I=>I?/(^|\.)logic(\.\d+)?\.id$/.test(I):!1;e.forEach(I=>{let j=x=>{var k,R;let E=x.target,C=E.dataset.propertyPath,A=E.dataset.objectId;if(C&&A){let M=E.value;if(E.type==="checkbox")M=E.checked;else if(E.type==="number"){if(M=parseFloat(E.value),isNaN(M))return}else if(E.dataset.json==="true")try{M=JSON.parse(E.value)}catch{return}E.type==="text"||E.type==="range"||E.tagName==="TEXTAREA"?t(A,C,M):(this.updateManager.updateProperty(A,C,M),(R=(k=this.options)==null?void 0:k.onPropertyChange)==null||R.call(k,A,C,M))}},L=I.dataset.propertyPath;L&&(L.includes("transform.anchor")||L.includes("render.anchor"))&&I.tagName==="SELECT"?I.addEventListener("change",async x=>{var R,M,O,D,N;let E=x.target,C=E.dataset.propertyPath,A=E.dataset.objectId,k=E.value;if(!(!C||!A)&&k!=="custom")if(C.includes("transform.anchor")){let q=window.getEditableObjectConfig,$=typeof q=="function"?q(A):null,H=(R=$==null?void 0:$.transform)==null?void 0:R.anchor,z=H!=null&&H!==""?H:"top-left",G=k;await this.updateManager.updateProperty(A,C,k),(O=(M=this.options)==null?void 0:M.onPropertyChange)==null||O.call(M,A,C,k),z!==G&&window.dispatchEvent(new CustomEvent("scene-editor:anchor-changed",{detail:{objectId:A,previousAnchor:z,nextAnchor:G}}))}else await this.updateManager.updateProperty(A,C,k),(N=(D=this.options)==null?void 0:D.onPropertyChange)==null||N.call(D,A,C,k)}):i(L)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",L),I.addEventListener("change",async x=>{var N;let E=x.target,C=E.dataset.propertyPath,A=E.dataset.objectId,k=E.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",k),!C||!A)return;await this.updateManager.updateProperty(A,C,k),console.log("[Inspector v1.0.0] Logic ID updated");let R=window,M=(N=R==null?void 0:R.__HANDLER_LOGIC_META)==null?void 0:N[k],O=this.getDefaultPropsForLogic(k,M);console.log("[Inspector v1.0.0] New logic default props:",O);let D=C.replace(/\.id$/,".props");await this.updateManager.updateProperty(A,D,O),console.log("[Inspector v1.0.0] Logic props updated to:",O),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(A)})):(I.addEventListener("change",j),(I.tagName==="INPUT"||I.tagName==="TEXTAREA")&&I.addEventListener("input",j))}),this.contentContainer.querySelectorAll("[data-action]").forEach(I=>{I.addEventListener("click",j=>{let L=j.target,S=L.dataset.action,x=L.dataset.path,E=L.dataset.object;S&&x&&E&&this.quickActions.handleAction(S,E,x)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(I=>{I.addEventListener("click",j=>{var x,E;let L=j.target,S=L.dataset.sectionToggle||((x=L.closest("[data-section-toggle]"))==null?void 0:x.getAttribute("data-section-toggle"));if(S){let C=(E=this.contentContainer)==null?void 0:E.querySelector(`[data-section="${S}"]`);C==null||C.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(I=>{I.addEventListener("click",async j=>{let S=j.currentTarget.dataset.motionPreset;!S||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,S)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(I=>{I.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(I=>{I.addEventListener("click",async j=>{let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath;if(!S||!x)return;let E=window.getEditableObjectConfig,C=E==null?void 0:E(S);if(!C)return;let A=this.updateManager.getNestedProperty(C,x),k=Array.isArray(A)?[...A]:[];k.push({x:0,y:0}),await this.updateManager.updateProperty(S,x,k),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(I=>{I.addEventListener("click",async j=>{let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath,E=Number(L.dataset.index||"-1");if(!S||!x||E<0)return;let C=window.getEditableObjectConfig,A=C==null?void 0:C(S);if(!A)return;let k=this.updateManager.getNestedProperty(A,x);if(!Array.isArray(k))return;let R=k.filter((M,O)=>O!==E);await this.updateManager.updateProperty(S,x,R),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(I=>{I.addEventListener("click",async j=>{let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath;if(!S||!x)return;let E=window.getEditableObjectConfig,C=E==null?void 0:E(S);if(!C)return;let A=this.updateManager.getNestedProperty(C,x),k=Array.isArray(A)?[...A]:[];k.push({templateId:"",weight:1}),await this.updateManager.updateProperty(S,x,k),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(I=>{I.addEventListener("click",async j=>{var M;let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath,E=Number((M=L.dataset.index)!=null?M:-1);if(!S||!x||E<0)return;let C=window.getEditableObjectConfig,A=C==null?void 0:C(S);if(!A)return;let k=this.updateManager.getNestedProperty(A,x);if(!Array.isArray(k))return;let R=k.filter((O,D)=>D!==E);await this.updateManager.updateProperty(S,x,R),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(I=>{I.addEventListener("click",async j=>{var N;let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath;if(!S||!x)return;let E=window.getEditableObjectConfig,C=E==null?void 0:E(S);if(!C)return;let A=this.updateManager.getNestedProperty(C,x),k;Array.isArray(A)?k=[...A]:A!=null?typeof A=="string"?k=[{id:A,props:{}}]:typeof A=="object"?k=[A]:k=[]:k=[];let R=this.getDefaultLogicId(),M=window,O=(N=M==null?void 0:M.__HANDLER_LOGIC_META)==null?void 0:N[R],D=this.getDefaultPropsForLogic(R,O);k.push({id:R,props:D}),console.log("[InspectorPanel] Adding logic to array:",{objectId:S,path:x,current:A,next:k}),await this.updateManager.updateProperty(S,x,k),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(I=>{I.addEventListener("click",async j=>{var M;let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath,E=Number((M=L.dataset.index)!=null?M:-1);if(!S||!x||E<0)return;let C=window.getEditableObjectConfig,A=C==null?void 0:C(S);if(!A)return;let k=this.updateManager.getNestedProperty(A,x);if(!Array.isArray(k))return;let R=k.filter((O,D)=>D!==E);await this.updateManager.updateProperty(S,x,R),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(I=>{I.addEventListener("click",async j=>{var q,$;let L=j.target,S=L.dataset.objectId,x=L.dataset.propertyPath,E=Number((q=L.dataset.index)!=null?q:-1);if(!S||!x||E<0)return;let C=window.getEditableObjectConfig,A=C==null?void 0:C(S);if(!A)return;let k=this.updateManager.getNestedProperty(A,x);if(!Array.isArray(k))return;let R=k[E];if(typeof R!="string")return;let M=window,O=($=M==null?void 0:M.__HANDLER_LOGIC_META)==null?void 0:$[R],D=this.getDefaultPropsForLogic(R,O),N=[...k];N[E]={id:R,props:D},await this.updateManager.updateProperty(S,x,N),this.loadObject(S)})});let f=(v=this.root)==null?void 0:v.querySelector("[data-inspector-advanced]");f==null||f.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(T=this.root)==null?void 0:T.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var j;let I=(j=this.root)==null?void 0:j.querySelector("[data-convert-menu]");I==null||I.classList.toggle("hidden")});let y=(P=this.contentContainer)==null?void 0:P.querySelector("[data-inspector-add-component-btn]"),w=(_=this.contentContainer)==null?void 0:_.querySelector("[data-inspector-component-select]");y==null||y.addEventListener("click",async()=>{let I=w.value;I&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,I)})}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},r={...(c=s.intro)!=null?c:{}};s.enabled=!0,r.enabled=!0,r.type=t,r.duration=typeof r.duration=="number"&&r.duration>0?r.duration:500,r.delay=typeof r.delay=="number"?r.delay:0,r.easing=typeof r.easing=="string"?r.easing:"easeOut",s.intro=r,await this.updateManager.updateProperty(e,"motion",s),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var r,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(r=i.motion)!=null?r: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,r=null;s instanceof Map?r=s.get(t):s&&typeof s=="object"&&(r=s[t]),r||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(r==null?void 0:r.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=`
1215
1215
  <div class="inspector-empty">
1216
1216
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
1217
1217
  <span class="inspector-empty-text">${e}</span>
@@ -1306,7 +1306,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
1306
1306
 
1307
1307
  OUTPUT:
1308
1308
  Generate the requested asset matching the brand style.${o.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
1309
- `.trim()}function Rs(o){return o.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function Os(o,e){return!(o.includes("background")&&(o.includes("_1")||o.includes("splash")||o.includes("endgame")||o.includes("main"))||e==="text"||e==="effects"&&o.includes("particle"))}async function zs(o){var s,r;let e=Rs(o.gameObjects),t={gamePrompt:o.gamePrompt,gameObjects:e,brandAssets:o.manifest.assets,brandDna:o.manifest.brand_dna,brandName:o.manifest.brand_name},i=js(t),n=[];if(o.flatDesignDataUrl)try{let l=$s(o.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await Ii(o.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(s=l.message)!=null&&s.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(r=l.message)!=null&&r.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return Eo(a,o.gameObjects)}function Eo(o,e){try{let t=o,i=o.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=o.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:o,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:o,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:o,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function En(o,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let s=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,s.game_object);try{let r=await Ao(o,s);s.output_dataUrl=r,s.status="Generated \u2713"}catch(r){console.error(`[Pipeline] Failed to generate ${s.game_object}:`,r),s.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Ao(o,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&o.manifest){let r=o.manifest.assets.find(l=>l.id===e.reference_asset);if(r){let l=o.assetFiles.get(r.file);if(l){let c=await Ye(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(o.flatDesignDataUrl){let r=$s(o.flatDesignDataUrl);r&&t.push(r)}let i=Os(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:o.manifest.brand_dna,needsTransparency:i},a=_s(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await gt(o.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await ut(s)||s}function $s(o){let[e,t]=o.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function Ds(o,e){let t=o.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],o.assets=i;for(let n of i){let a=e.get(n.file);if(a){let s=await Ye(a);s&&(n.dataUrl=s.dataUrl)}}}function Hs(o){var t,i;let e=new Map;if(!o)return console.warn("[CanvaZip] No position data provided"),e;if(typeof o=="string")try{o=JSON.parse(o)}catch(n){return console.error("[CanvaZip] Failed to parse position data JSON:",n),e}if(o!=null&&o.layers&&Array.isArray(o.layers)){console.log(`[CanvaZip] Parsing ${o.layers.length} layers from position data`);for(let n of o.layers){let a=n.asset;if(!a||!n.layout){console.warn("[CanvaZip] Skipping layer without asset or layout:",n);continue}let s=n.layout,r={x:typeof s.x=="number"?s.x:0,y:typeof s.y=="number"?s.y:0},l=typeof s.scaleX=="number"?s.scaleX:1,c=typeof s.scaleY=="number"?s.scaleY:1,d=(l+c)/2;d>1&&(d=d/13.33);let p=typeof s.rotation=="number"?s.rotation:0;e.set(a,{position:r,scale:d,rotation:p}),console.log(`[CanvaZip] Parsed position for ${a}:`,{position:r,scale:d,rotation:p})}console.log(`[CanvaZip] Successfully parsed ${e.size} assets from position data`)}else console.warn("[CanvaZip] Position data does not have layers array:",o);if(e.size===0&&typeof o=="object"&&!Array.isArray(o)){for(let[n,a]of Object.entries(o))if(a&&typeof a=="object"&&"layout"in a){let s=a.layout,r={x:0,y:0},l=1,c=0;if(s.position&&typeof s.position=="object"?r={x:s.position.x||0,y:s.position.y||0}:(typeof s.x=="number"||typeof s.y=="number")&&(r={x:s.x||0,y:s.y||0}),typeof s.scale=="number")l=s.scale;else if(typeof s.scaleX=="number"||typeof s.scaleY=="number"){let d=(t=s.scaleX)!=null?t:1,p=(i=s.scaleY)!=null?i:1;l=(d+p)/2}typeof s.rotation=="number"&&(c=s.rotation),e.set(n,{position:r,scale:l,rotation:c})}}return e}function Ns(o,e){if(!o)return console.warn("[CanvaZip] No filename provided for matching"),null;if(e.size===0)return console.warn("[CanvaZip] Position map is empty, cannot match:",o),null;if(e.has(o))return console.log(`[CanvaZip] Exact match found for ${o}`),e.get(o);let t=o.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return console.log(`[CanvaZip] Match found (without extension) for ${o} -> ${t}`),e.get(t);let i=t.toLowerCase();for(let[n,a]of e.entries()){let s=n.toLowerCase();if(s===i||s.includes(i)||i.includes(s))return console.log(`[CanvaZip] Partial match found for ${o} -> ${n}`),a}return console.warn(`[CanvaZip] No match found for ${o}. Available keys:`,Array.from(e.keys()).slice(0,5)),null}function Co(o){return o.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function Fs(){let o=window.getEditableAssets;if(typeof o!="function")return console.warn("[CanvaZip] getEditableAssets not available"),[];let e=o();if(!(e!=null&&e.slots)||!Array.isArray(e.slots))return console.warn("[CanvaZip] No slots found in registry"),[];let t=[];for(let i of e.slots)i.assetType==="image"&&i.objectId&&t.push({id:i.objectId,name:i.displayName||Co(i.slotId||i.objectId),type:"sprite"});return t.sort((i,n)=>i.name.localeCompare(n.name))}import{Assets as _t}from"pixi.js";async function Gs(o,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),r=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",r);let l=await _t.load(r);if(!l){console.error("[LIBRARY] Failed to load texture:",r);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)Te[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function Us(o,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,s=typeof a=="function"?a():null,r=(t=s==null?void 0:s.slots)==null?void 0:t.find(f=>f.category===e),l=r==null?void 0:r.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 _t.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)Te[f]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let m=window.gameObjectManager;if(m)for(let f of h){let b=m.get(f);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=p,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}var Mi=new Map;async function ji(o,e,t,i){let a=`${e.startsWith("json.")?e.replace("json.",""):e}:${t}`;if(Mi.has(a)){console.log(`[LIBRARY] \u23F3 Operation already in progress for ${a}, waiting...`);try{await Mi.get(a),console.log("[LIBRARY] \u2705 Previous operation completed, current apply should be redundant");return}catch(r){console.warn("[LIBRARY] Previous operation failed, proceeding with new apply:",r)}}let s=(async()=>{var r,l,c,d,p,u,g,h,m,f,b,y,w,v,T;console.log("[LIBRARY] applySlotAsset called:",{objectId:e,assetFilename:t,category:i});try{let P=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key derived:",P,"(from objectId:",e+")");let I=(window.__configOverrides||[]).filter($=>$.path==="render.asset.path"&&$.objectId!==P&&$.value&&$.value.includes(t));I.length>0&&(console.log("[LIBRARY] \u26A0\uFE0F WARNING: Other objects already using this asset:",{assetFilename:t,currentObject:P,otherObjects:I.map($=>({objectId:$.objectId,assetPath:$.value}))}),console.log("[LIBRARY] This is OK - each object will have its own override entry"));let j=Vs(P),L=Date.now(),S=`/raw/library/${i}/${t}?t=${L}`;console.log("[LIBRARY] Loading texture from:",S);try{let $=await fetch(S,{method:"HEAD"});if($.ok){let H=$.headers.get("content-type");console.log("[LIBRARY] File accessible, Content-Type:",H)}else{console.error("[LIBRARY] \u274C File not accessible:",S,"Status:",$.status);let H=await fetch(S),z=H.headers.get("content-type");if(console.error("[LIBRARY] Content-Type:",z,"Status:",H.status),!H.ok)throw new Error(`File not accessible: ${H.status} ${H.statusText}`)}}catch($){console.error("[LIBRARY] \u274C Failed to verify file accessibility:",$)}let x,E=3,A=0,C=null;for(;A<E&&!x;)try{A++,console.log(`[LIBRARY] Loading texture attempt ${A}/${E}:`,S);let $=`${S}${S.includes("?")?"&":"?"}retry=${A}`;if(x=await _t.load($),!x)throw new Error("Assets.load returned null/undefined");console.log("[LIBRARY] \u2705 Texture loaded successfully"),console.log("[LIBRARY] Texture dimensions:",x.width,"x",x.height);break}catch($){if(C=$,console.warn(`[LIBRARY] \u26A0\uFE0F Texture load attempt ${A} failed:`,$ instanceof Error?$.message:String($)),A<E){let H=Math.min(300*A,1e3);console.log(`[LIBRARY] Waiting ${H}ms before retry...`),await new Promise(z=>setTimeout(z,H))}}if(!x)try{console.error("[LIBRARY] \u274C Assets.load failed for:",S),console.error("[LIBRARY] Error details:",C),console.error("[LIBRARY] Error message:",C instanceof Error?C.message:String(C)),console.error("[LIBRARY] Error stack:",C instanceof Error?C.stack:"No stack");try{let H=await(await fetch(S)).blob();console.log("[LIBRARY] Direct fetch successful, blob size:",H.size,"bytes, type:",H.type);let z=new Image,G=URL.createObjectURL(H);await new Promise((Y,V)=>{z.onload=()=>{console.log("[LIBRARY] \u2705 Image decoded successfully via Image API, dimensions:",z.width,"x",z.height),URL.revokeObjectURL(G),Y(null)},z.onerror=F=>{console.error("[LIBRARY] \u274C Image API also failed to decode:",F),URL.revokeObjectURL(G),V(F)},z.src=G}),console.log("[LIBRARY] \u26A0\uFE0F Image is valid via Image API but PixiJS Assets.load failed. This might be a PixiJS-specific issue.")}catch($){console.error("[LIBRARY] \u274C Image verification also failed:",$)}throw new Error(`Failed to load texture after ${E} attempts: ${C instanceof Error?C.message:String(C)}`)}catch($){throw $}Te[P]=x,console.log("[LIBRARY] \u2705 Updated AssetTextures."+P);let k=window.CustomAssets;k!=null&&k[P]&&(k[P].texture=x,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+P));let R=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!R),R){let $=Array.from(((r=R.keys)==null?void 0:r.call(R))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",$);let H=R.get(P);if(console.log("[LIBRARY] gameObject for "+P+"?",!!H),H){let z=((l=H.getDisplayObject)==null?void 0:l.call(H))||H.pixiObject||H.pixi||H,G=(c=z==null?void 0:z.constructor)==null?void 0:c.name;if(console.log("[LIBRARY] displayObject:",z),console.log("[LIBRARY] displayObject type:",G),console.log("[LIBRARY] has texture?",!!(z!=null&&z.texture)),z!=null&&z.texture)z.texture=x,console.log("[LIBRARY] \u2705 Applied to display object:",P);else if(G==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:Y}=await import("pixi.js"),V=z.parent,F=(p=(d=V==null?void 0:V.getChildIndex)==null?void 0:d.call(V,z))!=null?p:0,Q={x:z.x,y:z.y},W={x:(g=(u=z.anchor)==null?void 0:u.x)!=null?g:.5,y:(m=(h=z.anchor)==null?void 0:h.y)!=null?m:.5},K={x:(b=(f=z.scale)==null?void 0:f.x)!=null?b:1,y:(w=(y=z.scale)==null?void 0:y.y)!=null?w:1},X=(v=z.alpha)!=null?v:1,de=(T=z.visible)!=null?T:!0,ee=new Y(x);ee.anchor.set(W.x,W.y),ee.position.set(Q.x,Q.y),ee.scale.set(K.x,K.y),ee.alpha=X,ee.visible=de,V&&(V.removeChild(z),V.addChildAt(ee,F),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),H.pixiObject&&(H.pixiObject=ee),H.pixi&&(H.pixi=ee),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(z!=null&&z.children){let Y=z.children.find(V=>V.texture);Y?(Y.texture=x,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let M=`raw/library/${i}/${t}`;Ys(P,M,x,j),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:P,texture:x,assetPath:M}})),console.log("[LIBRARY] \u{1F4DD} Applying config override:",{objectId:P,path:"render.asset.path",value:M,persist:!0,emitEvent:!0}),qe({objectId:P,path:"render.asset.path",value:M},{persist:!0,emitEvent:!0});let O=window.__configOverrides||[],D=O.find($=>$.objectId===P&&$.path==="render.asset.path");D?console.log("[LIBRARY] \u2705 Override confirmed in localStorage:",{objectId:D.objectId,path:D.path,value:D.value,totalOverrides:O.length}):console.error("[LIBRARY] \u274C Override NOT found in localStorage after save!"),console.log("[LIBRARY] \u2705 Staged config override for:",P,"path:",M),await new Promise($=>setTimeout($,100));let q=(window.__configOverrides||[]).find($=>$.objectId===P&&$.path==="render.asset.path");if(!q)throw new Error("Override not found in localStorage after save! This is a critical error.");if(q.value!==M)throw new Error(`Override value mismatch! Expected: ${M}, Got: ${q.value}`);console.log("[LIBRARY] \u2705 Override verified in localStorage")}catch(P){throw console.error("[LIBRARY] \u274C Error applying slot asset:",P),P}finally{Mi.delete(a)}})();Mi.set(a,s),await s}async function qs(o,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=Vs(a),r=Date.now(),l=`/raw/${t}?t=${r}`;console.log("[LIBRARY] Loading default texture from:",l);let c=await _t.load(l);if(!c){console.error("[LIBRARY] Failed to load default texture:",l);return}Te[a]=c,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let d=window.CustomAssets;d!=null&&d[a]&&(d[a].texture=c,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let p=window.gameObjectManager;if(p){let u=p.get(a);if(u){let g=((n=u.getDisplayObject)==null?void 0:n.call(u))||u.pixiObject||u;g!=null&&g.texture&&(g.texture=c,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Ys(a,t,c,s),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:a,texture:c,assetPath:t}})),qe({objectId:a,path:"render.asset.path",value:t},{persist:!0,emitEvent:!0}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}function Vs(o){var e,t,i;try{let n=window.getEditableObjectConfig,a=typeof n=="function"?n(o):null;return(i=(t=(e=a==null?void 0:a.render)==null?void 0:e.asset)==null?void 0:t.path)!=null?i:null}catch{return null}}function Ys(o,e,t,i){if(e){try{let n=`${o}:${e}`;Xt.set(n,t)}catch{}if(i&&i!==e)try{let n=Xt.store;n!=null&&n.delete&&n.delete(`${o}:${i}`)}catch{}Bs(e,t),i&&i!==e&&Bs(i,null)}}function Bs(o,e){if(!o)return;let t=_t.cache;if(!t)return;let i=o.replace(/^\.?\//,""),n=[i,`/${i}`];for(let a of n)typeof t.remove=="function"?t.remove(a):typeof t.delete=="function"&&t.delete(a),e&&typeof t.set=="function"&&t.set(a,e)}var _i=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
1309
+ `.trim()}function Rs(o){return o.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function Os(o,e){return!(o.includes("background")&&(o.includes("_1")||o.includes("splash")||o.includes("endgame")||o.includes("main"))||e==="text"||e==="effects"&&o.includes("particle"))}async function zs(o){var s,r;let e=Rs(o.gameObjects),t={gamePrompt:o.gamePrompt,gameObjects:e,brandAssets:o.manifest.assets,brandDna:o.manifest.brand_dna,brandName:o.manifest.brand_name},i=js(t),n=[];if(o.flatDesignDataUrl)try{let l=$s(o.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await Ii(o.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(s=l.message)!=null&&s.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(r=l.message)!=null&&r.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return Eo(a,o.gameObjects)}function Eo(o,e){try{let t=o,i=o.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=o.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:o,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:o,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:o,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function En(o,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let s=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,s.game_object);try{let r=await Co(o,s);s.output_dataUrl=r,s.status="Generated \u2713"}catch(r){console.error(`[Pipeline] Failed to generate ${s.game_object}:`,r),s.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Co(o,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&o.manifest){let r=o.manifest.assets.find(l=>l.id===e.reference_asset);if(r){let l=o.assetFiles.get(r.file);if(l){let c=await Ye(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(o.flatDesignDataUrl){let r=$s(o.flatDesignDataUrl);r&&t.push(r)}let i=Os(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:o.manifest.brand_dna,needsTransparency:i},a=_s(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await gt(o.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await ut(s)||s}function $s(o){let[e,t]=o.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function Ds(o,e){let t=o.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],o.assets=i;for(let n of i){let a=e.get(n.file);if(a){let s=await Ye(a);s&&(n.dataUrl=s.dataUrl)}}}function Hs(o){var t,i;let e=new Map;if(!o)return console.warn("[CanvaZip] No position data provided"),e;if(typeof o=="string")try{o=JSON.parse(o)}catch(n){return console.error("[CanvaZip] Failed to parse position data JSON:",n),e}if(o!=null&&o.layers&&Array.isArray(o.layers)){console.log(`[CanvaZip] Parsing ${o.layers.length} layers from position data`);for(let n of o.layers){let a=n.asset;if(!a||!n.layout){console.warn("[CanvaZip] Skipping layer without asset or layout:",n);continue}let s=n.layout,r={x:typeof s.x=="number"?s.x:0,y:typeof s.y=="number"?s.y:0},l=typeof s.scaleX=="number"?s.scaleX:1,c=typeof s.scaleY=="number"?s.scaleY:1,d=(l+c)/2;d>1&&(d=d/13.33);let p=typeof s.rotation=="number"?s.rotation:0;e.set(a,{position:r,scale:d,rotation:p}),console.log(`[CanvaZip] Parsed position for ${a}:`,{position:r,scale:d,rotation:p})}console.log(`[CanvaZip] Successfully parsed ${e.size} assets from position data`)}else console.warn("[CanvaZip] Position data does not have layers array:",o);if(e.size===0&&typeof o=="object"&&!Array.isArray(o)){for(let[n,a]of Object.entries(o))if(a&&typeof a=="object"&&"layout"in a){let s=a.layout,r={x:0,y:0},l=1,c=0;if(s.position&&typeof s.position=="object"?r={x:s.position.x||0,y:s.position.y||0}:(typeof s.x=="number"||typeof s.y=="number")&&(r={x:s.x||0,y:s.y||0}),typeof s.scale=="number")l=s.scale;else if(typeof s.scaleX=="number"||typeof s.scaleY=="number"){let d=(t=s.scaleX)!=null?t:1,p=(i=s.scaleY)!=null?i:1;l=(d+p)/2}typeof s.rotation=="number"&&(c=s.rotation),e.set(n,{position:r,scale:l,rotation:c})}}return e}function Ns(o,e){if(!o)return console.warn("[CanvaZip] No filename provided for matching"),null;if(e.size===0)return console.warn("[CanvaZip] Position map is empty, cannot match:",o),null;if(e.has(o))return console.log(`[CanvaZip] Exact match found for ${o}`),e.get(o);let t=o.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return console.log(`[CanvaZip] Match found (without extension) for ${o} -> ${t}`),e.get(t);let i=t.toLowerCase();for(let[n,a]of e.entries()){let s=n.toLowerCase();if(s===i||s.includes(i)||i.includes(s))return console.log(`[CanvaZip] Partial match found for ${o} -> ${n}`),a}return console.warn(`[CanvaZip] No match found for ${o}. Available keys:`,Array.from(e.keys()).slice(0,5)),null}function Ao(o){return o.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function Fs(){let o=window.getEditableAssets;if(typeof o!="function")return console.warn("[CanvaZip] getEditableAssets not available"),[];let e=o();if(!(e!=null&&e.slots)||!Array.isArray(e.slots))return console.warn("[CanvaZip] No slots found in registry"),[];let t=[];for(let i of e.slots)i.assetType==="image"&&i.objectId&&t.push({id:i.objectId,name:i.displayName||Ao(i.slotId||i.objectId),type:"sprite"});return t.sort((i,n)=>i.name.localeCompare(n.name))}import{Assets as _t}from"pixi.js";async function Gs(o,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),r=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",r);let l=await _t.load(r);if(!l){console.error("[LIBRARY] Failed to load texture:",r);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)Te[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function Us(o,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,s=typeof a=="function"?a():null,r=(t=s==null?void 0:s.slots)==null?void 0:t.find(f=>f.category===e),l=r==null?void 0:r.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 _t.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)Te[f]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let m=window.gameObjectManager;if(m)for(let f of h){let b=m.get(f);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=p,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}var Mi=new Map;async function ji(o,e,t,i){let a=`${e.startsWith("json.")?e.replace("json.",""):e}:${t}`;if(Mi.has(a)){console.log(`[LIBRARY] \u23F3 Operation already in progress for ${a}, waiting...`);try{await Mi.get(a),console.log("[LIBRARY] \u2705 Previous operation completed, current apply should be redundant");return}catch(r){console.warn("[LIBRARY] Previous operation failed, proceeding with new apply:",r)}}let s=(async()=>{var r,l,c,d,p,u,g,h,m,f,b,y,w,v,T;console.log("[LIBRARY] applySlotAsset called:",{objectId:e,assetFilename:t,category:i});try{let P=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key derived:",P,"(from objectId:",e+")");let I=(window.__configOverrides||[]).filter($=>$.path==="render.asset.path"&&$.objectId!==P&&$.value&&$.value.includes(t));I.length>0&&(console.log("[LIBRARY] \u26A0\uFE0F WARNING: Other objects already using this asset:",{assetFilename:t,currentObject:P,otherObjects:I.map($=>({objectId:$.objectId,assetPath:$.value}))}),console.log("[LIBRARY] This is OK - each object will have its own override entry"));let j=Vs(P),L=Date.now(),S=`/raw/library/${i}/${t}?t=${L}`;console.log("[LIBRARY] Loading texture from:",S);try{let $=await fetch(S,{method:"HEAD"});if($.ok){let H=$.headers.get("content-type");console.log("[LIBRARY] File accessible, Content-Type:",H)}else{console.error("[LIBRARY] \u274C File not accessible:",S,"Status:",$.status);let H=await fetch(S),z=H.headers.get("content-type");if(console.error("[LIBRARY] Content-Type:",z,"Status:",H.status),!H.ok)throw new Error(`File not accessible: ${H.status} ${H.statusText}`)}}catch($){console.error("[LIBRARY] \u274C Failed to verify file accessibility:",$)}let x,E=3,C=0,A=null;for(;C<E&&!x;)try{C++,console.log(`[LIBRARY] Loading texture attempt ${C}/${E}:`,S);let $=`${S}${S.includes("?")?"&":"?"}retry=${C}`;if(x=await _t.load($),!x)throw new Error("Assets.load returned null/undefined");console.log("[LIBRARY] \u2705 Texture loaded successfully"),console.log("[LIBRARY] Texture dimensions:",x.width,"x",x.height);break}catch($){if(A=$,console.warn(`[LIBRARY] \u26A0\uFE0F Texture load attempt ${C} failed:`,$ instanceof Error?$.message:String($)),C<E){let H=Math.min(300*C,1e3);console.log(`[LIBRARY] Waiting ${H}ms before retry...`),await new Promise(z=>setTimeout(z,H))}}if(!x)try{console.error("[LIBRARY] \u274C Assets.load failed for:",S),console.error("[LIBRARY] Error details:",A),console.error("[LIBRARY] Error message:",A instanceof Error?A.message:String(A)),console.error("[LIBRARY] Error stack:",A instanceof Error?A.stack:"No stack");try{let H=await(await fetch(S)).blob();console.log("[LIBRARY] Direct fetch successful, blob size:",H.size,"bytes, type:",H.type);let z=new Image,G=URL.createObjectURL(H);await new Promise((Y,V)=>{z.onload=()=>{console.log("[LIBRARY] \u2705 Image decoded successfully via Image API, dimensions:",z.width,"x",z.height),URL.revokeObjectURL(G),Y(null)},z.onerror=F=>{console.error("[LIBRARY] \u274C Image API also failed to decode:",F),URL.revokeObjectURL(G),V(F)},z.src=G}),console.log("[LIBRARY] \u26A0\uFE0F Image is valid via Image API but PixiJS Assets.load failed. This might be a PixiJS-specific issue.")}catch($){console.error("[LIBRARY] \u274C Image verification also failed:",$)}throw new Error(`Failed to load texture after ${E} attempts: ${A instanceof Error?A.message:String(A)}`)}catch($){throw $}Te[P]=x,console.log("[LIBRARY] \u2705 Updated AssetTextures."+P);let k=window.CustomAssets;k!=null&&k[P]&&(k[P].texture=x,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+P));let R=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!R),R){let $=Array.from(((r=R.keys)==null?void 0:r.call(R))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",$);let H=R.get(P);if(console.log("[LIBRARY] gameObject for "+P+"?",!!H),H){let z=((l=H.getDisplayObject)==null?void 0:l.call(H))||H.pixiObject||H.pixi||H,G=(c=z==null?void 0:z.constructor)==null?void 0:c.name;if(console.log("[LIBRARY] displayObject:",z),console.log("[LIBRARY] displayObject type:",G),console.log("[LIBRARY] has texture?",!!(z!=null&&z.texture)),z!=null&&z.texture)z.texture=x,console.log("[LIBRARY] \u2705 Applied to display object:",P);else if(G==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:Y}=await import("pixi.js"),V=z.parent,F=(p=(d=V==null?void 0:V.getChildIndex)==null?void 0:d.call(V,z))!=null?p:0,Q={x:z.x,y:z.y},W={x:(g=(u=z.anchor)==null?void 0:u.x)!=null?g:.5,y:(m=(h=z.anchor)==null?void 0:h.y)!=null?m:.5},K={x:(b=(f=z.scale)==null?void 0:f.x)!=null?b:1,y:(w=(y=z.scale)==null?void 0:y.y)!=null?w:1},X=(v=z.alpha)!=null?v:1,de=(T=z.visible)!=null?T:!0,ee=new Y(x);ee.anchor.set(W.x,W.y),ee.position.set(Q.x,Q.y),ee.scale.set(K.x,K.y),ee.alpha=X,ee.visible=de,V&&(V.removeChild(z),V.addChildAt(ee,F),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),H.pixiObject&&(H.pixiObject=ee),H.pixi&&(H.pixi=ee),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(z!=null&&z.children){let Y=z.children.find(V=>V.texture);Y?(Y.texture=x,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let M=`raw/library/${i}/${t}`;Ys(P,M,x,j),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:P,texture:x,assetPath:M}})),console.log("[LIBRARY] \u{1F4DD} Applying config override:",{objectId:P,path:"render.asset.path",value:M,persist:!0,emitEvent:!0}),qe({objectId:P,path:"render.asset.path",value:M},{persist:!0,emitEvent:!0});let O=window.__configOverrides||[],D=O.find($=>$.objectId===P&&$.path==="render.asset.path");D?console.log("[LIBRARY] \u2705 Override confirmed in localStorage:",{objectId:D.objectId,path:D.path,value:D.value,totalOverrides:O.length}):console.error("[LIBRARY] \u274C Override NOT found in localStorage after save!"),console.log("[LIBRARY] \u2705 Staged config override for:",P,"path:",M),await new Promise($=>setTimeout($,100));let q=(window.__configOverrides||[]).find($=>$.objectId===P&&$.path==="render.asset.path");if(!q)throw new Error("Override not found in localStorage after save! This is a critical error.");if(q.value!==M)throw new Error(`Override value mismatch! Expected: ${M}, Got: ${q.value}`);console.log("[LIBRARY] \u2705 Override verified in localStorage")}catch(P){throw console.error("[LIBRARY] \u274C Error applying slot asset:",P),P}finally{Mi.delete(a)}})();Mi.set(a,s),await s}async function qs(o,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=Vs(a),r=Date.now(),l=`/raw/${t}?t=${r}`;console.log("[LIBRARY] Loading default texture from:",l);let c=await _t.load(l);if(!c){console.error("[LIBRARY] Failed to load default texture:",l);return}Te[a]=c,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let d=window.CustomAssets;d!=null&&d[a]&&(d[a].texture=c,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let p=window.gameObjectManager;if(p){let u=p.get(a);if(u){let g=((n=u.getDisplayObject)==null?void 0:n.call(u))||u.pixiObject||u;g!=null&&g.texture&&(g.texture=c,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Ys(a,t,c,s),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:a,texture:c,assetPath:t}})),qe({objectId:a,path:"render.asset.path",value:t},{persist:!0,emitEvent:!0}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}function Vs(o){var e,t,i;try{let n=window.getEditableObjectConfig,a=typeof n=="function"?n(o):null;return(i=(t=(e=a==null?void 0:a.render)==null?void 0:e.asset)==null?void 0:t.path)!=null?i:null}catch{return null}}function Ys(o,e,t,i){if(e){try{let n=`${o}:${e}`;Xt.set(n,t)}catch{}if(i&&i!==e)try{let n=Xt.store;n!=null&&n.delete&&n.delete(`${o}:${i}`)}catch{}Bs(e,t),i&&i!==e&&Bs(i,null)}}function Bs(o,e){if(!o)return;let t=_t.cache;if(!t)return;let i=o.replace(/^\.?\//,""),n=[i,`/${i}`];for(let a of n)typeof t.remove=="function"?t.remove(a):typeof t.delete=="function"&&t.delete(a),e&&typeof t.set=="function"&&t.set(a,e)}var _i=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
1310
1310
  <div class="canva-wizard-overlay" data-canva-wizard>
1311
1311
  <div class="canva-wizard-modal">
1312
1312
  <div class="canva-wizard-header">
@@ -1753,7 +1753,7 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1753
1753
  </div>
1754
1754
  </div>
1755
1755
  </div>
1756
- `;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]"),(r=this.aiRemoveBgToggle)==null||r.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 y,w;let b=(w=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?w:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var y,w;let b=(w=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?w:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var y,w,v;let b=(v=(w=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:w[0])!=null?v:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(m=this.aiCropBtn)==null||m.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,h,m,f,b,y,w,v,T,P,_,I,j,L,S,x,E;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(b=(f=(m=this.aiPromptInput)==null?void 0:m.value)==null?void 0:f.trim())!=null?b:"",n=(w=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?w:!1,a=n,s=n,r=Number((T=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?T:"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())||((_=this.aiBaseValue)==null?void 0:_.trim())||"";this.setAiLoading(!0),this.setAiStatus(c?"Generating...":"Generating from scratch...");try{let A=null,C=null,k=(I=this.getSelectedAssetKey())!=null?I:"unknown",R=(j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((L=this.aiUseOutputToggle)!=null&&L.checked&&this.aiOutputDataUrl){let H=wn(this.aiOutputDataUrl,"ai-output.png");if(H){let z=await Ye(H);z&&(A={input:{base64:z.base64,mimeType:z.mimeType},dataUrl:z.dataUrl,width:z.width,height:z.height})}}!A&&c&&(A=await this.getImageDataFromAsset(c));let M=[];A&&M.push(A.input);let O=!1;if(this.aiReferenceFile){let H=await Ye(this.aiReferenceFile);H?(C={input:{base64:H.base64,mimeType:H.mimeType},dataUrl:H.dataUrl,width:H.width,height:H.height},M.push(C.input),O=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let D=Ws(i,{includeReference:O,includeMagenta:a,changeLevel:r}),N=(x=(S=this.aiReferenceFile)==null?void 0:S.name)!=null?x:"none";console.info("[AI] Final prompt:",D),console.info("[AI] Image sources:",{assetKey:k,base:R,reference:N});let q=A?xn(A.width,A.height):C?xn(C.width,C.height):"1:1";console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let $=await gt(e,D,M,{aspectRatio:q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",$==null?void 0:$.length),this.aiRawOutputDataUrl=$,await this.refreshAiOutputFromRaw()}catch(A){console.error("[CustomizePanel] AI Generate Error:",A),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((E=this.aiStatusEl)==null?void 0:E.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,s,r;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((r=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?r:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await ut(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,r;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),h=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((r=m.dataset.assetKey)!=null?r:"",m)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&y){let w=this.getFilenameFromPath(c.path);await b(g,w,n)}else this.applyObjectPropertyValue(g,h,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{f(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var s;let t=(s=this.aiContext)==null?void 0:s.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let r=n();if(r!=null&&r.slots){let l=r.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 r;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(r=e==null?void 0:e.value)!=null?r:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=wn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let s=await vn(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){var u,g,h,m,f;console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let b=await this.getImageDimensions(n);if(b){let y=await this.showManualCropModal(e,b,n);if(!y)return;a=y}}let s=await vn(a);if(!s){console.error("[CustomizePanel] Failed to convert file to data URL");return}let r=i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),l=((u=e.name.toLowerCase().match(/\.(png|jpg|jpeg|gif|webp)$/))==null?void 0:u[1])||"png",c=l==="jpg"?"jpeg":l,d=`${r}_uploaded_${Date.now()}.${c}`,p=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",d,"category:",p);try{let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:p,filename:d,data:s,overwrite:!0})})).json();if(y.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",y.path),await new Promise(L=>setTimeout(L,100));let w=window.addAssetToRegistry;typeof w=="function"&&(w(p,d),console.log("[CustomizePanel] \u2705 Added to registry:",p,d));let v=window.getEditableAssets;if(typeof v=="function"){let L=v();L&&!L.categories&&(L.categories=[]),L!=null&&L.categories&&!L.categories.includes(p)&&(L.categories.push(p),console.log(`[CustomizePanel] Added category ${p} to registry`))}let T=!1,P=0,_=10;for(;!T&&P<_;){P++,console.log(`[CustomizePanel] Refresh attempt ${P}/${_}...`);try{(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok&&console.log("[CustomizePanel] \u2705 Registry rebuilt from disk")}catch(E){console.warn("[CustomizePanel] Setup-library not available:",E)}await new Promise(E=>setTimeout(E,300));let L=window.refreshAssetLibrary;typeof L=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await L());let S=window.reRenderAssetLibrary;typeof S=="function"&&(console.log("[CustomizePanel] Re-rendering library panel..."),S());let x=window.getEditableAssets;if(typeof x=="function"){let E=x(),A=((g=E==null?void 0:E.libraryAssets)==null?void 0:g[p])||[];A.some(k=>(k==null?void 0:k.filename)===d)?(console.log("[CustomizePanel] \u2705 Asset found in registry!"),T=!0):(console.log(`[CustomizePanel] Asset not found yet, retrying... (found ${A.length} assets in ${p})`),await new Promise(k=>setTimeout(k,500)))}else P>=2&&(T=!0)}T||console.warn("[CustomizePanel] \u26A0\uFE0F Asset not found in registry after retries, proceeding anyway..."),t.value=y.path,this.handleAssetValueChange(i,t);let I=this.inferObjectIdFromAssetKey(i),j=this.inferPathFromAssetKey(i);if(I&&j){let L=!1,S=0,x=5;for(;!L&&S<x;){S++;try{console.log(`[CustomizePanel] Applying asset attempt ${S}/${x}...`);let A=window.applyAssetToSlot,C=/texture|image|sprite|asset\\.path/i.test(j)||/\\.(png|jpg|jpeg)$/i.test(String(y.path||""));if(typeof A=="function"&&C){let R=this.getFilenameFromPath(y.path);await A(I,R,p)}else this.applyObjectPropertyValue(I,j,y.path);await new Promise(R=>setTimeout(R,200));let k=window.getEditableObjectConfig;if(typeof k=="function"){let R=k(I),M=((m=(h=R==null?void 0:R.render)==null?void 0:h.asset)==null?void 0:m.path)||((f=R==null?void 0:R.ui)==null?void 0:f.image)||"";M===y.path||M.includes(d)?(console.log("[CustomizePanel] \u2705 Asset confirmed applied to object"),L=!0):(console.log(`[CustomizePanel] Asset not applied yet (attempt ${S}), retrying...`),await new Promise(O=>setTimeout(O,300)))}else L=!0}catch(A){console.error(`[CustomizePanel] Apply attempt ${S} failed:`,A),S<x&&await new Promise(C=>setTimeout(C,500))}}window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:I,action:"update",path:j}})),setTimeout(()=>{try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),console.log("[CustomizePanel] Dispatched config:changed event")}catch(A){console.warn("[CustomizePanel] Failed to refresh textures:",A)}},300);let E=window.__highlightLibrarySlot;typeof E=="function"&&I&&setTimeout(()=>{E(I,p)},1e3),L?console.log("[CustomizePanel] \u2705 Upload complete and applied!"):console.warn("[CustomizePanel] \u26A0\uFE0F Upload succeeded but apply may have failed")}else console.log("[CustomizePanel] \u2705 Upload complete (no object context to apply)")}else console.error("[CustomizePanel] \u274C Upload save failed:",y.error),alert(`Failed to save uploaded file: ${y.error}`)}catch(b){console.error("[CustomizePanel] \u274C Upload error:",b),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=`
1756
+ `;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]"),(r=this.aiRemoveBgToggle)==null||r.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 y,w;let b=(w=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?w:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var y,w;let b=(w=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?w:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var y,w,v;let b=(v=(w=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:w[0])!=null?v:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(m=this.aiCropBtn)==null||m.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,h,m,f,b,y,w,v,T,P,_,I,j,L,S,x,E;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(b=(f=(m=this.aiPromptInput)==null?void 0:m.value)==null?void 0:f.trim())!=null?b:"",n=(w=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?w:!1,a=n,s=n,r=Number((T=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?T:"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())||((_=this.aiBaseValue)==null?void 0:_.trim())||"";this.setAiLoading(!0),this.setAiStatus(c?"Generating...":"Generating from scratch...");try{let C=null,A=null,k=(I=this.getSelectedAssetKey())!=null?I:"unknown",R=(j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((L=this.aiUseOutputToggle)!=null&&L.checked&&this.aiOutputDataUrl){let H=wn(this.aiOutputDataUrl,"ai-output.png");if(H){let z=await Ye(H);z&&(C={input:{base64:z.base64,mimeType:z.mimeType},dataUrl:z.dataUrl,width:z.width,height:z.height})}}!C&&c&&(C=await this.getImageDataFromAsset(c));let M=[];C&&M.push(C.input);let O=!1;if(this.aiReferenceFile){let H=await Ye(this.aiReferenceFile);H?(A={input:{base64:H.base64,mimeType:H.mimeType},dataUrl:H.dataUrl,width:H.width,height:H.height},M.push(A.input),O=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let D=Ws(i,{includeReference:O,includeMagenta:a,changeLevel:r}),N=(x=(S=this.aiReferenceFile)==null?void 0:S.name)!=null?x:"none";console.info("[AI] Final prompt:",D),console.info("[AI] Image sources:",{assetKey:k,base:R,reference:N});let q=C?xn(C.width,C.height):A?xn(A.width,A.height):"1:1";console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let $=await gt(e,D,M,{aspectRatio:q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",$==null?void 0:$.length),this.aiRawOutputDataUrl=$,await this.refreshAiOutputFromRaw()}catch(C){console.error("[CustomizePanel] AI Generate Error:",C),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((E=this.aiStatusEl)==null?void 0:E.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,s,r;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((r=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?r:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await ut(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,r;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),h=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((r=m.dataset.assetKey)!=null?r:"",m)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&y){let w=this.getFilenameFromPath(c.path);await b(g,w,n)}else this.applyObjectPropertyValue(g,h,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{f(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var s;let t=(s=this.aiContext)==null?void 0:s.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let r=n();if(r!=null&&r.slots){let l=r.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 r;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(r=e==null?void 0:e.value)!=null?r:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=wn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let s=await vn(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){var u,g,h,m,f;console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let b=await this.getImageDimensions(n);if(b){let y=await this.showManualCropModal(e,b,n);if(!y)return;a=y}}let s=await vn(a);if(!s){console.error("[CustomizePanel] Failed to convert file to data URL");return}let r=i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),l=((u=e.name.toLowerCase().match(/\.(png|jpg|jpeg|gif|webp)$/))==null?void 0:u[1])||"png",c=l==="jpg"?"jpeg":l,d=`${r}_uploaded_${Date.now()}.${c}`,p=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",d,"category:",p);try{let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:p,filename:d,data:s,overwrite:!0})})).json();if(y.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",y.path),await new Promise(L=>setTimeout(L,100));let w=window.addAssetToRegistry;typeof w=="function"&&(w(p,d),console.log("[CustomizePanel] \u2705 Added to registry:",p,d));let v=window.getEditableAssets;if(typeof v=="function"){let L=v();L&&!L.categories&&(L.categories=[]),L!=null&&L.categories&&!L.categories.includes(p)&&(L.categories.push(p),console.log(`[CustomizePanel] Added category ${p} to registry`))}let T=!1,P=0,_=10;for(;!T&&P<_;){P++,console.log(`[CustomizePanel] Refresh attempt ${P}/${_}...`);try{(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok&&console.log("[CustomizePanel] \u2705 Registry rebuilt from disk")}catch(E){console.warn("[CustomizePanel] Setup-library not available:",E)}await new Promise(E=>setTimeout(E,300));let L=window.refreshAssetLibrary;typeof L=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await L());let S=window.reRenderAssetLibrary;typeof S=="function"&&(console.log("[CustomizePanel] Re-rendering library panel..."),S());let x=window.getEditableAssets;if(typeof x=="function"){let E=x(),C=((g=E==null?void 0:E.libraryAssets)==null?void 0:g[p])||[];C.some(k=>(k==null?void 0:k.filename)===d)?(console.log("[CustomizePanel] \u2705 Asset found in registry!"),T=!0):(console.log(`[CustomizePanel] Asset not found yet, retrying... (found ${C.length} assets in ${p})`),await new Promise(k=>setTimeout(k,500)))}else P>=2&&(T=!0)}T||console.warn("[CustomizePanel] \u26A0\uFE0F Asset not found in registry after retries, proceeding anyway..."),t.value=y.path,this.handleAssetValueChange(i,t);let I=this.inferObjectIdFromAssetKey(i),j=this.inferPathFromAssetKey(i);if(I&&j){let L=!1,S=0,x=5;for(;!L&&S<x;){S++;try{console.log(`[CustomizePanel] Applying asset attempt ${S}/${x}...`);let C=window.applyAssetToSlot,A=/texture|image|sprite|asset\\.path/i.test(j)||/\\.(png|jpg|jpeg)$/i.test(String(y.path||""));if(typeof C=="function"&&A){let R=this.getFilenameFromPath(y.path);await C(I,R,p)}else this.applyObjectPropertyValue(I,j,y.path);await new Promise(R=>setTimeout(R,200));let k=window.getEditableObjectConfig;if(typeof k=="function"){let R=k(I),M=((m=(h=R==null?void 0:R.render)==null?void 0:h.asset)==null?void 0:m.path)||((f=R==null?void 0:R.ui)==null?void 0:f.image)||"";M===y.path||M.includes(d)?(console.log("[CustomizePanel] \u2705 Asset confirmed applied to object"),L=!0):(console.log(`[CustomizePanel] Asset not applied yet (attempt ${S}), retrying...`),await new Promise(O=>setTimeout(O,300)))}else L=!0}catch(C){console.error(`[CustomizePanel] Apply attempt ${S} failed:`,C),S<x&&await new Promise(A=>setTimeout(A,500))}}window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:I,action:"update",path:j}})),setTimeout(()=>{try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),console.log("[CustomizePanel] Dispatched config:changed event")}catch(C){console.warn("[CustomizePanel] Failed to refresh textures:",C)}},300);let E=window.__highlightLibrarySlot;typeof E=="function"&&I&&setTimeout(()=>{E(I,p)},1e3),L?console.log("[CustomizePanel] \u2705 Upload complete and applied!"):console.warn("[CustomizePanel] \u26A0\uFE0F Upload succeeded but apply may have failed")}else console.log("[CustomizePanel] \u2705 Upload complete (no object context to apply)")}else console.error("[CustomizePanel] \u274C Upload save failed:",y.error),alert(`Failed to save uploaded file: ${y.error}`)}catch(b){console.error("[CustomizePanel] \u274C Upload error:",b),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=`
1757
1757
  <div class="asset-preview-card">
1758
1758
  <div class="asset-preview-header">
1759
1759
  <div class="asset-preview-title">${e}</div>
@@ -1799,7 +1799,7 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1799
1799
  <button class="asset-crop-apply" type="button">Apply Crop</button>
1800
1800
  </div>
1801
1801
  </div>
1802
- `;let y=c.querySelector(".asset-crop-canvas"),w=c.querySelector(".asset-crop-preview"),v=c.querySelector(".asset-crop-zoom"),T=c.querySelector(".asset-crop-zoom-value"),P=c.querySelector(".asset-crop-close"),_=c.querySelector(".asset-crop-cancel"),I=c.querySelector(".asset-crop-apply"),j=c.querySelector(".asset-crop-reset");if(!y||!w||!v||!T){l(null);return}let L=y.getContext("2d"),S=w.getContext("2d");if(!L||!S){l(null);return}let x=s.naturalWidth,E=s.naturalHeight,A=Math.max(y.width/x,y.height/E),C=1,k=0,R=0,M=!1,O=0,D=0,N=0,q=0,$=()=>{let F=A*C,Q=Math.max(0,(x*F-y.width)/2),W=Math.max(0,(E*F-y.height)/2);k=Math.min(Q,Math.max(-Q,k)),R=Math.min(W,Math.max(-W,R))},H=()=>{if(!s||!s.complete||s.naturalWidth===0||s.naturalHeight===0){console.warn("[CustomizePanel] Image not ready for drawing"),L.fillStyle="rgba(128, 128, 128, 0.3)",L.fillRect(0,0,y.width,y.height),L.fillStyle="rgba(255, 255, 255, 0.5)",L.font="14px sans-serif",L.textAlign="center",L.fillText("Loading image...",y.width/2,y.height/2);return}let F=A*C;L.clearRect(0,0,y.width,y.height);let Q=y.width/2-x*F/2+k,W=y.height/2-E*F/2+R;try{L.drawImage(s,Q,W,x*F,E*F)}catch(J){console.error("[CustomizePanel] Error drawing image:",J),L.fillStyle="rgba(255, 0, 0, 0.3)",L.fillRect(0,0,y.width,y.height),L.fillStyle="#ff0000",L.font="14px sans-serif",L.textAlign="center",L.fillText("Error drawing image",y.width/2,y.height/2)}if(S.clearRect(0,0,w.width,w.height),r!=null&&r.naturalWidth&&(r!=null&&r.naturalHeight)){let J=Math.max(w.width/r.naturalWidth,w.height/r.naturalHeight),le=w.width/2-r.naturalWidth*J/2,ie=w.height/2-r.naturalHeight*J/2;S.drawImage(r,le,ie,r.naturalWidth*J,r.naturalHeight*J)}else S.fillStyle="rgba(255, 255, 255, 0.04)",S.fillRect(0,0,w.width,w.height),S.strokeStyle="rgba(255, 255, 255, 0.08)",S.strokeRect(4,4,w.width-8,w.height-8);let K=w.width/y.width*(A*C),X=k*(w.width/y.width),de=R*(w.height/y.height),ee=w.width/2-x*K/2+X,we=w.height/2-E*K/2+de;S.save(),S.globalAlpha=.7,S.drawImage(s,ee,we,x*K,E*K),S.restore()},z=()=>{k=0,R=0,$(),H()};v.addEventListener("input",()=>{C=Number(v.value),T.textContent=`${C.toFixed(2)}\xD7`,$(),H()}),y.addEventListener("pointerdown",F=>{M=!0,O=F.clientX,D=F.clientY,N=k,q=R,y.setPointerCapture(F.pointerId)}),y.addEventListener("pointermove",F=>{M&&(k=N+(F.clientX-O),R=q+(F.clientY-D),$(),H())}),y.addEventListener("pointerup",F=>{M=!1,y.releasePointerCapture(F.pointerId)}),y.addEventListener("pointerleave",()=>{M=!1});let G=()=>{c.remove();try{URL.revokeObjectURL(a)}catch{}},Y=()=>{G(),l(null)},V=async()=>{let F=document.createElement("canvas");F.width=t.width,F.height=t.height;let Q=F.getContext("2d");if(!Q){G(),l(null);return}let W=C,X=Math.max(F.width/x,F.height/E)*W,de=F.width/y.width,ee=k*de,we=R*de,J=F.width/2-x*X/2+ee,le=F.height/2-E*X/2+we;Q.drawImage(s,J,le,x*X,E*X);let ie=await new Promise(se=>{F.toBlob(Ce=>se(Ce),e.type||"image/png")});if(G(),!ie){l(null);return}l(new File([ie],e.name,{type:ie.type}))};P==null||P.addEventListener("click",Y),_==null||_.addEventListener("click",Y),j==null||j.addEventListener("click",z),I==null||I.addEventListener("click",()=>{V()}),c.addEventListener("click",F=>{F.target===c&&Y()}),document.body.appendChild(c),s.complete&&s.naturalWidth>0&&s.naturalHeight>0?z():(s.onload=()=>{console.log("[CustomizePanel] Image fully loaded, drawing crop modal"),z()},s.onerror=()=>{console.error("[CustomizePanel] Image failed to load"),G(),l(null)})})}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 zi=class{constructor(){this.root=null;this.options=null}render(){return`
1802
+ `;let y=c.querySelector(".asset-crop-canvas"),w=c.querySelector(".asset-crop-preview"),v=c.querySelector(".asset-crop-zoom"),T=c.querySelector(".asset-crop-zoom-value"),P=c.querySelector(".asset-crop-close"),_=c.querySelector(".asset-crop-cancel"),I=c.querySelector(".asset-crop-apply"),j=c.querySelector(".asset-crop-reset");if(!y||!w||!v||!T){l(null);return}let L=y.getContext("2d"),S=w.getContext("2d");if(!L||!S){l(null);return}let x=s.naturalWidth,E=s.naturalHeight,C=Math.max(y.width/x,y.height/E),A=1,k=0,R=0,M=!1,O=0,D=0,N=0,q=0,$=()=>{let F=C*A,Q=Math.max(0,(x*F-y.width)/2),W=Math.max(0,(E*F-y.height)/2);k=Math.min(Q,Math.max(-Q,k)),R=Math.min(W,Math.max(-W,R))},H=()=>{if(!s||!s.complete||s.naturalWidth===0||s.naturalHeight===0){console.warn("[CustomizePanel] Image not ready for drawing"),L.fillStyle="rgba(128, 128, 128, 0.3)",L.fillRect(0,0,y.width,y.height),L.fillStyle="rgba(255, 255, 255, 0.5)",L.font="14px sans-serif",L.textAlign="center",L.fillText("Loading image...",y.width/2,y.height/2);return}let F=C*A;L.clearRect(0,0,y.width,y.height);let Q=y.width/2-x*F/2+k,W=y.height/2-E*F/2+R;try{L.drawImage(s,Q,W,x*F,E*F)}catch(J){console.error("[CustomizePanel] Error drawing image:",J),L.fillStyle="rgba(255, 0, 0, 0.3)",L.fillRect(0,0,y.width,y.height),L.fillStyle="#ff0000",L.font="14px sans-serif",L.textAlign="center",L.fillText("Error drawing image",y.width/2,y.height/2)}if(S.clearRect(0,0,w.width,w.height),r!=null&&r.naturalWidth&&(r!=null&&r.naturalHeight)){let J=Math.max(w.width/r.naturalWidth,w.height/r.naturalHeight),le=w.width/2-r.naturalWidth*J/2,ie=w.height/2-r.naturalHeight*J/2;S.drawImage(r,le,ie,r.naturalWidth*J,r.naturalHeight*J)}else S.fillStyle="rgba(255, 255, 255, 0.04)",S.fillRect(0,0,w.width,w.height),S.strokeStyle="rgba(255, 255, 255, 0.08)",S.strokeRect(4,4,w.width-8,w.height-8);let K=w.width/y.width*(C*A),X=k*(w.width/y.width),de=R*(w.height/y.height),ee=w.width/2-x*K/2+X,we=w.height/2-E*K/2+de;S.save(),S.globalAlpha=.7,S.drawImage(s,ee,we,x*K,E*K),S.restore()},z=()=>{k=0,R=0,$(),H()};v.addEventListener("input",()=>{A=Number(v.value),T.textContent=`${A.toFixed(2)}\xD7`,$(),H()}),y.addEventListener("pointerdown",F=>{M=!0,O=F.clientX,D=F.clientY,N=k,q=R,y.setPointerCapture(F.pointerId)}),y.addEventListener("pointermove",F=>{M&&(k=N+(F.clientX-O),R=q+(F.clientY-D),$(),H())}),y.addEventListener("pointerup",F=>{M=!1,y.releasePointerCapture(F.pointerId)}),y.addEventListener("pointerleave",()=>{M=!1});let G=()=>{c.remove();try{URL.revokeObjectURL(a)}catch{}},Y=()=>{G(),l(null)},V=async()=>{let F=document.createElement("canvas");F.width=t.width,F.height=t.height;let Q=F.getContext("2d");if(!Q){G(),l(null);return}let W=A,X=Math.max(F.width/x,F.height/E)*W,de=F.width/y.width,ee=k*de,we=R*de,J=F.width/2-x*X/2+ee,le=F.height/2-E*X/2+we;Q.drawImage(s,J,le,x*X,E*X);let ie=await new Promise(se=>{F.toBlob(Ae=>se(Ae),e.type||"image/png")});if(G(),!ie){l(null);return}l(new File([ie],e.name,{type:ie.type}))};P==null||P.addEventListener("click",Y),_==null||_.addEventListener("click",Y),j==null||j.addEventListener("click",z),I==null||I.addEventListener("click",()=>{V()}),c.addEventListener("click",F=>{F.target===c&&Y()}),document.body.appendChild(c),s.complete&&s.naturalWidth>0&&s.naturalHeight>0?z():(s.onload=()=>{console.log("[CustomizePanel] Image fully loaded, drawing crop modal"),z()},s.onerror=()=>{console.error("[CustomizePanel] Image failed to load"),G(),l(null)})})}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 zi=class{constructor(){this.root=null;this.options=null}render(){return`
1803
1803
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
1804
1804
  <div class="scene-panel-header" data-panel-handle>
1805
1805
  <div class="panel-title">
@@ -1865,10 +1865,10 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1865
1865
  </div>
1866
1866
  </div>
1867
1867
  </div>
1868
- `}initialize(e,t){var y,w,v,T,P,_,I,j,L,S,x,E,A,C,k,R;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var O;let M=window.getEditableEngineConfig;if(typeof M=="function"){let D=M();return(O=D==null?void 0:D.loading)!=null?O:{}}return{}})(),a=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{type:a.value}),this.updateFieldVisibility(a.value)}));let s=(w=this.root)==null?void 0:w.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{background_color:s.value})}));let r=(v=this.root)==null?void 0:v.querySelector("#loading-overlay-alpha"),l=(T=this.root)==null?void 0:T.querySelector("#loading-overlay-alpha-value");r&&(r.value=String((P=n.overlay_alpha)!=null?P:1),l&&(l.textContent=Number(r.value).toFixed(2)),r.addEventListener("input",()=>{var O,D;let M=Number(r.value);l&&(l.textContent=M.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{overlay_alpha:M})}));let c=(_=this.root)==null?void 0:_.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{text:c.value})}));let d=(I=this.root)==null?void 0:I.querySelector("#loading-text-scale"),p=(j=this.root)==null?void 0:j.querySelector("#loading-text-scale-value");d&&(d.value=String((L=n.text_scale)!=null?L:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var O,D;let M=Number(d.value);p&&(p.textContent=M.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{text_scale:M})}));let u=(S=this.root)==null?void 0:S.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{enabled:u.checked})}));let g=(x=this.root)==null?void 0:x.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{blur_enabled:g.checked})}));let h=(E=this.root)==null?void 0:E.querySelector("#loading-blur-strength"),m=(A=this.root)==null?void 0:A.querySelector("#loading-blur-strength-value");h&&(h.value=String((C=n.blur_strength)!=null?C:8),m&&(m.textContent=h.value),h.addEventListener("input",()=>{var M,O;m&&(m.textContent=h.value),(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{blur_strength:Number(h.value)})}));let f=(k=this.root)==null?void 0:k.querySelector("#loading-show-btn"),b=(R=this.root)==null?void 0:R.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onShowLoadingScreen)==null||O.call(M)}),b==null||b.addEventListener("click",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onHideLoadingScreen)==null||O.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{Graphics as er,Point as Po}from"pixi.js";import{Point as Xs}from"pixi.js";var We=()=>window.debugConfig||{},Js=()=>window.resolveAnchorVec2||(o=>({x:.5,y:.5})),Zs=()=>window.resolveScreenAnchorPoint||(()=>new Xs),Qs=()=>window.resolveScreenRatioPoint||(()=>new Xs);function tr(o){$i(o)&&(o.objectDebugRaf||(o.objectDebugRaf=window.requestAnimationFrame(()=>Di(o))))}function ir(o){o.objectDebugRaf&&(window.cancelAnimationFrame(o.objectDebugRaf),o.objectDebugRaf=null),Ot(o)}function $i(o){return o.isDebugOpen}function Di(o){var a,s,r;if(!$i(o)){o.objectDebugRaf=null;return}o.objectDebugRaf=window.requestAnimationFrame(()=>Di(o));let e=An(o);if(!e){Rt(o,null),Ot(o);return}let t=Cn(o,e);if(!t){Rt(o,null),Ot(o);return}let i=new Po;(a=t.getGlobalPosition)==null||a.call(t,i);let n=Ln(o,t);Rt(o,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(r=n==null?void 0:n.y)!=null?r:null}),o.highlightObject?In(o,t):jn(o),o.highlightAnchor&&n?Mn(o,n):_n(o)}function An(o){var n;let e=o.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 Cn(o,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 zt(o){let e=o.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Ln(o,e){var s,r;let t=zt(o);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=kn(o);if(!n)return null;if(i.position_ratio!=null)return Qs()(n.width,n.height,i.position_ratio);let a=(r=i.anchor)!=null?r:"bottom-center";return a==="bottom-center"&&i.anchor==null&&console.log("[DEBUG FALLBACK] objectVisuals transform.anchor \u2192 bottom-center"),Zs()(n.width,n.height,a)}function kn(o){var a;let e=(a=o.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 Tn(o){let e=window.gameApp;return e!=null&&e.stage?(o.objectBoundsGfx&&o.objectBoundsGfx.parent!==e.stage&&(o.objectBoundsGfx.destroy(),o.objectBoundsGfx=null),o.objectBoundsGfx||(o.objectBoundsGfx=new er,o.objectBoundsGfx.zIndex=999999,e.stage.addChild(o.objectBoundsGfx)),o.objectBoundsGfx):null}function Pn(o){let e=window.gameApp;return e!=null&&e.stage?(o.objectAnchorGfx&&o.objectAnchorGfx.parent!==e.stage&&(o.objectAnchorGfx.destroy(),o.objectAnchorGfx=null),o.objectAnchorGfx||(o.objectAnchorGfx=new er,o.objectAnchorGfx.zIndex=1e6,e.stage.addChild(o.objectAnchorGfx)),o.objectAnchorGfx):null}function In(o,e){var n;let t=Tn(o);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 Mn(o,e){let t=Pn(o);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 jn(o){o.objectBoundsGfx&&o.objectBoundsGfx.clear()}function _n(o){o.objectAnchorGfx&&o.objectAnchorGfx.clear()}function Ot(o){o.objectBoundsGfx&&(o.objectBoundsGfx.destroy(),o.objectBoundsGfx=null),o.objectAnchorGfx&&(o.objectAnchorGfx.destroy(),o.objectAnchorGfx=null)}function Rt(o,e){o.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function nr(o,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,o)}function ar(o,e,t){var s;let i=e.split("."),n=i.pop(),a=o;for(let r of i)a[r]=(s=a[r])!=null?s:{},a=a[r];a[n]=t}function Rn(o){var i,n,a,s,r;if(!o)return!1;if((i=o.transform)!=null&&i.offset)return!0;let e=((a=(n=o.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((r=(s=o.identity)==null?void 0:s.id)!=null?r:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Ni(o){let e=We();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(o){window.location.reload()}function Fi(o){let e=JSON.stringify(We(),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 rr(o,e){var t,i,n;if(!(!o.configViewer||!o.container))try{let a=window.getEditableObjectConfig,s=typeof a=="function"?a(e):null;if(!s){let{loadObjectCentricConfig:r,loadObjectConfig:l}=await import("./config-M6BRZXRD.js"),p=(((t=(await r("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),Hi(o,u),(i=o.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),Hi(o,s),(n=o.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function Hi(o,e){var u,g,h,m,f,b,y,w,v,T;if(!o.container)return;let t=o.container.querySelector("#config-pos-x"),i=o.container.querySelector("#config-pos-y"),n=o.container.querySelector("#config-scale"),a=o.container.querySelector("#config-anchor-preset"),s=o.container.querySelector("#config-anchor-x"),r=o.container.querySelector("#config-anchor-y"),c=Rn(e)?(u=e.transform)==null?void 0:u.offset:(g=e.transform)==null?void 0:g.position;t&&(t.value=String((h=c==null?void 0:c.x)!=null?h:0)),i&&(i.value=String((m=c==null?void 0:c.y)!=null?m:0)),n&&(n.value=String((b=(f=e.transform)==null?void 0:f.scale)!=null?b:1));let d=(T=(v=(y=e.transform)==null?void 0:y.anchor)!=null?v:(w=e.render)==null?void 0:w.anchor)!=null?T:"center";if(a){typeof d=="string"?a.value=d:a.value="custom";let P=o.container.querySelectorAll(".anchor-custom-field"),_=a.value==="custom";P.forEach(I=>I.style.display=_?"block":"none")}let p=Js()(d);s&&(s.value=String(p.x)),r&&(r.value=String(p.y))}function or(o){var l,c,d,p,u,g,h,m,f,b;let e=o.selectedObjectId;if(!e||!o.container)return;let t=(c=(l=o.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=o.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=o.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(m=(h=o.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?m:"0.5",s=(b=(f=o.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?b:"0.5",r=`${e}:
1868
+ `}initialize(e,t){var y,w,v,T,P,_,I,j,L,S,x,E,C,A,k,R;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var O;let M=window.getEditableEngineConfig;if(typeof M=="function"){let D=M();return(O=D==null?void 0:D.loading)!=null?O:{}}return{}})(),a=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{type:a.value}),this.updateFieldVisibility(a.value)}));let s=(w=this.root)==null?void 0:w.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{background_color:s.value})}));let r=(v=this.root)==null?void 0:v.querySelector("#loading-overlay-alpha"),l=(T=this.root)==null?void 0:T.querySelector("#loading-overlay-alpha-value");r&&(r.value=String((P=n.overlay_alpha)!=null?P:1),l&&(l.textContent=Number(r.value).toFixed(2)),r.addEventListener("input",()=>{var O,D;let M=Number(r.value);l&&(l.textContent=M.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{overlay_alpha:M})}));let c=(_=this.root)==null?void 0:_.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{text:c.value})}));let d=(I=this.root)==null?void 0:I.querySelector("#loading-text-scale"),p=(j=this.root)==null?void 0:j.querySelector("#loading-text-scale-value");d&&(d.value=String((L=n.text_scale)!=null?L:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var O,D;let M=Number(d.value);p&&(p.textContent=M.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{text_scale:M})}));let u=(S=this.root)==null?void 0:S.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{enabled:u.checked})}));let g=(x=this.root)==null?void 0:x.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{blur_enabled:g.checked})}));let h=(E=this.root)==null?void 0:E.querySelector("#loading-blur-strength"),m=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength-value");h&&(h.value=String((A=n.blur_strength)!=null?A:8),m&&(m.textContent=h.value),h.addEventListener("input",()=>{var M,O;m&&(m.textContent=h.value),(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{blur_strength:Number(h.value)})}));let f=(k=this.root)==null?void 0:k.querySelector("#loading-show-btn"),b=(R=this.root)==null?void 0:R.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onShowLoadingScreen)==null||O.call(M)}),b==null||b.addEventListener("click",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onHideLoadingScreen)==null||O.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{Graphics as er,Point as Po}from"pixi.js";import{Point as Xs}from"pixi.js";var We=()=>window.debugConfig||{},Js=()=>window.resolveAnchorVec2||(o=>({x:.5,y:.5})),Zs=()=>window.resolveScreenAnchorPoint||(()=>new Xs),Qs=()=>window.resolveScreenRatioPoint||(()=>new Xs);function tr(o){$i(o)&&(o.objectDebugRaf||(o.objectDebugRaf=window.requestAnimationFrame(()=>Di(o))))}function ir(o){o.objectDebugRaf&&(window.cancelAnimationFrame(o.objectDebugRaf),o.objectDebugRaf=null),Ot(o)}function $i(o){return o.isDebugOpen}function Di(o){var a,s,r;if(!$i(o)){o.objectDebugRaf=null;return}o.objectDebugRaf=window.requestAnimationFrame(()=>Di(o));let e=Cn(o);if(!e){Rt(o,null),Ot(o);return}let t=An(o,e);if(!t){Rt(o,null),Ot(o);return}let i=new Po;(a=t.getGlobalPosition)==null||a.call(t,i);let n=Ln(o,t);Rt(o,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(r=n==null?void 0:n.y)!=null?r:null}),o.highlightObject?In(o,t):jn(o),o.highlightAnchor&&n?Mn(o,n):_n(o)}function Cn(o){var n;let e=o.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 An(o,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 zt(o){let e=o.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Ln(o,e){var s,r;let t=zt(o);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=kn(o);if(!n)return null;if(i.position_ratio!=null)return Qs()(n.width,n.height,i.position_ratio);let a=(r=i.anchor)!=null?r:"bottom-center";return a==="bottom-center"&&i.anchor==null&&console.log("[DEBUG FALLBACK] objectVisuals transform.anchor \u2192 bottom-center"),Zs()(n.width,n.height,a)}function kn(o){var a;let e=(a=o.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 Tn(o){let e=window.gameApp;return e!=null&&e.stage?(o.objectBoundsGfx&&o.objectBoundsGfx.parent!==e.stage&&(o.objectBoundsGfx.destroy(),o.objectBoundsGfx=null),o.objectBoundsGfx||(o.objectBoundsGfx=new er,o.objectBoundsGfx.zIndex=999999,e.stage.addChild(o.objectBoundsGfx)),o.objectBoundsGfx):null}function Pn(o){let e=window.gameApp;return e!=null&&e.stage?(o.objectAnchorGfx&&o.objectAnchorGfx.parent!==e.stage&&(o.objectAnchorGfx.destroy(),o.objectAnchorGfx=null),o.objectAnchorGfx||(o.objectAnchorGfx=new er,o.objectAnchorGfx.zIndex=1e6,e.stage.addChild(o.objectAnchorGfx)),o.objectAnchorGfx):null}function In(o,e){var n;let t=Tn(o);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 Mn(o,e){let t=Pn(o);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 jn(o){o.objectBoundsGfx&&o.objectBoundsGfx.clear()}function _n(o){o.objectAnchorGfx&&o.objectAnchorGfx.clear()}function Ot(o){o.objectBoundsGfx&&(o.objectBoundsGfx.destroy(),o.objectBoundsGfx=null),o.objectAnchorGfx&&(o.objectAnchorGfx.destroy(),o.objectAnchorGfx=null)}function Rt(o,e){o.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function nr(o,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,o)}function ar(o,e,t){var s;let i=e.split("."),n=i.pop(),a=o;for(let r of i)a[r]=(s=a[r])!=null?s:{},a=a[r];a[n]=t}function Rn(o){var i,n,a,s,r;if(!o)return!1;if((i=o.transform)!=null&&i.offset)return!0;let e=((a=(n=o.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((r=(s=o.identity)==null?void 0:s.id)!=null?r:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Ni(o){let e=We();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(o){window.location.reload()}function Fi(o){let e=JSON.stringify(We(),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 rr(o,e){var t,i,n;if(!(!o.configViewer||!o.container))try{let a=window.getEditableObjectConfig,s=typeof a=="function"?a(e):null;if(!s){let{loadObjectCentricConfig:r,loadObjectConfig:l}=await import("./config-M6BRZXRD.js"),p=(((t=(await r("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),Hi(o,u),(i=o.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),Hi(o,s),(n=o.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function Hi(o,e){var u,g,h,m,f,b,y,w,v,T;if(!o.container)return;let t=o.container.querySelector("#config-pos-x"),i=o.container.querySelector("#config-pos-y"),n=o.container.querySelector("#config-scale"),a=o.container.querySelector("#config-anchor-preset"),s=o.container.querySelector("#config-anchor-x"),r=o.container.querySelector("#config-anchor-y"),c=Rn(e)?(u=e.transform)==null?void 0:u.offset:(g=e.transform)==null?void 0:g.position;t&&(t.value=String((h=c==null?void 0:c.x)!=null?h:0)),i&&(i.value=String((m=c==null?void 0:c.y)!=null?m:0)),n&&(n.value=String((b=(f=e.transform)==null?void 0:f.scale)!=null?b:1));let d=(T=(v=(y=e.transform)==null?void 0:y.anchor)!=null?v:(w=e.render)==null?void 0:w.anchor)!=null?T:"center";if(a){typeof d=="string"?a.value=d:a.value="custom";let P=o.container.querySelectorAll(".anchor-custom-field"),_=a.value==="custom";P.forEach(I=>I.style.display=_?"block":"none")}let p=Js()(d);s&&(s.value=String(p.x)),r&&(r.value=String(p.y))}function or(o){var l,c,d,p,u,g,h,m,f,b;let e=o.selectedObjectId;if(!e||!o.container)return;let t=(c=(l=o.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=o.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=o.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(m=(h=o.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?m:"0.5",s=(b=(f=o.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?b:"0.5",r=`${e}:
1869
1869
  position: (${t}, ${i})
1870
1870
  scale: ${n}
1871
- anchor: (${a}, ${s})`;navigator.clipboard.writeText(r).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function On(o,e){var u,g,h,m,f,b,y,w,v,T,P,_;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!o.container)return;let t=o.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((g=(u=o.container.querySelector("#config-pos-x"))==null?void 0:u.value)!=null?g:0),n=Number((m=(h=o.container.querySelector("#config-pos-y"))==null?void 0:h.value)!=null?m:0),a=Number((b=(f=o.container.querySelector("#config-scale"))==null?void 0:f.value)!=null?b:1),s=(w=(y=o.container.querySelector("#config-anchor-preset"))==null?void 0:y.value)!=null?w:"center",r=Number((T=(v=o.container.querySelector("#config-anchor-x"))==null?void 0:v.value)!=null?T:.5),l=Number((_=(P=o.container.querySelector("#config-anchor-y"))==null?void 0:P.value)!=null?_:.5),c=s==="custom"?{x:r,y:l}:s;console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchor:c});let{applyConfigOverride:d}=await import("./ConfigOverride-SLXAGR2M.js");d({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),d({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),d({objectId:t,path:"transform.anchor",value:c},{silent:e==null?void 0:e.silent});let p=zt(o);Rn(p)&&d({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0})}async function lr(o,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-SLXAGR2M.js");Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let m=0;m<g.length-1;m++){let f=g[m];h[f]=(u=h[f])!=null?u:{},h=h[f]}h[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!a,r=window.__previewShell;s&&(r!=null&&r.refresh)&&r.refresh()}function cr(o){o.selectedObjectId&&(o.objectAutoApplyTimer&&window.clearTimeout(o.objectAutoApplyTimer),o.objectAutoApplyTimer=window.setTimeout(()=>{o.objectAutoApplyTimer=null,On(o,{silent:!0})},150))}var Io=3e3;function et(o,e,t){let i=t!=null?t:o.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,s=0,r=0,l=0,c=0,d=0,p=g=>{if(!n)return;let h=i.getBoundingClientRect();o.style.left=`${g.clientX-h.left-c}px`,o.style.top=`${g.clientY-h.top-d}px`},u=()=>{n&&(n=!1,o.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let m=o.getBoundingClientRect(),f=i.getBoundingClientRect();console.log("[DRAG] Panel:",o.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] containerRect:",{left:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-m.left,d=g.clientY-m.top,console.log("[DRAG] offset:",{x:c,y:d});let b=m.left-f.left,y=m.top-f.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),o.style.left=`${b}px`,o.style.top=`${y}px`,o.style.right="auto",o.style.bottom="auto",o.style.zIndex=String(++Io),n=!0,o.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function Bi(o,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,s=0,r=0,l=0,c=!1,d=u=>{var y;if(!c)return;let g=u.clientX-r,h=u.clientY-l,m=Math.max(i,a+g),f=Math.max(n,s+h);o.style.width=`${m}px`,(y=o.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(o.style.height=`${f}px`),t==null||t(m,f)},p=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=o.getBoundingClientRect();a=g.width,s=g.height,r=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function zn(o,e){var m,f,b,y;let t=(b=(f=(m=o.container)==null?void 0:m.querySelector("#debug-overlay"))!=null?f:o.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=o.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,s=Math.max(250,Math.floor(i.width-a*2)),r=Math.max(200,Math.floor(i.height-a*2));n.width>s&&(e.style.width=`${s}px`),n.height>r&&(e.style.height=`${r}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),p),h=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function ht(o){var i,n;if(!o.container)return;let e=o.container.querySelector("#debug-workbench");if(!e)return;if(zn(o,e),(i=o.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),s={activeTab:o.activeTab};if(a)try{s={...JSON.parse(a),activeTab:o.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(s));return}let t={activeTab:o.activeTab,width:e.style.width,height:(n=o.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 Gi(o){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(o.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=o.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let s=(a=o.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"),zn(o,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function $n(o,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",zn(o,e),ht(o))}function dr(o){var n,a,s;if(!o.container)return;let e=o.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var r;console.log("[PREVIEW] Debug toggle clicked"),(r=o.toggleDebug)==null||r.call(o)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var r;return(r=o.toggleDebug)==null?void 0:r.call(o,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>Ni(o)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>Fi(o)),e.querySelectorAll(".workbench-tab").forEach(r=>{r.addEventListener("click",()=>{let l=r.dataset.tab;o.activeTab=l,Dn(o),ht(o)})}),Nn(o,e),Hn(o,e)}function Dn(o){var n,a;if(!o.container)return;let e=o.container;e.querySelectorAll(".workbench-tab").forEach(s=>{let r=s.dataset.tab;s.classList.toggle("active",r===o.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(s=>{let r=s.dataset.tabPanel;s.classList.toggle("active",r===o.activeTab)}),o.activeTab==="library"&&o.libraryPanel&&((a=(n=o.libraryPanel).resetSearch)==null||a.call(n))}function Hn(o,e){Ae(o,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),Ae(o,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),Ae(o,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),Ae(o,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),Ae(o,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),Ae(o,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),Ae(o,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),Ae(o,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),Ae(o,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=We();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=We();s.layout&&(s.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function pr(o){if(!o.container||!o.debugOverlay)return;let e=o.container.querySelector("#debug-workbench"),t=o.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"),et(e,t,o.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{ht(o),$n(o,e)},10)}));let i=o.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"),et(i,n,o.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{$n(o,i)},10)})),i&&a&&Bi(i,a);let s=o.container.querySelector('[data-panel="scene-tools-corner"]'),r=s==null?void 0:s.querySelector("[data-panel-handle]");s&&r&&et(s,r,o.debugOverlay);let l=o.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&et(l,c,o.debugOverlay),Gi(o)}function Nn(o,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 Ae(o,e,t,i,n){let a=e.querySelector(`#${t}`),s=e.querySelector(n);if(!a||!s)return;let r=nr(We(),i);typeof r=="number"&&(a.value=String(r),s.textContent=String(r)),a.addEventListener("input",()=>{let l=Number(a.value);s.textContent=String(l),ar(We(),i,l)})}var Ui=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{let t=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:t})})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=rt(),{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"),r=s?new Date(parseInt(s)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1871
+ anchor: (${a}, ${s})`;navigator.clipboard.writeText(r).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function On(o,e){var u,g,h,m,f,b,y,w,v,T,P,_;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!o.container)return;let t=o.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((g=(u=o.container.querySelector("#config-pos-x"))==null?void 0:u.value)!=null?g:0),n=Number((m=(h=o.container.querySelector("#config-pos-y"))==null?void 0:h.value)!=null?m:0),a=Number((b=(f=o.container.querySelector("#config-scale"))==null?void 0:f.value)!=null?b:1),s=(w=(y=o.container.querySelector("#config-anchor-preset"))==null?void 0:y.value)!=null?w:"center",r=Number((T=(v=o.container.querySelector("#config-anchor-x"))==null?void 0:v.value)!=null?T:.5),l=Number((_=(P=o.container.querySelector("#config-anchor-y"))==null?void 0:P.value)!=null?_:.5),c=s==="custom"?{x:r,y:l}:s;console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchor:c});let{applyConfigOverride:d}=await import("./ConfigOverride-SLXAGR2M.js");d({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),d({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),d({objectId:t,path:"transform.anchor",value:c},{silent:e==null?void 0:e.silent});let p=zt(o);Rn(p)&&d({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0})}async function lr(o,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-SLXAGR2M.js");Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let m=0;m<g.length-1;m++){let f=g[m];h[f]=(u=h[f])!=null?u:{},h=h[f]}h[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!a,r=window.__previewShell;s&&(r!=null&&r.refresh)&&r.refresh()}function cr(o){o.selectedObjectId&&(o.objectAutoApplyTimer&&window.clearTimeout(o.objectAutoApplyTimer),o.objectAutoApplyTimer=window.setTimeout(()=>{o.objectAutoApplyTimer=null,On(o,{silent:!0})},150))}var Io=3e3;function et(o,e,t){let i=t!=null?t:o.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,s=0,r=0,l=0,c=0,d=0,p=g=>{if(!n)return;let h=i.getBoundingClientRect();o.style.left=`${g.clientX-h.left-c}px`,o.style.top=`${g.clientY-h.top-d}px`},u=()=>{n&&(n=!1,o.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let m=o.getBoundingClientRect(),f=i.getBoundingClientRect();console.log("[DRAG] Panel:",o.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] containerRect:",{left:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-m.left,d=g.clientY-m.top,console.log("[DRAG] offset:",{x:c,y:d});let b=m.left-f.left,y=m.top-f.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),o.style.left=`${b}px`,o.style.top=`${y}px`,o.style.right="auto",o.style.bottom="auto",o.style.zIndex=String(++Io),n=!0,o.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function Bi(o,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,s=0,r=0,l=0,c=!1,d=u=>{var y;if(!c)return;let g=u.clientX-r,h=u.clientY-l,m=Math.max(i,a+g),f=Math.max(n,s+h);o.style.width=`${m}px`,(y=o.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(o.style.height=`${f}px`),t==null||t(m,f)},p=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=o.getBoundingClientRect();a=g.width,s=g.height,r=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function zn(o,e){var m,f,b,y;let t=(b=(f=(m=o.container)==null?void 0:m.querySelector("#debug-overlay"))!=null?f:o.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=o.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,s=Math.max(250,Math.floor(i.width-a*2)),r=Math.max(200,Math.floor(i.height-a*2));n.width>s&&(e.style.width=`${s}px`),n.height>r&&(e.style.height=`${r}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),p),h=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function ht(o){var i,n;if(!o.container)return;let e=o.container.querySelector("#debug-workbench");if(!e)return;if(zn(o,e),(i=o.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),s={activeTab:o.activeTab};if(a)try{s={...JSON.parse(a),activeTab:o.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(s));return}let t={activeTab:o.activeTab,width:e.style.width,height:(n=o.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 Gi(o){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(o.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=o.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let s=(a=o.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"),zn(o,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function $n(o,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",zn(o,e),ht(o))}function dr(o){var n,a,s;if(!o.container)return;let e=o.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var r;console.log("[PREVIEW] Debug toggle clicked"),(r=o.toggleDebug)==null||r.call(o)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var r;return(r=o.toggleDebug)==null?void 0:r.call(o,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>Ni(o)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>Fi(o)),e.querySelectorAll(".workbench-tab").forEach(r=>{r.addEventListener("click",()=>{let l=r.dataset.tab;o.activeTab=l,Dn(o),ht(o)})}),Nn(o,e),Hn(o,e)}function Dn(o){var n,a;if(!o.container)return;let e=o.container;e.querySelectorAll(".workbench-tab").forEach(s=>{let r=s.dataset.tab;s.classList.toggle("active",r===o.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(s=>{let r=s.dataset.tabPanel;s.classList.toggle("active",r===o.activeTab)}),o.activeTab==="library"&&o.libraryPanel&&((a=(n=o.libraryPanel).resetSearch)==null||a.call(n))}function Hn(o,e){Ce(o,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),Ce(o,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),Ce(o,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),Ce(o,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),Ce(o,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),Ce(o,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),Ce(o,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),Ce(o,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),Ce(o,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=We();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=We();s.layout&&(s.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function pr(o){if(!o.container||!o.debugOverlay)return;let e=o.container.querySelector("#debug-workbench"),t=o.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"),et(e,t,o.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{ht(o),$n(o,e)},10)}));let i=o.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"),et(i,n,o.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{$n(o,i)},10)})),i&&a&&Bi(i,a);let s=o.container.querySelector('[data-panel="scene-tools-corner"]'),r=s==null?void 0:s.querySelector("[data-panel-handle]");s&&r&&et(s,r,o.debugOverlay);let l=o.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&et(l,c,o.debugOverlay),Gi(o)}function Nn(o,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 Ce(o,e,t,i,n){let a=e.querySelector(`#${t}`),s=e.querySelector(n);if(!a||!s)return;let r=nr(We(),i);typeof r=="number"&&(a.value=String(r),s.textContent=String(r)),a.addEventListener("input",()=>{let l=Number(a.value);s.textContent=String(l),ar(We(),i,l)})}var Ui=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{let t=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:t})})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=rt(),{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"),r=s?new Date(parseInt(s)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1872
1872
  <div class="config-persistence-panel">
1873
1873
  <!-- Status Footer (Always Visible) -->
1874
1874
  <div class="persistence-status-footer">
@@ -2070,7 +2070,7 @@ This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snaps
2070
2070
 
2071
2071
  This cannot be undone unless you have git commits or backups.
2072
2072
 
2073
- Are you absolutely sure?`))try{let t=Zt(),i={};for(let[a,s]of Object.entries(t.objects)){let r=s,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),r&&typeof r=="object"&&(r.identity||(r.identity={}),r.identity.id=l),i[`objects/${l}.json`]=r}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 r=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${r}.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")}Ze(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var qi=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 si;this.sceneToolsPanel=new ri;this.nudgePanel=new oi;this.inspectorPanel=new Ti;this.libraryPanel=new Mt;this.libraryPanelDocked=new Mt;this.brandVisionPanel=new Ri;this.customizeSettingsPanel=new Oi;this.configPersistencePanel=new Ui;this.loadingScreenPanel=new zi}applyAssetChange(e,t){return Gs(this,e,t)}resetAsset(e){return Us(this,e)}applySlotAsset(e,t,i){return ji(this,e,t,i)}resetSlotAsset(e,t,i){return qs(this,e,t,i)}startObjectVisuals(){return tr(this)}stopObjectVisuals(){return ir(this)}shouldRunObjectVisuals(){return $i(this)}updateObjectVisuals(){return Di(this)}getSelectedInstanceId(){return An(this)}getDisplayObjectById(e){return Cn(this,e)}getSelectedObjectConfig(){return zt(this)}getConfigAnchorWorldPoint(e){return Ln(this,e)}getScreenSize(){return kn(this)}ensureBoundsGfx(){return Tn(this)}ensureAnchorGfx(){return Pn(this)}drawBounds(e){return In(this,e)}drawAnchor(e){return Mn(this,e)}clearBounds(){return jn(this)}clearAnchor(){return _n(this)}clearObjectVisuals(){return Ot(this)}updateObjectInfo(e){return Rt(this,e)}resetDebugConfig(){return Ni(this)}applyDebugConfig(){return sr(this)}exportDebugConfig(){return Fi(this)}loadObjectConfig(e){return rr(this,e)}fillConfigViewer(e){return Hi(this,e)}copyConfigValues(){return or(this)}applyObjectConfig(e){return On(this,e)}applyCustomizeSettings(e,t){return lr(this,e,t)}scheduleObjectAutoApply(){return cr(this)}setupDebugEventListeners(){return dr(this)}setupDebugInputListeners(e){return Hn(this,e)}setupPanelLayout(){return pr(this)}setupCollapsiblePanels(e){return Nn(this,e)}setupRangeInput(e,t,i,n){return Ae(this,e,t,i,n)}updateWorkbenchTabs(){return Dn(this)}saveWorkbenchState(){return ht(this)}loadWorkbenchState(){return Gi(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,r)=>this.applySlotAsset(a,s,r),onReset:(a,s,r)=>this.resetSlotAsset(a,s,r)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,s,r)=>this.applySlotAsset(a,s,r),onReset:(a,s,r)=>this.resetSlotAsset(a,s,r)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,s,r)=>{console.log("[Inspector] Property changed:",a,s,r)}}),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 u,g,h;if(!this.selectedObjectId)return;let r=this.getSelectedObjectConfig();if(!r)return;let l=(u=r.transform)==null?void 0:u.position,c=((g=l==null?void 0:l.x)!=null?g:0)+a,d=((h=l==null?void 0:l.y)!=null?h:0)+s,{applyConfigOverride:p}=await import("./ConfigOverride-SLXAGR2M.js");p({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:d}},{silent:!0,emitEvent:!0}),window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var d,p;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let r=(p=(d=s.transform)==null?void 0:d.scale)!=null?p:1,l=Math.max(.1,r+a),{applyConfigOverride:c}=await import("./ConfigOverride-SLXAGR2M.js");c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0}),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,r,l)=>{this.customizeSettingsPanel.openAiEditor(a,s,r,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.__getSelectedObjectId=()=>this.selectedObjectId,window.addEventListener("config:changed",a=>{var s,r;((s=a.detail)==null?void 0:s.action)!=="remove"&&((r=a.detail)==null?void 0:r.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,s,r)=>this.applySlotAsset(a,s,r),window.refreshAssetLibrary=()=>Promise.all([this.libraryPanel.refresh(),this.libraryPanelDocked.refresh()]),window.reRenderAssetLibrary=()=>{this.libraryPanel.reRender(),this.libraryPanelDocked.reRender()},window.getEngineSplashConfig=()=>{var s;let a=window.getActiveConfig;if(typeof a=="function"){let r=a();return((s=r==null?void 0:r.engine)==null?void 0:s.splash)||null}return null},window.addAssetToRegistry=(a,s)=>{let r=window.getEditableAssets;if(typeof r=="function"){let l=r();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),this.libraryPanelDocked.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`
2073
+ Are you absolutely sure?`))try{let t=Zt(),i={};for(let[a,s]of Object.entries(t.objects)){let r=s,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),r&&typeof r=="object"&&(r.identity||(r.identity={}),r.identity.id=l),i[`objects/${l}.json`]=r}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 r=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${r}.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")}Ze(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var qi=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 si;this.sceneToolsPanel=new ri;this.nudgePanel=new oi;this.inspectorPanel=new Ti;this.libraryPanel=new Mt;this.libraryPanelDocked=new Mt;this.brandVisionPanel=new Ri;this.customizeSettingsPanel=new Oi;this.configPersistencePanel=new Ui;this.loadingScreenPanel=new zi}applyAssetChange(e,t){return Gs(this,e,t)}resetAsset(e){return Us(this,e)}applySlotAsset(e,t,i){return ji(this,e,t,i)}resetSlotAsset(e,t,i){return qs(this,e,t,i)}startObjectVisuals(){return tr(this)}stopObjectVisuals(){return ir(this)}shouldRunObjectVisuals(){return $i(this)}updateObjectVisuals(){return Di(this)}getSelectedInstanceId(){return Cn(this)}getDisplayObjectById(e){return An(this,e)}getSelectedObjectConfig(){return zt(this)}getConfigAnchorWorldPoint(e){return Ln(this,e)}getScreenSize(){return kn(this)}ensureBoundsGfx(){return Tn(this)}ensureAnchorGfx(){return Pn(this)}drawBounds(e){return In(this,e)}drawAnchor(e){return Mn(this,e)}clearBounds(){return jn(this)}clearAnchor(){return _n(this)}clearObjectVisuals(){return Ot(this)}updateObjectInfo(e){return Rt(this,e)}resetDebugConfig(){return Ni(this)}applyDebugConfig(){return sr(this)}exportDebugConfig(){return Fi(this)}loadObjectConfig(e){return rr(this,e)}fillConfigViewer(e){return Hi(this,e)}copyConfigValues(){return or(this)}applyObjectConfig(e){return On(this,e)}applyCustomizeSettings(e,t){return lr(this,e,t)}scheduleObjectAutoApply(){return cr(this)}setupDebugEventListeners(){return dr(this)}setupDebugInputListeners(e){return Hn(this,e)}setupPanelLayout(){return pr(this)}setupCollapsiblePanels(e){return Nn(this,e)}setupRangeInput(e,t,i,n){return Ce(this,e,t,i,n)}updateWorkbenchTabs(){return Dn(this)}saveWorkbenchState(){return ht(this)}loadWorkbenchState(){return Gi(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,r)=>this.applySlotAsset(a,s,r),onReset:(a,s,r)=>this.resetSlotAsset(a,s,r)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,s,r)=>this.applySlotAsset(a,s,r),onReset:(a,s,r)=>this.resetSlotAsset(a,s,r)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,s,r)=>{console.log("[Inspector] Property changed:",a,s,r)}}),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 u,g,h;if(!this.selectedObjectId)return;let r=this.getSelectedObjectConfig();if(!r)return;let l=(u=r.transform)==null?void 0:u.position,c=((g=l==null?void 0:l.x)!=null?g:0)+a,d=((h=l==null?void 0:l.y)!=null?h:0)+s,{applyConfigOverride:p}=await import("./ConfigOverride-SLXAGR2M.js");p({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:d}},{silent:!0,emitEvent:!0}),window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var d,p;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let r=(p=(d=s.transform)==null?void 0:d.scale)!=null?p:1,l=Math.max(.1,r+a),{applyConfigOverride:c}=await import("./ConfigOverride-SLXAGR2M.js");c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0}),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,r,l)=>{this.customizeSettingsPanel.openAiEditor(a,s,r,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.__getSelectedObjectId=()=>this.selectedObjectId,window.addEventListener("config:changed",a=>{var s,r;((s=a.detail)==null?void 0:s.action)!=="remove"&&((r=a.detail)==null?void 0:r.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,s,r)=>this.applySlotAsset(a,s,r),window.refreshAssetLibrary=()=>Promise.all([this.libraryPanel.refresh(),this.libraryPanelDocked.refresh()]),window.reRenderAssetLibrary=()=>{this.libraryPanel.reRender(),this.libraryPanelDocked.reRender()},window.getEngineSplashConfig=()=>{var s;let a=window.getActiveConfig;if(typeof a=="function"){let r=a();return((s=r==null?void 0:r.engine)==null?void 0:s.splash)||null}return null},window.addAssetToRegistry=(a,s)=>{let r=window.getEditableAssets;if(typeof r=="function"){let l=r();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),this.libraryPanelDocked.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`
2074
2074
  <div class="debug-overlay hidden" id="debug-overlay">
2075
2075
  <div class="debug-workbench" id="debug-workbench">
2076
2076
  <div class="workbench-header" id="workbench-handle">
@@ -2269,7 +2269,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2269
2269
  <source src="${n}" type="audio/wav">
2270
2270
  Your browser does not support the audio element.
2271
2271
  </audio>
2272
- `;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(o){new qn().open(o)};import{Application as Do,Container as Ne,Graphics as ge,Point as U,Rectangle as hr,Text as Ho,TextStyle as No}from"pixi.js";import{Sprite as Oo,Container as gr}from"pixi.js";var zo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Vn=zo;if(typeof window!="undefined")try{let o=new XMLHttpRequest;if(o.open("GET","./build-settings.json",!1),o.send(),o.status===200&&o.responseText){let e=JSON.parse(o.responseText);e!=null&&e.buildMode&&(Vn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${Vn}`))}}catch{}function $o(o){var t,i,n,a,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(o);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(o))return{x:(t=o[0])!=null?t:.5,y:(i=o[1])!=null?i:.5};if(o&&typeof o=="object"&&"x"in o&&"y"in o)return{x:(n=o.x)!=null?n:.5,y:(a=o.y)!=null?a:.5};if(typeof o=="string"){let r=o.trim().toLowerCase();return(s=e[r])!=null?s:{x:.5,y:.5}}return null}var Me=class{static async create(e,t,i){var l,c,d,p,u,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${Vn}`);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 gr;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 an.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 r;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),r=new Oo(s),console.log("[ObjectFactory] Created object:",r,"type:",(p=r==null?void 0:r.constructor)==null?void 0:p.name),this.applyTransform(r,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 gr)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let m=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],f=!1;for(let b of m)try{let y=await fetch(b);if(y.ok){r=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=r==null?void 0:r.constructor)==null?void 0:h.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),r=s)}else r=s;else r=s,r&&typeof r=="object"&&("x"in r||"position"in r)&&this.applyTransform(r,t==null?void 0:t.transform,t);return r}static applyTransform(e,t,i){var n,a,s,r;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,(r=t.position.y)!=null?r: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=$o(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var Vi=class{constructor(e){this.app=null;this.camera=new Ne;this.bgContainer=new Ne;this.mainContainer=new Ne;this.uiContainer=new Ne;this.gizmoLayer=new Ne;this.screenFrame=new ge;this.gameFrame=new ge;this.gridLayer=new ge;this.spawnPointLayer=new Ne;this.objectMap=new Map;this.selectedId=null;this.selectedIds=new Set;this.dragMode=null;this.selectionBox=null;this.selectionBoxStart=null;this.isSelectionBoxActive=!1;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotation=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.dragContainer=null;this.dragLastPointer=null;this.dragPointerOffset=null;this.dragSyncHoldUntil=0;this.dragLogged=!1;this.spawnPointDrag=null;this.lastGameFrameSize=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.screenSyncRaf=null;this.gizmoOutline=new ge;this.anchorVisualizationLayer=new ge;this.moveHandle=new ge;this.scaleHandle=new ge;this.rotateHandle=new ge;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.gridEnabled=!1;this.gridGap=50;this.gridAlpha=.25;this.snapToGrid=!1;this.alignmentGuidesEnabled=!0;this.alignmentGuideLayer=new ge;this.lastPickPoint=null;this.lastPickIds=[];this.lastPickIndex=0;this.lastPickTime=0;this.playModeEnabled=!0;this.playModeInitialized=!1;this.layoutScale=1;this.updateManager=new Pe;this.backgroundCoverEnabled=!0;this.backgroundLocked=!0;this.backgroundCoverRetries=new Map;this.backgroundCoverRaf=null;this.dropZoneActive=!1;this.dropZoneOverlay=null;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.hasUserCamera=!1,this.updateLayout({width:t,height:i}),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid(),this.playModeEnabled?this.schedulePostScreenSync({width:t,height:i}):this.syncFromConfig())};this.handleAnchorChanged=e=>{let t=e==null?void 0:e.detail,i=t==null?void 0:t.objectId;if(!i)return;let n=t==null?void 0:t.previousAnchor,a=t==null?void 0:t.nextAnchor;this.adjustPositionForAnchorChange(i,n,a)};this.handleActiveScreenChanged=()=>{this.isVisible&&this.syncFromConfig()};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout(),this.updateGrid();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.path,n=t.objectId;if(i==="transform.anchor"&&n){let s=t.value,r=t.oldValue;r!=null&&this.adjustPositionForAnchorChange(n,r,s)}let a=t.objectIds;if(n){this.syncFromConfig([n]);return}if(Array.isArray(a)&&a.length>0){this.syncFromConfig(a);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handleAssetUpdated=e=>{var l;let t=(l=e==null?void 0:e.detail)!=null?l:{},i=t.objectId,n=t.texture;if(!i||!n)return;let a=this.objectMap.get(i);if(!a)return;let s=a.displayObject;if(s!=null&&s.texture)s.texture=n;else if(s!=null&&s.children){let c=s.children.find(d=>d==null?void 0:d.texture);c&&(c.texture=n)}let r=this.getEditableObjectConfig(i);r&&(a.assetKey=this.getAssetKey(r))};this.handleLayoutApplied=e=>{var s;if(!this.isVisible)return;let t=(s=e==null?void 0:e.detail)!=null?s:{},i=Number(t.width),n=Number(t.height),a=Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:this.getScreen();this.updateLayout(a),this.hasUserCamera||this.centerCamera(),this.syncFromConfig().then(()=>{this.playModeEnabled&&this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid()})};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onStagePointerDown=e=>{if(!this.app||!this.isVisible)return;let t=this.getPointerButton(e);if(t===2){if(this.isGizmoTarget(e==null?void 0:e.target))return;let h=this.getEventGlobalPoint(e);if(!h)return;let m=new U(h.x,h.y),f=this.getPickCandidates(m);if(f.length>0){let b=f[0];this.selectedIds.has(b)||(this.selectedIds.clear(),this.selectedIds.add(b),this.setSelected(b),this.updateGizmos()),this.showContextMenu(b,h.x,h.y)}return}if(t!==0||this.isGizmoTarget(e==null?void 0:e.target))return;let i=this.getEventGlobalPoint(e);if(!i)return;let n=new U(i.x,i.y),a=this.getPickCandidates(n),r=navigator.platform.toUpperCase().indexOf("MAC")>=0?e.metaKey:e.ctrlKey;if(a.length===0){r||(this.setSelected(null),this.selectedIds.clear()),this.selectionBoxStart=n,this.isSelectionBoxActive=!0,this.lastPickIds=[],this.lastPickIndex=0,this.lastPickPoint=n,this.lastPickTime=performance.now();return}let l=performance.now(),c=this.areSameIds(a,this.lastPickIds),d=this.lastPickPoint&&this.distance(n,this.lastPickPoint)<=6,p=l-this.lastPickTime<1200,u=c&&d&&p?(this.lastPickIndex+1)%a.length:0,g=a[u];this.lastPickIds=a,this.lastPickIndex=u,this.lastPickPoint=n,this.lastPickTime=l,r?this.selectedIds.has(g)?(this.selectedIds.delete(g),this.selectedId===g&&(this.selectedId=this.selectedIds.size>0?Array.from(this.selectedIds)[0]:null)):(this.selectedIds.add(g),this.selectedId=g):(this.selectedIds.clear(),this.selectedIds.add(g),this.setSelected(g)),this.updateGizmos()};this.handleGridSettings=e=>{var a,s,r;let t=(a=e==null?void 0:e.detail)==null?void 0:a.enabled,i=(s=e==null?void 0:e.detail)==null?void 0:s.gap,n=(r=e==null?void 0:e.detail)==null?void 0:r.alpha;typeof t=="boolean"&&(this.gridEnabled=t),typeof i=="number"&&Number.isFinite(i)&&i>2&&(this.gridGap=i),typeof n=="number"&&Number.isFinite(n)&&n>=0&&n<=1&&(this.gridAlpha=n),this.updateGrid()};this.handleBackgroundCover=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;typeof t=="boolean"&&(this.backgroundCoverEnabled=t,this.syncFromConfig(),this.updateGizmos())};this.handleBackgroundLock=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;if(typeof t=="boolean"&&(this.backgroundLocked=t,t&&this.selectedId)){let n=this.getEditableObjectConfig(this.selectedId),a=this.objectMap.get(this.selectedId);this.isBackgroundObject(this.selectedId,n,a==null?void 0:a.displayObject)&&this.setSelected(null)}};this.handlePlayModeChange=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;typeof t=="boolean"&&(!this.playModeInitialized&&(this.playModeInitialized=!0,!t)||t&&this.applyPlayModeState(!0))};this.syncFromGameObjects=()=>{this.syncFromGameObjectsInternal()};this.onSpawnPointDragMove=e=>{if(!this.spawnPointDrag)return;let t=this.getPointerInContainer(e.clientX,e.clientY,this.mainContainer);if(!t)return;let i=t.x+this.spawnPointDrag.offset.x,n=t.y+this.spawnPointDrag.offset.y;this.updateLiveSpawnPoint(this.spawnPointDrag.objectId,this.spawnPointDrag.index,i,n)};this.onSpawnPointDragEnd=()=>{if(!this.spawnPointDrag)return;let{objectId:e,startPoints:t}=this.spawnPointDrag,i=this.getEditableObjectConfig(e),n=i?this.getSpawnPoints(i):null;i&&n&&(this.setNestedValue(i,"logic.props.spawnPoints",t),qe({objectId:e,path:"logic.props.spawnPoints",value:n},{persist:!0,emitEvent:!0,trackHistory:!0}),this.queueLiveApply(e)),this.spawnPointDrag=null,window.dispatchEvent(new CustomEvent("inspector:refresh")),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd)};this.onDragMove=e=>{var n;if(!this.dragMode||!this.selectedId||!this.dragContainer||!this.dragStartPointer||!this.dragStartPos)return;let t=this.objectMap.get(this.selectedId);if(!(t!=null&&t.displayObject))return;let i=this.getPointerInContainer(e.clientX,e.clientY,this.dragContainer);if(i){if(this.dragMode==="move"){let a=this.dragPointerOffset;if(!a)return;let s=i.x+a.x,r=i.y+a.y;if(this.snapToGrid){let d=this.snapToGridPosition(s,r);s=d.x,r=d.y}let l=s-this.dragStartPos.x,c=r-this.dragStartPos.y;if(t.displayObject.position.set(s,r),this.updateAlignmentGuides(this.selectedId,new U(s,r)),this.updateLiveConfigPosition(s,r),this.selectedIds.size>1){let d=new Map;if(!this.multiDragStartPositions){this.multiDragStartPositions=new Map;for(let p of this.selectedIds){if(p===this.selectedId)continue;let u=this.objectMap.get(p);u!=null&&u.displayObject&&this.multiDragStartPositions.set(p,new U(u.displayObject.position.x,u.displayObject.position.y))}}for(let p of this.selectedIds){if(p===this.selectedId)continue;let u=this.objectMap.get(p);if(!(u!=null&&u.displayObject))continue;let g=this.multiDragStartPositions.get(p);if(g){let h=g.x+l,m=g.y+c;if(this.snapToGrid){let f=this.snapToGridPosition(h,m);h=f.x,m=f.y}u.displayObject.position.set(h,m),this.updateLiveConfigPositionForObject(p,h,m)}}}this.dragLastPointer=new U(i.x,i.y),this.dragLogged||(this.dragLogged=!0,console.log("[SceneEditor][DragMove]",{objectId:this.selectedId,selectedCount:this.selectedIds.size,pointer:{x:i.x,y:i.y},nextPos:{x:s,y:r}}))}if(this.dragMode==="scale"&&this.dragAnchorLocal){let s=Math.max(1,this.distance(i,this.dragAnchorLocal))/Math.max(1,this.dragStartDistance),r=Math.max(.01,this.dragStartScale*s);(n=t.displayObject.scale)!=null&&n.set?t.displayObject.scale.set(r,r):t.displayObject.scale&&(t.displayObject.scale.x=r,t.displayObject.scale.y=r),this.updateLiveConfigScale(r)}if(this.dragMode==="rotate"&&this.dragAnchorLocal){let a=Math.atan2(i.y-this.dragAnchorLocal.y,i.x-this.dragAnchorLocal.x),s=this.dragStartRotation+(a-this.dragStartAngle);t.displayObject.rotation=s,this.updateLiveConfigRotation(s)}this.updateGizmos()}};this.onDragEnd=()=>{if(this.dragMode){if(this.alignmentGuideLayer&&this.alignmentGuideLayer.clear(),this.selectedIds.size>0){let e=Array.from(this.selectedIds);window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectIds:e}})),this.dragSyncHoldUntil=performance.now()+200}this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,this.dragContainer=null,this.dragLastPointer=null,this.dragPointerOffset=null,this.multiDragStartPositions=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd)}};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i)),a=new U(this.app.renderer.width/2,this.app.renderer.height/2),s=this.camera.toLocal(a);this.cameraScale=n,this.camera.scale.set(n);let r=this.camera.toGlobal(s);this.camera.position.set(this.camera.position.x+(a.x-r.x),this.camera.position.y+(a.y-r.y)),this.hasUserCamera=!0,this.updateGizmos(),this.updateGrid()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(this.isPanning&&this.panStart&&this.panStartCamera){let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i),this.updateGrid()}if(this.isSelectionBoxActive&&this.selectionBoxStart&&this.app){let t=this.getEventGlobalPoint(e);if(!t)return;let i=new U(t.x,t.y);this.drawSelectionBox(this.selectionBoxStart,i)}};this.onPanEnd=e=>{if(this.isPanning&&(this.isPanning=!1,this.panStart=null,this.panStartCamera=null),this.isSelectionBoxActive&&this.selectionBoxStart&&this.app){let t=this.getEventGlobalPoint(e);if(t){let i=new U(t.x,t.y);this.finalizeSelectionBox(this.selectionBoxStart,i)}this.isSelectionBoxActive=!1,this.selectionBoxStart=null,this.selectionBox&&this.selectionBox.clear()}this.multiDragStartPositions=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new Do,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.bgContainer.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.uiContainer.sortableChildren=!0,this.spawnPointLayer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.screenFrame),this.camera.addChild(this.bgContainer),this.camera.addChild(this.mainContainer),this.camera.addChild(this.gridLayer),this.camera.addChild(this.uiContainer),this.camera.addChild(this.spawnPointLayer),this.camera.addChild(this.gameFrame),this.camera.addChild(this.gizmoLayer),this.screenFrame.zIndex=-1,this.screenFrame.eventMode="none",this.bgContainer.zIndex=-5e3,this.bgContainer.eventMode="none",this.mainContainer.zIndex=0,this.gridLayer.zIndex=2e4,this.gridLayer.eventMode="none",this.gridLayer.visible=!0,this.uiContainer.zIndex=5e4,this.spawnPointLayer.zIndex=8e4,this.spawnPointLayer.eventMode="passive",this.gameFrame.zIndex=85e3,this.gameFrame.eventMode="none",this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.anchorVisualizationLayer),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.selectionBox=new ge,this.selectionBox.zIndex=99999,this.selectionBox.eventMode="none",this.gizmoLayer.addChild(this.selectionBox),this.dropZoneOverlay=new ge,this.dropZoneOverlay.zIndex=99998,this.dropZoneOverlay.eventMode="none",this.gizmoLayer.addChild(this.dropZoneOverlay),this.alignmentGuideLayer=new ge,this.alignmentGuideLayer.zIndex=99997,this.alignmentGuideLayer.eventMode="none",this.gizmoLayer.addChild(this.alignmentGuideLayer),this.gizmoOutline.eventMode="none",this.anchorVisualizationLayer.eventMode="none",this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.restoreScenePreferences(),this.refresh(),this.applyPlayModeState(!0),!this.isVisible&&this.app.ticker&&this.app.ticker.stop())}destroy(){var e;this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.screenSyncRaf&&(cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("handler:layout-applied",this.handleLayoutApplied),window.removeEventListener("preview:select",this.handlePreviewSelect),window.removeEventListener("scene-editor:grid",this.handleGridSettings),window.removeEventListener("scene-editor:background-cover",this.handleBackgroundCover),window.removeEventListener("scene-editor:background-lock",this.handleBackgroundLock),window.removeEventListener("scene-editor:asset-updated",this.handleAssetUpdated),window.removeEventListener("scene-editor:play-mode",this.handlePlayModeChange),window.removeEventListener("scene-editor:anchor-changed",this.handleAnchorChanged),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd),this.app&&((e=this.app.ticker)==null||e.remove(this.syncFromGameObjects),this.app.stage.off("pointerdown",this.onStagePointerDown),this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,!(!this.app||!this.app.ticker)&&(e?(this.app.ticker.start(),this.refresh(),this.updateGrid()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("handler:layout-applied",this.handleLayoutApplied),window.addEventListener("preview:select",this.handlePreviewSelect),window.addEventListener("scene-editor:grid",this.handleGridSettings),window.addEventListener("scene-editor:background-cover",this.handleBackgroundCover),window.addEventListener("scene-editor:background-lock",this.handleBackgroundLock),window.addEventListener("scene-editor:asset-updated",this.handleAssetUpdated),window.addEventListener("scene-editor:play-mode",this.handlePlayModeChange),window.addEventListener("scene-editor:anchor-changed",this.handleAnchorChanged),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.app.stage.on("pointerdown",this.onStagePointerDown),this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t)),this.applyEditControls(),this.setupKeyboardShortcuts(),this.setupDragAndDrop()}setupKeyboardShortcuts(){window.addEventListener("keydown",e=>{if(!this.isVisible)return;let i=navigator.platform.toUpperCase().indexOf("MAC")>=0?e.metaKey:e.ctrlKey,n=e.target;n.tagName==="INPUT"||n.tagName==="TEXTAREA"||n.isContentEditable||(i&&e.key==="a"?(e.preventDefault(),this.selectAll()):i&&e.key==="d"?(e.preventDefault(),this.duplicateSelected()):i&&e.key==="c"?(e.preventDefault(),this.copySelected()):i&&e.key==="v"?(e.preventDefault(),this.pasteObjects()):e.key==="Escape"?(this.setSelected(null),this.selectedIds.clear(),this.updateGizmos()):(e.key==="Delete"||e.key==="Backspace")&&this.selectedIds.size>0?(e.preventDefault(),this.deleteSelectedObjects()):e.key==="g"||e.key==="G"?(e.preventDefault(),this.toggleGrid()):e.shiftKey&&(e.key==="g"||e.key==="G")&&(e.preventDefault(),this.toggleSnapToGrid()))})}async duplicateSelected(){if(this.selectedIds.size===0)return;let e=window.__HANDLER_ACTIVE_SCREEN,t=e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay",i=Array.from(this.selectedIds),n=[];for(let a of i)try{let s=`${a}_copy_${Date.now()}`,r=await fetch("/api/objects/duplicate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sourceId:a,newInstanceId:s,shareConfig:!1,screenId:t})}),l=await r.json();r.ok&&l.success&&n.push(l.newObjectId)}catch(s){console.error(`[SceneEditor] Failed to duplicate ${a}:`,s)}n.length>0&&(this.selectedIds=new Set(n),this.selectedId=n[0],this.updateGizmos(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")))}copySelected(){if(this.selectedIds.size===0)return;let e=[];for(let t of this.selectedIds){let i=this.getEditableObjectConfig(t);i&&e.push({id:t,config:i})}window.__sceneEditorClipboard={configs:e,timestamp:Date.now()},this.showToast(`\u{1F4CB} Copied ${e.length} object${e.length>1?"s":""}`,1500)}async pasteObjects(){var a,s;let e=window.__sceneEditorClipboard;if(!e||!e.configs||e.configs.length===0)return;let t=window.__HANDLER_ACTIVE_SCREEN,i=t==="loading"||t==="start"||t==="gameplay"||t==="tutorial"||t==="endgame"?t:"gameplay",n=[];for(let{id:r,config:l}of e.configs)try{let c=`${r}_paste_${Date.now()}_${Math.random().toString(36).substr(2,5)}`,d=`json.${c}`,p=JSON.parse(JSON.stringify(l));if(p.identity.id=d,p.instance_id=c,p.object_config=d,(a=p.transform)!=null&&a.position){let h=p.transform.position,m=Array.isArray(h)?h[0]:h.x||0,f=Array.isArray(h)?h[1]:h.y||0;Array.isArray(h)?p.transform.position=[m+20,f+20]:p.transform.position={x:m+20,y:f+20}}let u=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:c,objectConfigId:d,config:p,layer:((s=p.identity)==null?void 0:s.category)==="ui"?"ui":"world"})}),g=await u.json();u.ok&&g.success&&n.push(c)}catch(c){console.error(`[SceneEditor] Failed to paste ${r}:`,c)}n.length>0&&(this.selectedIds=new Set(n),this.selectedId=n[0],this.updateGizmos(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),this.showToast(`\u{1F4CB} Pasted ${n.length} object${n.length>1?"s":""}`,1500))}toggleGrid(){this.gridEnabled=!this.gridEnabled,this.updateGrid();try{window.localStorage.setItem(this.getSceneStorageKey("grid_enabled"),String(this.gridEnabled))}catch{}this.showToast(this.gridEnabled?"\u{1F4D0} Grid enabled":"\u{1F4D0} Grid disabled",1e3)}toggleSnapToGrid(){this.snapToGrid=!this.snapToGrid;try{window.localStorage.setItem(this.getSceneStorageKey("snap_to_grid"),String(this.snapToGrid))}catch{}this.showToast(this.snapToGrid?"\u{1F532} Snap to grid enabled":"\u{1F532} Snap to grid disabled",1e3)}snapToGridPosition(e,t){if(!this.snapToGrid)return{x:e,y:t};let i=this.gridGap;return{x:Math.round(e/i)*i,y:Math.round(t/i)*i}}updateAlignmentGuides(e,t){var d,p,u,g;if(!this.alignmentGuidesEnabled||!e||!this.alignmentGuideLayer){this.alignmentGuideLayer&&this.alignmentGuideLayer.clear();return}let i=this.objectMap.get(e);if(!(i!=null&&i.displayObject)){this.alignmentGuideLayer.clear();return}let n=(p=(d=i.displayObject).getBounds)==null?void 0:p.call(d);if(!n){this.alignmentGuideLayer.clear();return}this.alignmentGuideLayer.clear();let a=this.camera.toLocal(new U(n.x,n.y)),s=this.camera.toLocal(new U(n.x+n.width,n.y+n.height)),r=(a.x+s.x)/2,l=(a.y+s.y)/2,c=5;for(let[h,m]of this.objectMap.entries()){if(h===e||!(m!=null&&m.displayObject)||m.displayObject.visible===!1)continue;let f=(g=(u=m.displayObject).getBounds)==null?void 0:g.call(u);if(!f)continue;let b=this.camera.toLocal(new U(f.x,f.y)),y=this.camera.toLocal(new U(f.x+f.width,f.y+f.height)),w=(b.x+y.x)/2,v=(b.y+y.y)/2;if(Math.abs(r-w)<c){let E=Math.min(a.y,b.y),A=Math.max(s.y,y.y);this.alignmentGuideLayer.moveTo(w,E),this.alignmentGuideLayer.lineTo(w,A),this.alignmentGuideLayer.stroke({width:1,color:3900150,alpha:.6})}if(Math.abs(l-v)<c){let E=Math.min(a.x,b.x),A=Math.max(s.x,y.x);this.alignmentGuideLayer.moveTo(E,v),this.alignmentGuideLayer.lineTo(A,v),this.alignmentGuideLayer.stroke({width:1,color:3900150,alpha:.6})}let T=a.x,P=s.x,_=a.y,I=s.y,j=b.x,L=y.x,S=b.y,x=y.y;if(Math.abs(T-j)<c||Math.abs(T-L)<c||Math.abs(P-j)<c||Math.abs(P-L)<c){let E=Math.abs(T-j)<c?j:Math.abs(T-L)<c?L:Math.abs(P-j)<c?j:L,A=Math.min(_,S),C=Math.max(I,x);this.alignmentGuideLayer.moveTo(E,A),this.alignmentGuideLayer.lineTo(E,C),this.alignmentGuideLayer.stroke({width:1,color:1096065,alpha:.5})}if(Math.abs(_-S)<c||Math.abs(_-x)<c||Math.abs(I-S)<c||Math.abs(I-x)<c){let E=Math.abs(_-S)<c?S:Math.abs(_-x)<c?x:Math.abs(I-S)<c?S:x,A=Math.min(T,j),C=Math.max(P,L);this.alignmentGuideLayer.moveTo(A,E),this.alignmentGuideLayer.lineTo(C,E),this.alignmentGuideLayer.stroke({width:1,color:1096065,alpha:.5})}}}selectAll(){let e=Array.from(this.objectMap.keys()).filter(t=>{let i=this.getEditableObjectConfig(t),n=this.objectMap.get(t);return!(!(n!=null&&n.displayObject)||n.displayObject.visible===!1||this.backgroundLocked&&this.isBackgroundObject(t,i,n.displayObject))});this.selectedIds=new Set(e),e.length>0&&(this.selectedId=e[0],this.updateGizmos())}deleteSelectedObjects(){let e=Array.from(this.selectedIds);for(let t of e){let i=window.__deleteObjectRequest;typeof i=="function"&&i(t)}this.selectedIds.clear(),this.selectedId=null,this.updateGizmos()}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid())}adjustPositionForAnchorChange(e,t,i){var L,S,x,E,A,C;if(t==null||i==null||t===i)return;let n=this.getEditableObjectConfig(e);if(!n)return;let a=(L=n.transform)!=null?L:{};if(a.position_ratio!=null)return;let s=(S=this.getRuntimeScreenSize())!=null?S:this.getScreen();if(!(s!=null&&s.width)||!(s!=null&&s.height))return;let r=this.objectMap.get(e);if(!(r!=null&&r.displayObject))return;let l=this.isBackgroundObject(e,n,r.displayObject),c=this.getRuntimeScale(),d=r.displayObject.position.x,p=r.displayObject.position.y,u=Se(s.width,s.height,t),g=Se(s.width,s.height,i),h=u.x,m=u.y,f=g.x,b=g.y;l||(h=(u.x-s.width/2)/c,m=(u.y-s.height/2)/c,f=(g.x-s.width/2)/c,b=(g.y-s.height/2)/c);let y={x:d-h,y:p-m},w={x:d-f,y:p-b},v=a.offset,T=Array.isArray(v)?Number((x=v[0])!=null?x:0):Number((E=v==null?void 0:v.x)!=null?E:0),P=Array.isArray(v)?Number((A=v[1])!=null?A:0):Number((C=v==null?void 0:v.y)!=null?C:0),_=w.x-T,I=w.y-P,j=this.buildPositionValue(a,{x:_,y:I});this.updateManager.updateProperty(e,"transform.position",j,{refreshInspector:!0})}getPickCandidates(e){var i;let t=[];for(let[n,a]of this.objectMap.entries()){let s=a.displayObject;if(!s||s.visible===!1||this.backgroundLocked&&this.isBackgroundObject(n,this.getEditableObjectConfig(n),s))continue;let r=(i=s.getBounds)==null?void 0:i.call(s);if(!r||r.width<=0||r.height<=0||e.x<r.x||e.x>r.x+r.width||e.y<r.y||e.y>r.y+r.height)continue;let l=s.parent,c=typeof(l==null?void 0:l.zIndex)=="number"?l.zIndex:0,d=typeof s.zIndex=="number"?s.zIndex:0,p=typeof(l==null?void 0:l.getChildIndex)=="function"?l.getChildIndex(s):0,u=c*1e6+d*1e3+p;t.push({id:n,order:u})}return t.sort((n,a)=>a.order-n.order),t.map(n=>n.id)}areSameIds(e,t){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i+=1)if(e[i]!==t[i])return!1;return!0}isGizmoTarget(e){return e&&this.spawnPointLayer.children.indexOf(e)!==-1?!0:e===this.moveHandle||e===this.scaleHandle||e===this.rotateHandle||e===this.gizmoOutline}restoreScenePreferences(){if(typeof window!="undefined"){try{let e=window.localStorage.getItem(this.getSceneStorageKey("grid_enabled")),t=window.localStorage.getItem(this.getSceneStorageKey("grid_gap")),i=window.localStorage.getItem(this.getSceneStorageKey("grid_alpha")),n=window.localStorage.getItem(this.getSceneStorageKey("snap_to_grid")),a=window.localStorage.getItem(this.getSceneStorageKey("background_cover")),s=window.localStorage.getItem(this.getSceneStorageKey("background_lock"));if(e!==null&&(this.gridEnabled=e==="true"),t!==null){let r=Number(t);Number.isFinite(r)&&r>2&&(this.gridGap=r)}if(i!==null){let r=Number(i);Number.isFinite(r)&&r>=0&&r<=1&&(this.gridAlpha=r)}n!==null&&(this.snapToGrid=n==="true"),a!==null&&(this.backgroundCoverEnabled=a==="true"),s!==null&&(this.backgroundLocked=s==="true")}catch{}this.updateGrid()}}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}applyPlayModeState(e){var t;this.playModeEnabled=e,(t=this.app)!=null&&t.ticker&&(this.app.ticker.remove(this.syncFromGameObjects),e&&this.app.ticker.add(this.syncFromGameObjects)),this.applyEditControls(),this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.syncFromConfig().then(()=>{this.playModeEnabled&&this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid()})}applyEditControls(){this.moveHandle.eventMode="static",this.scaleHandle.eventMode="static",this.rotateHandle.eventMode="static"}schedulePostScreenSync(e){this.screenSyncRaf&&cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=requestAnimationFrame(()=>{this.runPostScreenSync(e)})}async runPostScreenSync(e){this.screenSyncRaf=null,this.isVisible&&this.playModeEnabled&&(this.updateLayout(e),this.hasUserCamera||this.centerCamera(),await this.syncFromConfig(),this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid())}getRuntimeScreenSize(){var a,s,r,l,c,d,p;let e=window.gameApp;if(e!=null&&e.renderer){let u=e.renderer.screen,g=Number((a=u==null?void 0:u.width)!=null?a:0),h=Number((s=u==null?void 0:u.height)!=null?s:0);if(Number.isFinite(g)&&g>0&&Number.isFinite(h)&&h>0)return{width:g,height:h};let m=Number((r=e.renderer.resolution)!=null?r:1)||1,f=Number((l=e.renderer.width)!=null?l:0)/m,b=Number((c=e.renderer.height)!=null?c:0)/m;if(Number.isFinite(f)&&f>0&&Number.isFinite(b)&&b>0)return{width:f,height:b}}let t=document.querySelector(".game-container"),i=Number((d=t==null?void 0:t.dataset)==null?void 0:d.screenWidth),n=Number((p=t==null?void 0:t.dataset)==null?void 0:p.screenHeight);return Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:null}getRuntimeLayoutReference(){var a,s,r,l,c,d,p,u,g,h,m,f,b,y,w,v,T,P,_,I,j,L,S,x,E,A,C,k,R,M,O,D,N,q;let e=window.__screenManager;if(e){let $=["gameplay","start","tutorial","endgame","loading"];for(let H of $){let z=(a=e.get)==null?void 0:a.call(e,H);if(z!=null&&z.visible){let G=(s=z.getContentLayer)==null?void 0:s.call(z);if(G){let Y=(r=z.x)!=null?r:0,V=(l=z.y)!=null?l:0,F=(c=G.x)!=null?c:0,Q=(d=G.y)!=null?d:0,W=(u=(p=G.scale)==null?void 0:p.x)!=null?u:1,K=(h=(g=G.scale)==null?void 0:g.y)!=null?h:W;return console.log("[SceneEditor] getRuntimeLayoutReference: using visible screen contentLayer",{screenId:H,contentLayerScale:{x:W,y:K},position:{x:Y+F,y:V+Q}}),{scale:{x:W,y:K},position:{x:Y+F,y:V+Q},pivot:G.pivot?{x:G.pivot.x,y:G.pivot.y}:void 0}}}}for(let H of $){let z=(m=e.get)==null?void 0:m.call(e,H);if(z){if(!z.visible&&typeof z.updateLayout=="function"){let Y=window.gameApp;if((f=Y==null?void 0:Y.renderer)!=null&&f.screen){let V=Y.renderer.screen.width,F=Y.renderer.screen.height;V>0&&F>0&&z.updateLayout(V,F)}}let G=(b=z.getContentLayer)==null?void 0:b.call(z);if(G){let Y=(y=z.x)!=null?y:0,V=(w=z.y)!=null?w:0,F=(v=G.x)!=null?v:0,Q=(T=G.y)!=null?T:0,W=(_=(P=G.scale)==null?void 0:P.x)!=null?_:1,K=(j=(I=G.scale)==null?void 0:I.y)!=null?j:W;return console.log("[SceneEditor] getRuntimeLayoutReference: using any screen contentLayer",{screenId:H,visible:z.visible,contentLayerScale:{x:W,y:K},position:{x:Y+F,y:V+Q}}),{scale:{x:W,y:K},position:{x:Y+F,y:V+Q},pivot:G.pivot?{x:G.pivot.x,y:G.pivot.y}:void 0}}}}}let t=window.__mainContainer;if(t){let $=(S=(L=t.scale)==null?void 0:L.x)!=null?S:1,H=(E=(x=t.scale)==null?void 0:x.y)!=null?E:$;return console.log("[SceneEditor] getRuntimeLayoutReference: using __mainContainer",{scale:{x:$,y:H},position:{x:(A=t.position)==null?void 0:A.x,y:(C=t.position)==null?void 0:C.y}}),t}let i=window.gameApp,n=(k=i==null?void 0:i.stage)!=null?k:null;if(n){let $=(M=(R=n.scale)==null?void 0:R.x)!=null?M:1,H=(D=(O=n.scale)==null?void 0:O.y)!=null?D:$;console.log("[SceneEditor] getRuntimeLayoutReference: using gameApp.stage (fallback)",{scale:{x:$,y:H},position:{x:(N=n.position)==null?void 0:N.x,y:(q=n.position)==null?void 0:q.y}})}else console.log("[SceneEditor] getRuntimeLayoutReference: no reference found");return n}getRuntimeScale(){var i,n;let e=this.getRuntimeLayoutReference(),t=Number((n=(i=e==null?void 0:e.scale)==null?void 0:i.x)!=null?n:1);return Number.isFinite(t)&&t>0?t:Number.isFinite(this.layoutScale)&&this.layoutScale>0?this.layoutScale:1}getRuntimeParentContainer(e){var c,d,p,u,g;let t=window.gameObjectManager;if(!(t!=null&&t.get))return null;let i=t.get(e),n=((c=i==null?void 0:i.getDisplayObject)==null?void 0:c.call(i))||(i==null?void 0:i.pixiObject)||i,a=n==null?void 0:n.parent;if(!a)return null;let s=window.__screenManager;if(s){let h=["gameplay","start","tutorial","endgame","loading"];for(let m of h){let f=(d=s.get)==null?void 0:d.call(s,m);if(!f)continue;let b=(u=(p=f.getBgLayer)==null?void 0:p.call(f))!=null?u:f.bgLayer;if(b&&(a===b||typeof b.contains=="function"&&b.contains(a)))return this.bgContainer}}let r=this.getRuntimeLayoutReference(),l=(g=window.gameApp)==null?void 0:g.stage;return r&&l&&r===l?this.mainContainer:r&&typeof r.contains=="function"&&r.contains(a)?this.mainContainer:a===r||a===l?this.mainContainer:this.uiContainer}applyRuntimeTransform(e){var s,r,l,c,d,p,u,g,h,m;if(!e)return console.log("[SceneEditor] applyRuntimeTransform: no reference"),!1;let t=1,i=1,n=Number((r=(s=e.position)==null?void 0:s.x)!=null?r:0),a=Number((c=(l=e.position)==null?void 0:l.y)!=null?c:0);if(!Number.isFinite(n)||!Number.isFinite(a))return console.log("[SceneEditor] applyRuntimeTransform: invalid position",{posX:n,posY:a}),!1;if(console.log("[SceneEditor] applyRuntimeTransform: applying (scale always 1)",{scale:{x:t,y:i},position:{x:n,y:a}}),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1),this.mainContainer.position.set(n,a),this.uiContainer.position.set(n,a),e.pivot&&((d=this.mainContainer.pivot)!=null&&d.set)&&((p=this.uiContainer.pivot)!=null&&p.set)){let f=Number((g=(u=e.pivot)==null?void 0:u.x)!=null?g:0),b=Number((m=(h=e.pivot)==null?void 0:h.y)!=null?m:0);Number.isFinite(f)&&Number.isFinite(b)&&(this.mainContainer.pivot.set(f,b),this.uiContainer.pivot.set(f,b))}return typeof e.rotation=="number"&&(this.mainContainer.rotation=e.rotation,this.uiContainer.rotation=e.rotation),!0}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let s=this.getEditableObjectConfig(a);if(!s){this.removeObject(a);continue}await this.upsertObject(a,s)}this.updateGizmos(),this.updateSpawnPointHandles(),this.updateGameFrame(this.getScreen())}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e),a=this.isUiConfig(e,t),s=this.playModeEnabled?this.getRuntimeParentContainer(e):null,l=this.isBackgroundObject(e,t)?this.bgContainer:a?this.uiContainer:this.mainContainer,c=s!=null?s:l;if(!n||n.assetKey!==i||n.isUi!==a){n&&this.removeObject(e);let p=await this.createDisplayObject(e,t);if(!p)return;c.addChild(p),this.objectMap.set(e,{id:e,displayObject:p,assetKey:i,isUi:a}),this.attachObjectInteraction(p,e)}let d=this.objectMap.get(e);d&&(d.displayObject.parent!==c&&c.addChild(d.displayObject),this.applyVisualConfig(d.displayObject,t),(!this.playModeEnabled||!s)&&this.applyTransformFromConfig(e,d.displayObject,t))}async createDisplayObject(e,t){var r,l,c,d,p,u,g,h,m,f,b,y,w,v,T;if((r=t==null?void 0:t.render)!=null&&r.asset)try{if(((c=(l=t==null?void 0:t.render)==null?void 0:l.asset)==null?void 0:c.type)!=="json"){let _=await Me.create(e,t,this.app);if(_ instanceof Ne)return _}}catch(P){console.warn("[SceneEditor] ObjectFactory failed for",e,P)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let P=this.getScreen(),_=(p=P==null?void 0:P.width)!=null?p:0,I=(u=P==null?void 0:P.height)!=null?u:0,j=new ge,L=this.parseColor(n.background_color,0),S=typeof n.background_alpha=="number"?n.background_alpha:1;_>0&&I>0&&j.rect(0,0,_,I).fill({color:L,alpha:S});let x=new Ne;return x.addChild(j),x}if(a){let P=(h=(g=i==null?void 0:i.color)!=null?g:n==null?void 0:n.tint)!=null?h:"#ffffff",_=new No({fontFamily:"Arial, sans-serif",fontSize:(m=i==null?void 0:i.fontSize)!=null?m:16,fill:P,align:(f=i==null?void 0:i.align)!=null?f:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new Ho({text:(y=i==null?void 0:i.text)!=null?y:"",style:_})}if((w=t==null?void 0:t.effects)!=null&&w.width||(v=t==null?void 0:t.effects)!=null&&v.height){let P=new ge,_=typeof t.effects.width=="number"?t.effects.width:100,I=typeof t.effects.height=="number"?t.effects.height:100,j=(T=t.effects.fill_color)!=null?T:"#ffffff",L=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,S=Number.parseInt(String(j).replace("#",""),16);return P.rect(0,0,_,I).fill({color:Number.isFinite(S)?S:16777215,alpha:L}),P}return new Ne}attachObjectInteraction(e,t){if(e&&(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function")){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=new hr(i.x,i.y,i.width,i.height))}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}isUiConfig(e,t){var a,s;let i=(((a=t==null?void 0:t.identity)==null?void 0:a.category)||"").toString().toLowerCase(),n=(((s=t==null?void 0:t.identity)==null?void 0:s.id)||e||"").toString().toLowerCase();return i.includes("ui")||n.startsWith("ui")||n.includes("label")}isBackgroundObject(e,t,i){var s,r;if((i==null?void 0:i.parent)===this.bgContainer)return!0;let n=(((s=t==null?void 0:t.identity)==null?void 0:s.category)||"").toString().toLowerCase(),a=(((r=t==null?void 0:t.identity)==null?void 0:r.id)||e||"").toString().toLowerCase();return!!(n.includes("bg")||n.includes("background")||a.startsWith("background_")||a.includes("background"))}queueBackgroundCoverRetry(e){var i;let t=(i=this.backgroundCoverRetries.get(e))!=null?i:0;t>=10||(this.backgroundCoverRetries.set(e,t+1),this.backgroundCoverRaf==null&&(this.backgroundCoverRaf=requestAnimationFrame(()=>{this.backgroundCoverRaf=null;let n=this.objectMap.get(e),a=this.getEditableObjectConfig(e);!(n!=null&&n.displayObject)||!a||this.applyTransformFromConfig(e,n.displayObject,a)})))}applyVisualConfig(e,t){var a,s,r;if(!e)return;let i=(a=t==null?void 0:t.render)!=null?a:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n={x:.5,y:.5};if((s=e.anchor)!=null&&s.set)e.anchor.set(n.x,n.y);else if(e.pivot){let l=(r=e.getLocalBounds)==null?void 0:r.call(e);l&&e.pivot.set(l.width*n.x,l.height*n.y)}}applyTransformFromConfig(e,t,i){var _,I,j,L,S,x,E,A,C,k,R,M,O,D,N,q,$,H,z,G,Y,V,F,Q;if(!t)return;let n=this.getScreen();if(!(n!=null&&n.width)||!(n!=null&&n.height))return;let a=(_=i==null?void 0:i.transform)!=null?_:{},s=this.getPositioningAnchor(e,a),r=a==null?void 0:a.position_ratio,l=a==null?void 0:a.position,c=a==null?void 0:a.offset,d=Array.isArray(l)?Number((I=l[0])!=null?I:0):Number((j=l==null?void 0:l.x)!=null?j:0),p=Array.isArray(l)?Number((L=l[1])!=null?L:0):Number((S=l==null?void 0:l.y)!=null?S:0),u=Array.isArray(c)?Number((x=c[0])!=null?x:0):Number((E=c==null?void 0:c.x)!=null?E:0),g=Array.isArray(c)?Number((A=c[1])!=null?A:0):Number((C=c==null?void 0:c.y)!=null?C:0),h=(Number.isFinite(d)?d:0)+(Number.isFinite(u)?u:0),m=(Number.isFinite(p)?p:0)+(Number.isFinite(g)?g:0);if(this.backgroundCoverEnabled&&this.isBackgroundObject(e,i,t)){let W=Number((R=(k=t==null?void 0:t.texture)==null?void 0:k.width)!=null?R:0),K=Number((O=(M=t==null?void 0:t.texture)==null?void 0:M.height)!=null?O:0),X=(D=t==null?void 0:t.getLocalBounds)==null?void 0:D.call(t),de=Number((N=X==null?void 0:X.width)!=null?N:0),ee=Number((q=X==null?void 0:X.height)!=null?q:0),we=Number(($=X==null?void 0:X.x)!=null?$:0),J=Number((H=X==null?void 0:X.y)!=null?H:0);if((!Number.isFinite(W)||W<=0||!Number.isFinite(K)||K<=0)&&(W=de,K=ee),!Number.isFinite(W)||W<=0||!Number.isFinite(K)||K<=0){this.queueBackgroundCoverRetry(e);return}if((z=t.anchor)!=null&&z.set)t.anchor.set(.5,.5);else if((G=t.pivot)!=null&&G.set){let Re=Number.isFinite(de)&&de>0?we+de*.5:W*.5,Kt=Number.isFinite(ee)&&ee>0?J+ee*.5:K*.5;t.pivot.set(Re,Kt)}(Y=t.position)!=null&&Y.set?t.position.set(n.width/2,n.height/2):t.position&&(t.position.x=n.width/2,t.position.y=n.height/2);let le=n.width/W,ie=n.height/K,se=Math.max(le,ie);(V=t.scale)!=null&&V.set?t.scale.set(se,se):t.scale&&(t.scale.x=se,t.scale.y=se);let Ce=typeof(a==null?void 0:a.rotation)=="number"?a.rotation:0;t.rotation=this.toRadians(Ce);return}let f=r!=null?De(n.width,n.height,r):Se(n.width,n.height,s),b=this.getRuntimeScale(),y=(f.x-n.width/2)/b+h,w=(f.y-n.height/2)/b+m;(F=t.position)!=null&&F.set?t.position.set(y,w):t.position&&(t.position.x=y,t.position.y=w);let T=(typeof(a==null?void 0:a.scale)=="number"?a.scale:1)*this.getRuntimeScale();(Q=t.scale)!=null&&Q.set?t.scale.set(T,T):t.scale&&(t.scale.x=T,t.scale.y=T);let P=typeof(a==null?void 0:a.rotation)=="number"?a.rotation:0;t.rotation=this.toRadians(P)}getAnchorLocalPoint(e,t=this.mainContainer){var d;let i=(d=this.getRuntimeScreenSize())!=null?d:this.getScreen();if(!(i!=null&&i.width)||!(i!=null&&i.height))return null;let n="top-right",a=this.getPositioningAnchor(this.selectedId,e!=null?e:{}),s=(e==null?void 0:e.position_ratio)!=null?De(i.width,i.height,e.position_ratio):Se(i.width,i.height,a!=null?a:n);if(t===this.bgContainer)return new U(s.x,s.y);let r=this.getRuntimeScale(),l=(s.x-i.width/2)/r,c=(s.y-i.height/2)/r;return new U(l,c)}getPositioningAnchor(e,t){var i,n,a,s,r,l,c,d,p,u;if((t==null?void 0:t.anchor)!=null&&t.anchor!=="")return t.anchor;if(typeof window!="undefined"&&e){let g=window,h=g.__editableConfig,m=(n=(i=h==null?void 0:h.objects)==null?void 0:i.get)==null?void 0:n.call(i,e),f=(r=(a=m==null?void 0:m.transform)==null?void 0:a.anchor)!=null?r:(s=m==null?void 0:m.render)==null?void 0:s.anchor;if(f!=null&&f!=="")return f;let b=g.__editableConfigBaseline,y=(c=(l=b==null?void 0:b.objects)==null?void 0:l.get)==null?void 0:c.call(l,e),w=(u=(d=y==null?void 0:y.transform)==null?void 0:d.anchor)!=null?u:(p=y==null?void 0:y.render)==null?void 0:p.anchor;if(w!=null&&w!=="")return w}return"top-left"}getActiveScreenSize(e){var t,i;return this.playModeEnabled?(i=(t=this.getRuntimeScreenSize())!=null?t:e)!=null?i:this.getScreen():e!=null?e:this.getScreen()}updateLayout(e){var i,n,a,s,r,l,c,d,p;let t=this.getActiveScreenSize(e);if(!(!(t!=null&&t.width)||!(t!=null&&t.height))){if(console.log("[SceneEditor] updateLayout: called",{screen:{width:t.width,height:t.height},currentScale:{x:this.mainContainer.scale.x,y:this.mainContainer.scale.y}}),this.playModeEnabled){let u=this.getRuntimeLayoutReference();if(u){let g=Number((n=(i=u.position)==null?void 0:i.x)!=null?n:t.width/2),h=Number((s=(a=u.position)==null?void 0:a.y)!=null?s:t.height/2);this.mainContainer.position.set(g,h),this.uiContainer.position.set(g,h);let m=Number((l=(r=u.scale)==null?void 0:r.x)!=null?l:1);Number.isFinite(m)&&m>0&&(this.layoutScale=m)}this.bgContainer.position.set(0,0),this.bgContainer.scale.set(1,1),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1)}else this.bgContainer.position.set(0,0),this.bgContainer.scale.set(1,1),this.mainContainer.position.set(t.width/2,t.height/2),this.uiContainer.position.set(t.width/2,t.height/2),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1),this.mainContainer.rotation=0,this.uiContainer.rotation=0,(c=this.mainContainer.pivot)!=null&&c.set&&this.mainContainer.pivot.set(0,0),(d=this.uiContainer.pivot)!=null&&d.set&&this.uiContainer.pivot.set(0,0);console.log("[SceneEditor] updateLayout: result",{finalScale:{x:this.mainContainer.scale.x,y:this.mainContainer.scale.y},position:{x:this.mainContainer.position.x,y:this.mainContainer.position.y}}),this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),this.updateGameFrame(t),(p=this.app)!=null&&p.stage&&(this.app.stage.hitArea=new hr(0,0,this.app.renderer.width,this.app.renderer.height)),this.updateSpawnPointHandles()}}updateGrid(){if(!this.app)return;if(!this.gridEnabled){this.gridLayer.clear(),this.gridLayer.visible=!0;return}let e=Math.max(4,this.gridGap),t=this.app.renderer,i=this.camera.toLocal(new U(0,0)),n=this.camera.toLocal(new U(t.width,t.height)),a=Math.min(i.x,n.x),s=Math.max(i.x,n.x),r=Math.min(i.y,n.y),l=Math.max(i.y,n.y),c=400,d=Math.ceil((s-a)/e),p=Math.ceil((l-r)/e),u=e*Math.max(1,Math.ceil(d/c)),g=e*Math.max(1,Math.ceil(p/c)),h=Math.floor(a/u)*u,m=Math.floor(r/g)*g;this.gridLayer.clear(),this.gridLayer.visible=!0;for(let f=h;f<=s;f+=u)this.gridLayer.moveTo(f,r),this.gridLayer.lineTo(f,l);for(let f=m;f<=l;f+=g)this.gridLayer.moveTo(a,f),this.gridLayer.lineTo(s,f);this.gridLayer.stroke({width:1,color:16777215,alpha:this.gridAlpha})}updateGameFrame(e){let t=this.getActiveScreenSize(e);if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let i=t.width,n=t.height,a=0,s=0;this.lastGameFrameSize&&this.lastGameFrameSize.width===t.width&&this.lastGameFrameSize.height===t.height||(this.lastGameFrameSize={width:t.width,height:t.height},this.gameFrame.clear(),this.gameFrame.rect(a,s,i,n),this.gameFrame.stroke({width:2,color:6333946,alpha:.35}))}syncFromGameObjectsInternal(){var i,n,a,s,r,l,c,d,p;if(!this.app||!this.isVisible)return;let e=window.gameObjectManager;if(!(e!=null&&e.get))return;let t=this.dragMode||this.selectedId&&performance.now()<this.dragSyncHoldUntil?this.selectedId:null;for(let[u,g]of this.objectMap.entries()){if(t&&u===t)continue;let h=e.get(u),m=((i=h==null?void 0:h.getDisplayObject)==null?void 0:i.call(h))||(h==null?void 0:h.pixiObject)||h;if(!m)continue;let f=(a=(n=g.displayObject)==null?void 0:n.parent)!=null?a:this.mainContainer,b=new U;if(typeof m.getGlobalPosition=="function"){m.getGlobalPosition(b);let P=f.toLocal(b,this.camera);g.displayObject.position.set(P.x,P.y)}else if(m.worldTransform){b.set(m.worldTransform.tx,m.worldTransform.ty);let P=f.toLocal(b,this.camera);g.displayObject.position.set(P.x,P.y)}let y=this.getWorldScale(m);if(y){let P=Number((r=(s=f.scale)==null?void 0:s.x)!=null?r:1)||1,_=Number((c=(l=f.scale)==null?void 0:l.y)!=null?c:1)||1,I=y.x/P,j=y.y/_;(d=g.displayObject.scale)!=null&&d.set?g.displayObject.scale.set(I,j):g.displayObject.scale&&(g.displayObject.scale.x=I,g.displayObject.scale.y=j)}let w=this.getWorldRotation(m);if(typeof w=="number"){let P=f?f.rotation:0,_=w-P;g.displayObject.rotation=_;let I=this.getEditableObjectConfig(u);if(I){let j=(p=I.transform)!=null?p:{};I.transform||(I.transform=j);let L=this.toDegrees(_),S=typeof j.rotation=="number"?j.rotation:0;if(Math.abs(L-S)>.01){let x=Math.round(L*100)/100;j.rotation=x}}}let v=m.parent,T=typeof(v==null?void 0:v.getChildIndex)=="function"?v.getChildIndex(m):0;typeof m.zIndex=="number"?g.displayObject.zIndex=m.zIndex:Number.isFinite(T)&&(g.displayObject.zIndex=T)}this.updateGizmos()}getWorldScale(e){var a,s;let t=(s=e==null?void 0:e.worldTransform)!=null?s:(a=e==null?void 0:e.transform)==null?void 0:a.worldTransform;if(!t)return null;let i=Math.sqrt(t.a*t.a+t.b*t.b),n=Math.sqrt(t.c*t.c+t.d*t.d);return!Number.isFinite(i)||!Number.isFinite(n)?null:{x:i,y:n}}getWorldRotation(e){var i,n;let t=(n=e==null?void 0:e.worldTransform)!=null?n:(i=e==null?void 0:e.transform)==null?void 0:i.worldTransform;if(t){let a=Math.atan2(t.b,t.a);return Number.isFinite(a)?a:null}return typeof(e==null?void 0:e.rotation)=="number"?e.rotation:null}centerCamera(){if(!this.app)return;let e=this.getActiveScreenSize();if(!(e!=null&&e.width)||!(e!=null&&e.height))return;let t=this.app.renderer.width,i=this.app.renderer.height,n=Math.max(.01,Math.min(t/e.width,i/e.height));this.cameraScale=n,this.camera.scale.set(n),this.camera.position.set((t-e.width*n)/2,(i-e.height*n)/2)}updateGizmos(){var m,f,b,y,w,v;if(!this.selectedId&&this.selectedIds.size===0||!this.isVisible){this.clearGizmos();return}if(this.selectedIds.size>1){let T=1/0,P=1/0,_=-1/0,I=-1/0,j=!1;for(let L of this.selectedIds){let S=this.objectMap.get(L);if(!(S!=null&&S.displayObject))continue;let x=(f=(m=S.displayObject).getBounds)==null?void 0:f.call(m);if(!x||x.width<=0||x.height<=0)continue;let E=this.camera.toLocal(new U(x.x,x.y)),A=this.camera.toLocal(new U(x.x+x.width,x.y+x.height));T=Math.min(T,E.x,A.x),P=Math.min(P,E.y,A.y),_=Math.max(_,E.x,A.x),I=Math.max(I,E.y,A.y),j=!0}if(j){let L=_-T,S=I-P,x=T+L/2,E=P+S/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(T,P,L,S),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});for(let k of this.selectedIds){let R=this.objectMap.get(k);if(!(R!=null&&R.displayObject))continue;let M=(y=(b=R.displayObject).getBounds)==null?void 0:y.call(b);if(!M||M.width<=0||M.height<=0)continue;let O=this.camera.toLocal(new U(M.x,M.y)),D=this.camera.toLocal(new U(M.x+M.width,M.y+M.height)),N=D.x-O.x,q=D.y-O.y;this.gizmoOutline.rect(O.x,O.y,N,q),this.gizmoOutline.stroke({width:1,color:16752394,alpha:.5})}let A=7,C={width:2,color:988970,alpha:.6};this.moveHandle.clear(),this.moveHandle.circle(x,E,A).fill({color:2278750,alpha:.95}),this.moveHandle.stroke(C),this.moveHandle.cursor="move",this.scaleHandle.clear(),this.rotateHandle.clear()}else this.clearGizmos();return}if(!this.selectedId){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(v=(w=e.displayObject).getBounds)==null?void 0:v.call(w);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new U(t.x,t.y)),n=this.camera.toLocal(new U(t.x+t.width,t.y+t.height)),a=n.x-i.x,s=n.y-i.y,r=i.x+a/2,l=i.y+s/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,s),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});let c=7,d={width:2,color:988970,alpha:.6};this.moveHandle.clear(),this.moveHandle.circle(r,l,c).fill({color:2278750,alpha:.95}),this.moveHandle.stroke(d),this.moveHandle.cursor="move";let p=i.x+a,u=i.y+s;this.scaleHandle.clear(),this.scaleHandle.rect(p-c,u-c,c*2,c*2).fill({color:3718648,alpha:.95}),this.scaleHandle.stroke(d),this.scaleHandle.cursor="nwse-resize";let g=r,h=i.y-c*2;this.rotateHandle.clear(),this.rotateHandle.circle(g,h,c).fill({color:16347926,alpha:.95}),this.rotateHandle.stroke(d),this.rotateHandle.cursor="crosshair"}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}updateSpawnPointHandles(){if(this.clearSpawnPointHandles(),!this.selectedId)return;let e=this.getEditableObjectConfig(this.selectedId);if(!e||!this.isSpawnerConfig(e))return;let t=this.getSpawnPoints(e);!t||t.length===0||t.forEach((i,n)=>{let a=new ge;a.circle(0,0,5).fill({color:16096779,alpha:.9}),a.circle(0,0,9).stroke({width:1,color:16096779,alpha:.45});let s=this.toCameraFromMain(i);a.position.set(s.x,s.y),a.cursor="move",a.eventMode="static",a.on("pointerdown",r=>this.startSpawnPointDrag(n,r)),this.spawnPointLayer.addChild(a)})}clearSpawnPointHandles(){this.spawnPointLayer.removeChildren().forEach(t=>{var i;(i=t.destroy)==null||i.call(t)})}isSpawnerConfig(e){var i,n;return((i=e==null?void 0:e.logic)==null?void 0:i.id)==="Spawner"?!0:String(((n=e==null?void 0:e.identity)==null?void 0:n.system_role)||"").toLowerCase().includes("spawner")}getSpawnPoints(e){var i,n;let t=(n=(i=e==null?void 0:e.logic)==null?void 0:i.props)==null?void 0:n.spawnPoints;return Array.isArray(t)?t.map(a=>{var s,r;return{x:Number((s=a==null?void 0:a.x)!=null?s:0),y:Number((r=a==null?void 0:a.y)!=null?r:0)}}):null}toCameraFromMain(e){let t=this.mainContainer.toGlobal(new U(e.x,e.y)),i=new U;return this.camera.toLocal(t,void 0,i),i}startSpawnPointDrag(e,t){var r,l;if(!this.selectedId)return;let i=this.getEditableObjectConfig(this.selectedId);if(!i)return;let n=this.getSpawnPoints(i);if(!n||!n[e])return;(r=t==null?void 0:t.stopPropagation)==null||r.call(t),(l=t==null?void 0:t.stopImmediatePropagation)==null||l.call(t);let a=this.getEventLocalPoint(t,this.mainContainer);if(!a)return;let s=n[e];this.spawnPointDrag={objectId:this.selectedId,index:e,offset:new U(s.x-a.x,s.y-a.y),startPoints:n.map(c=>({x:c.x,y:c.y}))},window.addEventListener("pointermove",this.onSpawnPointDragMove),window.addEventListener("pointerup",this.onSpawnPointDragEnd)}updateLiveSpawnPoint(e,t,i,n){let a=this.getEditableObjectConfig(e);if(!a)return;let s=this.getSpawnPoints(a);if(!s||!s[t])return;let r=s.map((l,c)=>c===t?{x:i,y:n}:{x:l.x,y:l.y});this.setNestedValue(a,"logic.props.spawnPoints",r),this.queueLiveApply(e),this.updateSpawnPointHandles()}setSelected(e,t={}){if(!(this.selectedId===e&&this.selectedIds.size===1&&this.selectedIds.has(e||""))&&(this.selectedId=e,e?(this.selectedIds.clear(),this.selectedIds.add(e)):this.selectedIds.clear(),this.updateGizmos(),this.updateSpawnPointHandles(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var d,p,u,g,h,m,f;if(!this.selectedId)return;let i=this.objectMap.get(this.selectedId);if(!(i!=null&&i.displayObject))return;let n=this.getEditableObjectConfig(this.selectedId);if(!n||this.backgroundLocked&&this.isBackgroundObject(this.selectedId,n,i.displayObject))return;let a=(d=n.transform)!=null?d:{},s=(p=i.displayObject.parent)!=null?p:this.mainContainer,r=this.getEventLocalPoint(t,s);if(!r)return;(u=t==null?void 0:t.stopPropagation)==null||u.call(t),(g=t==null?void 0:t.stopImmediatePropagation)==null||g.call(t);let l=this.getPositioningAnchor(this.selectedId,a);(a.anchor==null||a.anchor==="")&&this.updateManager.updateProperty(this.selectedId,"transform.anchor",l),(((h=n==null?void 0:n.render)==null?void 0:h.anchor)==null||n.render.anchor==="")&&this.updateManager.updateProperty(this.selectedId,"render.anchor",l),this.dragMode=e,this.dragContainer=s,this.dragStartPointer=new U(r.x,r.y),this.dragStartPos=new U(i.displayObject.position.x,i.displayObject.position.y),this.dragLastPointer=new U(r.x,r.y),this.dragPointerOffset=new U(i.displayObject.position.x-r.x,i.displayObject.position.y-r.y),this.dragLogged=!1;let c=(m=this.getRuntimeScreenSize())!=null?m:this.getScreen();console.log("[SceneEditor][DragStart]",{objectId:this.selectedId,mode:e,isBackground:this.isBackgroundObject(this.selectedId,n,i.displayObject),screen:c,runtimeScale:this.getRuntimeScale(),pointer:{x:r.x,y:r.y},objectPos:{x:i.displayObject.position.x,y:i.displayObject.position.y},container:s===this.bgContainer?"bg":s===this.uiContainer?"ui":"main"}),this.dragStartScale=typeof((f=i.displayObject.scale)==null?void 0:f.x)=="number"?i.displayObject.scale.x:1,this.dragStartRotation=typeof i.displayObject.rotation=="number"?i.displayObject.rotation:0,this.dragAnchorLocal=this.getAnchorLocalPoint(a,s),this.dragStartValue=this.getDragStartValue(e,a),this.dragAnchorLocal&&(this.dragStartAngle=Math.atan2(r.y-this.dragAnchorLocal.y,r.x-this.dragAnchorLocal.x),this.dragStartDistance=Math.max(1,this.distance(r,this.dragAnchorLocal))),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPositionForObject(e,t,i){var T,P,_,I,j,L,S,x;let n=this.getEditableObjectConfig(e);if(!n)return;let a=(T=n.transform)!=null?T:{};n.transform||(n.transform=a);let s=(P=this.getRuntimeScreenSize())!=null?P:this.getScreen();if(!(s!=null&&s.width)||!(s!=null&&s.height))return;let r=this.objectMap.get(e),l=((_=r==null?void 0:r.displayObject)==null?void 0:_.parent)===this.bgContainer,c=this.getPositioningAnchor(e,a),d=(a==null?void 0:a.position_ratio)!=null?De(s.width,s.height,a.position_ratio):Se(s.width,s.height,c),p=d.x,u=d.y,g=t,h=i;if(!l){let E=this.getRuntimeScale();p=(d.x-s.width/2)/E,u=(d.y-s.height/2)/E,g=t/E,h=i/E}let m=g-p,f=h-u,b=(I=a.offset)!=null?I:{x:0,y:0},y=Array.isArray(b)?Number((j=b[0])!=null?j:0):Number((L=b==null?void 0:b.x)!=null?L:0),w=Array.isArray(b)?Number((S=b[1])!=null?S:0):Number((x=b==null?void 0:b.y)!=null?x:0),v=this.buildPositionValue(a,{x:m-y,y:f-w});this.updateManager.updateProperty(e,"transform.position",v,{refreshInspector:!0})}updateLiveConfigPosition(e,t){this.selectedId&&this.updateLiveConfigPositionForObject(this.selectedId,e,t)}updateLiveConfigScale(e){var a;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(a=t.transform)!=null?a:{};t.transform||(t.transform=i);let n=Math.round(e*100)/100;this.updateManager.updateProperty(this.selectedId,"transform.scale",n,{refreshInspector:!0})}updateLiveConfigRotation(e){var s;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(s=t.transform)!=null?s:{};t.transform||(t.transform=i);let n=this.toDegrees(e),a=typeof i.rotation=="number"?i.rotation:0;if(Math.abs(n-a)>.01){let r=Math.round(n*100)/100;this.updateManager.updateProperty(this.selectedId,"transform.rotation",r,{refreshInspector:!0})}}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),qe({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&(n(t,i),window.dispatchEvent(new CustomEvent("inspector:refresh")))}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let s=0;s<n.length-1;s+=1){let r=n[s];(!a[r]||typeof a[r]!="object")&&(a[r]={}),a=a[r]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position,n=Math.round(t.x*100)/100,a=Math.round(t.y*100)/100;return Array.isArray(i)?[n,a]:{x:n,y:a}}toRadians(e){return e*Math.PI/180}toDegrees(e){return e*180/Math.PI}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerButton(e){var t,i,n;return typeof(e==null?void 0:e.button)=="number"?e.button:typeof((t=e==null?void 0:e.data)==null?void 0:t.button)=="number"?e.data.button:typeof((n=(i=e==null?void 0:e.data)==null?void 0:i.originalEvent)==null?void 0:n.button)=="number"?e.data.originalEvent.button:0}getEventGlobalPoint(e){var l,c;let t=(c=e==null?void 0:e.global)!=null?c:(l=e==null?void 0:e.data)==null?void 0:l.global;if(t)return new U(t.x,t.y);if(!this.app)return null;let i=e==null?void 0:e.clientX,n=e==null?void 0:e.clientY;if(typeof i!="number"||typeof n!="number")return null;let a=this.app.canvas.getBoundingClientRect(),s=(i-a.left)*(this.app.renderer.width/a.width),r=(n-a.top)*(this.app.renderer.height/a.height);return new U(s,r)}getEventLocalPoint(e,t=this.mainContainer){var a,s;if(!this.app)return null;if(typeof(e==null?void 0:e.getLocalPosition)=="function"){let r=e.getLocalPosition(t);return new U(r.x,r.y)}let i=(s=e==null?void 0:e.global)!=null?s:(a=e==null?void 0:e.data)==null?void 0:a.global;if(!i)return null;let n=new U;return t.toLocal(new U(i.x,i.y),void 0,n),n}getPointerInContainer(e,t,i){if(!this.app)return null;let n=this.app.canvas.getBoundingClientRect(),a=(e-n.left)*(this.app.renderer.width/n.width),s=(t-n.top)*(this.app.renderer.height/n.height),r=new U;return i.toLocal(new U(a,s),void 0,r),r}parseColor(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let i=e.trim().replace("#",""),n=Number.parseInt(i,16);if(Number.isFinite(n))return n}return t}drawSelectionBox(e,t){if(!this.selectionBox)return;this.selectionBox.clear();let i=Math.min(e.x,t.x),n=Math.max(e.x,t.x),a=Math.min(e.y,t.y),s=Math.max(e.y,t.y),r=n-i,l=s-a;this.selectionBox.rect(i,a,r,l),this.selectionBox.stroke({width:2,color:3900150,alpha:.8}),this.selectionBox.rect(i,a,r,l),this.selectionBox.fill({color:3900150,alpha:.1})}finalizeSelectionBox(e,t){var l;let i=Math.min(e.x,t.x),n=Math.max(e.x,t.x),a=Math.min(e.y,t.y),s=Math.max(e.y,t.y),r=[];for(let[c,d]of this.objectMap.entries()){let p=d.displayObject;if(!p||p.visible===!1||this.backgroundLocked&&this.isBackgroundObject(c,this.getEditableObjectConfig(c),p))continue;let u=(l=p.getBounds)==null?void 0:l.call(p);if(!u||u.width<=0||u.height<=0)continue;let g=u.x+u.width/2,h=u.y+u.height/2;g>=i&&g<=n&&h>=a&&h<=s&&r.push(c)}r.length>0&&(this.selectedIds=new Set(r),this.selectedId=r[0],this.updateGizmos())}setupDragAndDrop(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("dragover",t=>{t.preventDefault(),t.stopPropagation(),this.dropZoneActive||(this.dropZoneActive=!0,this.showDropZone())}),e.addEventListener("dragleave",t=>{e.contains(t.relatedTarget)||(this.dropZoneActive=!1,this.hideDropZone())}),e.addEventListener("drop",async t=>{var d;t.preventDefault(),t.stopPropagation(),this.dropZoneActive=!1,this.hideDropZone();let n=Array.from(((d=t.dataTransfer)==null?void 0:d.files)||[]).filter(p=>p.type.startsWith("image/"));if(n.length===0)return;let a=e.getBoundingClientRect(),s=t.clientX-a.left,r=t.clientY-a.top,l=new U(s/a.width*this.app.renderer.width,r/a.height*this.app.renderer.height),c=this.camera.toLocal(l);await this.handleDroppedPNGs(n,c)})}showDropZone(){if(!this.dropZoneOverlay||!this.app)return;let e=this.camera.toLocal(new U(0,0)),t=this.camera.toLocal(new U(this.app.renderer.width,this.app.renderer.height)),i=t.x-e.x,n=t.y-e.y;this.dropZoneOverlay.clear(),this.dropZoneOverlay.rect(e.x,e.y,i,n),this.dropZoneOverlay.fill({color:3900150,alpha:.1}),this.dropZoneOverlay.rect(e.x,e.y,i,n),this.dropZoneOverlay.stroke({width:3,color:3900150,alpha:.6}),this.dropZoneOverlay.visible=!0}hideDropZone(){this.dropZoneOverlay&&(this.dropZoneOverlay.clear(),this.dropZoneOverlay.visible=!1)}async handleDroppedPNGs(e,t){let i=window.__HANDLER_ACTIVE_SCREEN,n=i==="loading"||i==="start"||i==="gameplay"||i==="tutorial"||i==="endgame"?i:"gameplay",a=this.showToast(`Processing ${e.length} PNG${e.length>1?"s":""}...`);try{for(let s=0;s<e.length;s++){let r=e[s];await this.processDroppedPNG(r,t,n,s)}this.hideToast(a),this.showToast(`\u2705 Added ${e.length} PNG${e.length>1?"s":""} to scene`,2e3),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh"))}catch(s){this.hideToast(a),this.showToast(`\u274C Error: ${s instanceof Error?s.message:String(s)}`,3e3),console.error("[SceneEditor] Failed to process dropped PNGs:",s)}}async processDroppedPNG(e,t,i,n){let a=await this.fileToDataUrl(e);if(!a)throw new Error(`Failed to read ${e.name}`);let s=e.name.replace(/\.[^/.]+$/,""),r=this.inferCategoryFromFilename(s),l=s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"").toLowerCase(),c=`${l}_${Date.now()}${n>0?`_${n}`:""}`,d=`json.${c}`,p=`${l}.png`,g=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:r,filename:p,data:a,overwrite:!1})})).json();if(!g.success)throw new Error(`Failed to save ${e.name} to library: ${g.error}`);let h=this.getScreen(),m=this.getRuntimeScale(),f=(t.x-h.width/2)/m,b=(t.y-h.height/2)/m,y={identity:{id:d,category:r},transform:{anchor:"center",position:{x:f,y:b},scale:1,rotation:0},render:{z_index:0,alpha:1,visible:!0,anchor:{x:.5,y:.5},asset:{type:"image",path:g.path||`raw/library/${r}/${p}`}}},w=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:c,objectConfigId:d,config:y,layer:r==="ui"?"ui":"world"})}),v=await w.json();if(!w.ok||!v.success)throw new Error(`Failed to create object: ${v.error||"Unknown error"}`)}inferCategoryFromFilename(e){let t=e.toLowerCase();return t.startsWith("ui_")||t.includes("button")||t.includes("label")?"ui":t.startsWith("bg_")||t.includes("background")?"backgrounds":t.includes("character")||t.includes("player")?"character":"environment"}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}showToast(e,t=3e3){let i=document.createElement("div");return i.style.cssText=`
2272
+ `;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(o){new qn().open(o)};import{Application as Do,Container as Ne,Graphics as ge,Point as U,Rectangle as hr,Text as Ho,TextStyle as No}from"pixi.js";import{Sprite as Oo,Container as gr}from"pixi.js";var zo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Vn=zo;if(typeof window!="undefined")try{let o=new XMLHttpRequest;if(o.open("GET","./build-settings.json",!1),o.send(),o.status===200&&o.responseText){let e=JSON.parse(o.responseText);e!=null&&e.buildMode&&(Vn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${Vn}`))}}catch{}function $o(o){var t,i,n,a,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(o);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(o))return{x:(t=o[0])!=null?t:.5,y:(i=o[1])!=null?i:.5};if(o&&typeof o=="object"&&"x"in o&&"y"in o)return{x:(n=o.x)!=null?n:.5,y:(a=o.y)!=null?a:.5};if(typeof o=="string"){let r=o.trim().toLowerCase();return(s=e[r])!=null?s:{x:.5,y:.5}}return null}var Me=class{static async create(e,t,i){var l,c,d,p,u,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${Vn}`);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 gr;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 an.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 r;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),r=new Oo(s),console.log("[ObjectFactory] Created object:",r,"type:",(p=r==null?void 0:r.constructor)==null?void 0:p.name),this.applyTransform(r,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 gr)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let m=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],f=!1;for(let b of m)try{let y=await fetch(b);if(y.ok){r=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=r==null?void 0:r.constructor)==null?void 0:h.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),r=s)}else r=s;else r=s,r&&typeof r=="object"&&("x"in r||"position"in r)&&this.applyTransform(r,t==null?void 0:t.transform,t);return r}static applyTransform(e,t,i){var n,a,s,r;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,(r=t.position.y)!=null?r: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=$o(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var Vi=class{constructor(e){this.app=null;this.camera=new Ne;this.bgContainer=new Ne;this.mainContainer=new Ne;this.uiContainer=new Ne;this.gizmoLayer=new Ne;this.screenFrame=new ge;this.gameFrame=new ge;this.gridLayer=new ge;this.spawnPointLayer=new Ne;this.objectMap=new Map;this.selectedId=null;this.selectedIds=new Set;this.dragMode=null;this.selectionBox=null;this.selectionBoxStart=null;this.isSelectionBoxActive=!1;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotation=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.dragContainer=null;this.dragLastPointer=null;this.dragPointerOffset=null;this.dragSyncHoldUntil=0;this.dragLogged=!1;this.spawnPointDrag=null;this.lastGameFrameSize=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.screenSyncRaf=null;this.gizmoOutline=new ge;this.anchorVisualizationLayer=new ge;this.moveHandle=new ge;this.scaleHandle=new ge;this.rotateHandle=new ge;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.gridEnabled=!1;this.gridGap=50;this.gridAlpha=.25;this.snapToGrid=!1;this.alignmentGuidesEnabled=!0;this.alignmentGuideLayer=new ge;this.lastPickPoint=null;this.lastPickIds=[];this.lastPickIndex=0;this.lastPickTime=0;this.playModeEnabled=!0;this.playModeInitialized=!1;this.layoutScale=1;this.updateManager=new Pe;this.backgroundCoverEnabled=!0;this.backgroundLocked=!0;this.backgroundCoverRetries=new Map;this.backgroundCoverRaf=null;this.dropZoneActive=!1;this.dropZoneOverlay=null;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.hasUserCamera=!1,this.updateLayout({width:t,height:i}),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid(),this.playModeEnabled?this.schedulePostScreenSync({width:t,height:i}):this.syncFromConfig())};this.handleAnchorChanged=e=>{let t=e==null?void 0:e.detail,i=t==null?void 0:t.objectId;if(!i)return;let n=t==null?void 0:t.previousAnchor,a=t==null?void 0:t.nextAnchor;this.adjustPositionForAnchorChange(i,n,a)};this.handleActiveScreenChanged=()=>{this.isVisible&&this.syncFromConfig()};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout(),this.updateGrid();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.path,n=t.objectId;if(i==="transform.anchor"&&n){let s=t.value,r=t.oldValue;r!=null&&this.adjustPositionForAnchorChange(n,r,s)}let a=t.objectIds;if(n){this.syncFromConfig([n]);return}if(Array.isArray(a)&&a.length>0){this.syncFromConfig(a);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handleAssetUpdated=e=>{var l;let t=(l=e==null?void 0:e.detail)!=null?l:{},i=t.objectId,n=t.texture;if(!i||!n)return;let a=this.objectMap.get(i);if(!a)return;let s=a.displayObject;if(s!=null&&s.texture)s.texture=n;else if(s!=null&&s.children){let c=s.children.find(d=>d==null?void 0:d.texture);c&&(c.texture=n)}let r=this.getEditableObjectConfig(i);r&&(a.assetKey=this.getAssetKey(r))};this.handleLayoutApplied=e=>{var s;if(!this.isVisible)return;let t=(s=e==null?void 0:e.detail)!=null?s:{},i=Number(t.width),n=Number(t.height),a=Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:this.getScreen();this.updateLayout(a),this.hasUserCamera||this.centerCamera(),this.syncFromConfig().then(()=>{this.playModeEnabled&&this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid()})};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onStagePointerDown=e=>{if(!this.app||!this.isVisible)return;let t=this.getPointerButton(e);if(t===2){if(this.isGizmoTarget(e==null?void 0:e.target))return;let h=this.getEventGlobalPoint(e);if(!h)return;let m=new U(h.x,h.y),f=this.getPickCandidates(m);if(f.length>0){let b=f[0];this.selectedIds.has(b)||(this.selectedIds.clear(),this.selectedIds.add(b),this.setSelected(b),this.updateGizmos()),this.showContextMenu(b,h.x,h.y)}return}if(t!==0||this.isGizmoTarget(e==null?void 0:e.target))return;let i=this.getEventGlobalPoint(e);if(!i)return;let n=new U(i.x,i.y),a=this.getPickCandidates(n),r=navigator.platform.toUpperCase().indexOf("MAC")>=0?e.metaKey:e.ctrlKey;if(a.length===0){r||(this.setSelected(null),this.selectedIds.clear()),this.selectionBoxStart=n,this.isSelectionBoxActive=!0,this.lastPickIds=[],this.lastPickIndex=0,this.lastPickPoint=n,this.lastPickTime=performance.now();return}let l=performance.now(),c=this.areSameIds(a,this.lastPickIds),d=this.lastPickPoint&&this.distance(n,this.lastPickPoint)<=6,p=l-this.lastPickTime<1200,u=c&&d&&p?(this.lastPickIndex+1)%a.length:0,g=a[u];this.lastPickIds=a,this.lastPickIndex=u,this.lastPickPoint=n,this.lastPickTime=l,r?this.selectedIds.has(g)?(this.selectedIds.delete(g),this.selectedId===g&&(this.selectedId=this.selectedIds.size>0?Array.from(this.selectedIds)[0]:null)):(this.selectedIds.add(g),this.selectedId=g):(this.selectedIds.clear(),this.selectedIds.add(g),this.setSelected(g)),this.updateGizmos()};this.handleGridSettings=e=>{var a,s,r;let t=(a=e==null?void 0:e.detail)==null?void 0:a.enabled,i=(s=e==null?void 0:e.detail)==null?void 0:s.gap,n=(r=e==null?void 0:e.detail)==null?void 0:r.alpha;typeof t=="boolean"&&(this.gridEnabled=t),typeof i=="number"&&Number.isFinite(i)&&i>2&&(this.gridGap=i),typeof n=="number"&&Number.isFinite(n)&&n>=0&&n<=1&&(this.gridAlpha=n),this.updateGrid()};this.handleBackgroundCover=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;typeof t=="boolean"&&(this.backgroundCoverEnabled=t,this.syncFromConfig(),this.updateGizmos())};this.handleBackgroundLock=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;if(typeof t=="boolean"&&(this.backgroundLocked=t,t&&this.selectedId)){let n=this.getEditableObjectConfig(this.selectedId),a=this.objectMap.get(this.selectedId);this.isBackgroundObject(this.selectedId,n,a==null?void 0:a.displayObject)&&this.setSelected(null)}};this.handlePlayModeChange=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;typeof t=="boolean"&&(!this.playModeInitialized&&(this.playModeInitialized=!0,!t)||t&&this.applyPlayModeState(!0))};this.syncFromGameObjects=()=>{this.syncFromGameObjectsInternal()};this.onSpawnPointDragMove=e=>{if(!this.spawnPointDrag)return;let t=this.getPointerInContainer(e.clientX,e.clientY,this.mainContainer);if(!t)return;let i=t.x+this.spawnPointDrag.offset.x,n=t.y+this.spawnPointDrag.offset.y;this.updateLiveSpawnPoint(this.spawnPointDrag.objectId,this.spawnPointDrag.index,i,n)};this.onSpawnPointDragEnd=()=>{if(!this.spawnPointDrag)return;let{objectId:e,startPoints:t}=this.spawnPointDrag,i=this.getEditableObjectConfig(e),n=i?this.getSpawnPoints(i):null;i&&n&&(this.setNestedValue(i,"logic.props.spawnPoints",t),qe({objectId:e,path:"logic.props.spawnPoints",value:n},{persist:!0,emitEvent:!0,trackHistory:!0}),this.queueLiveApply(e)),this.spawnPointDrag=null,window.dispatchEvent(new CustomEvent("inspector:refresh")),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd)};this.onDragMove=e=>{var n;if(!this.dragMode||!this.selectedId||!this.dragContainer||!this.dragStartPointer||!this.dragStartPos)return;let t=this.objectMap.get(this.selectedId);if(!(t!=null&&t.displayObject))return;let i=this.getPointerInContainer(e.clientX,e.clientY,this.dragContainer);if(i){if(this.dragMode==="move"){let a=this.dragPointerOffset;if(!a)return;let s=i.x+a.x,r=i.y+a.y;if(this.snapToGrid){let d=this.snapToGridPosition(s,r);s=d.x,r=d.y}let l=s-this.dragStartPos.x,c=r-this.dragStartPos.y;if(t.displayObject.position.set(s,r),this.updateAlignmentGuides(this.selectedId,new U(s,r)),this.updateLiveConfigPosition(s,r),this.selectedIds.size>1){let d=new Map;if(!this.multiDragStartPositions){this.multiDragStartPositions=new Map;for(let p of this.selectedIds){if(p===this.selectedId)continue;let u=this.objectMap.get(p);u!=null&&u.displayObject&&this.multiDragStartPositions.set(p,new U(u.displayObject.position.x,u.displayObject.position.y))}}for(let p of this.selectedIds){if(p===this.selectedId)continue;let u=this.objectMap.get(p);if(!(u!=null&&u.displayObject))continue;let g=this.multiDragStartPositions.get(p);if(g){let h=g.x+l,m=g.y+c;if(this.snapToGrid){let f=this.snapToGridPosition(h,m);h=f.x,m=f.y}u.displayObject.position.set(h,m),this.updateLiveConfigPositionForObject(p,h,m)}}}this.dragLastPointer=new U(i.x,i.y),this.dragLogged||(this.dragLogged=!0,console.log("[SceneEditor][DragMove]",{objectId:this.selectedId,selectedCount:this.selectedIds.size,pointer:{x:i.x,y:i.y},nextPos:{x:s,y:r}}))}if(this.dragMode==="scale"&&this.dragAnchorLocal){let s=Math.max(1,this.distance(i,this.dragAnchorLocal))/Math.max(1,this.dragStartDistance),r=Math.max(.01,this.dragStartScale*s);(n=t.displayObject.scale)!=null&&n.set?t.displayObject.scale.set(r,r):t.displayObject.scale&&(t.displayObject.scale.x=r,t.displayObject.scale.y=r),this.updateLiveConfigScale(r)}if(this.dragMode==="rotate"&&this.dragAnchorLocal){let a=Math.atan2(i.y-this.dragAnchorLocal.y,i.x-this.dragAnchorLocal.x),s=this.dragStartRotation+(a-this.dragStartAngle);t.displayObject.rotation=s,this.updateLiveConfigRotation(s)}this.updateGizmos()}};this.onDragEnd=()=>{if(this.dragMode){if(this.alignmentGuideLayer&&this.alignmentGuideLayer.clear(),this.selectedIds.size>0){let e=Array.from(this.selectedIds);window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectIds:e}})),this.dragSyncHoldUntil=performance.now()+200}this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,this.dragContainer=null,this.dragLastPointer=null,this.dragPointerOffset=null,this.multiDragStartPositions=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd)}};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i)),a=new U(this.app.renderer.width/2,this.app.renderer.height/2),s=this.camera.toLocal(a);this.cameraScale=n,this.camera.scale.set(n);let r=this.camera.toGlobal(s);this.camera.position.set(this.camera.position.x+(a.x-r.x),this.camera.position.y+(a.y-r.y)),this.hasUserCamera=!0,this.updateGizmos(),this.updateGrid()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(this.isPanning&&this.panStart&&this.panStartCamera){let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i),this.updateGrid()}if(this.isSelectionBoxActive&&this.selectionBoxStart&&this.app){let t=this.getEventGlobalPoint(e);if(!t)return;let i=new U(t.x,t.y);this.drawSelectionBox(this.selectionBoxStart,i)}};this.onPanEnd=e=>{if(this.isPanning&&(this.isPanning=!1,this.panStart=null,this.panStartCamera=null),this.isSelectionBoxActive&&this.selectionBoxStart&&this.app){let t=this.getEventGlobalPoint(e);if(t){let i=new U(t.x,t.y);this.finalizeSelectionBox(this.selectionBoxStart,i)}this.isSelectionBoxActive=!1,this.selectionBoxStart=null,this.selectionBox&&this.selectionBox.clear()}this.multiDragStartPositions=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new Do,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.bgContainer.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.uiContainer.sortableChildren=!0,this.spawnPointLayer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.screenFrame),this.camera.addChild(this.bgContainer),this.camera.addChild(this.mainContainer),this.camera.addChild(this.gridLayer),this.camera.addChild(this.uiContainer),this.camera.addChild(this.spawnPointLayer),this.camera.addChild(this.gameFrame),this.camera.addChild(this.gizmoLayer),this.screenFrame.zIndex=-1,this.screenFrame.eventMode="none",this.bgContainer.zIndex=-5e3,this.bgContainer.eventMode="none",this.mainContainer.zIndex=0,this.gridLayer.zIndex=2e4,this.gridLayer.eventMode="none",this.gridLayer.visible=!0,this.uiContainer.zIndex=5e4,this.spawnPointLayer.zIndex=8e4,this.spawnPointLayer.eventMode="passive",this.gameFrame.zIndex=85e3,this.gameFrame.eventMode="none",this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.anchorVisualizationLayer),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.selectionBox=new ge,this.selectionBox.zIndex=99999,this.selectionBox.eventMode="none",this.gizmoLayer.addChild(this.selectionBox),this.dropZoneOverlay=new ge,this.dropZoneOverlay.zIndex=99998,this.dropZoneOverlay.eventMode="none",this.gizmoLayer.addChild(this.dropZoneOverlay),this.alignmentGuideLayer=new ge,this.alignmentGuideLayer.zIndex=99997,this.alignmentGuideLayer.eventMode="none",this.gizmoLayer.addChild(this.alignmentGuideLayer),this.gizmoOutline.eventMode="none",this.anchorVisualizationLayer.eventMode="none",this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.restoreScenePreferences(),this.refresh(),this.applyPlayModeState(!0),!this.isVisible&&this.app.ticker&&this.app.ticker.stop())}destroy(){var e;this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.screenSyncRaf&&(cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("handler:layout-applied",this.handleLayoutApplied),window.removeEventListener("preview:select",this.handlePreviewSelect),window.removeEventListener("scene-editor:grid",this.handleGridSettings),window.removeEventListener("scene-editor:background-cover",this.handleBackgroundCover),window.removeEventListener("scene-editor:background-lock",this.handleBackgroundLock),window.removeEventListener("scene-editor:asset-updated",this.handleAssetUpdated),window.removeEventListener("scene-editor:play-mode",this.handlePlayModeChange),window.removeEventListener("scene-editor:anchor-changed",this.handleAnchorChanged),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd),this.app&&((e=this.app.ticker)==null||e.remove(this.syncFromGameObjects),this.app.stage.off("pointerdown",this.onStagePointerDown),this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,!(!this.app||!this.app.ticker)&&(e?(this.app.ticker.start(),this.refresh(),this.updateGrid()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("handler:layout-applied",this.handleLayoutApplied),window.addEventListener("preview:select",this.handlePreviewSelect),window.addEventListener("scene-editor:grid",this.handleGridSettings),window.addEventListener("scene-editor:background-cover",this.handleBackgroundCover),window.addEventListener("scene-editor:background-lock",this.handleBackgroundLock),window.addEventListener("scene-editor:asset-updated",this.handleAssetUpdated),window.addEventListener("scene-editor:play-mode",this.handlePlayModeChange),window.addEventListener("scene-editor:anchor-changed",this.handleAnchorChanged),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.app.stage.on("pointerdown",this.onStagePointerDown),this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t)),this.applyEditControls(),this.setupKeyboardShortcuts(),this.setupDragAndDrop()}setupKeyboardShortcuts(){window.addEventListener("keydown",e=>{if(!this.isVisible)return;let i=navigator.platform.toUpperCase().indexOf("MAC")>=0?e.metaKey:e.ctrlKey,n=e.target;n.tagName==="INPUT"||n.tagName==="TEXTAREA"||n.isContentEditable||(i&&e.key==="a"?(e.preventDefault(),this.selectAll()):i&&e.key==="d"?(e.preventDefault(),this.duplicateSelected()):i&&e.key==="c"?(e.preventDefault(),this.copySelected()):i&&e.key==="v"?(e.preventDefault(),this.pasteObjects()):e.key==="Escape"?(this.setSelected(null),this.selectedIds.clear(),this.updateGizmos()):(e.key==="Delete"||e.key==="Backspace")&&this.selectedIds.size>0?(e.preventDefault(),this.deleteSelectedObjects()):e.key==="g"||e.key==="G"?(e.preventDefault(),this.toggleGrid()):e.shiftKey&&(e.key==="g"||e.key==="G")&&(e.preventDefault(),this.toggleSnapToGrid()))})}async duplicateSelected(){if(this.selectedIds.size===0)return;let e=window.__HANDLER_ACTIVE_SCREEN,t=e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay",i=Array.from(this.selectedIds),n=[];for(let a of i)try{let s=`${a}_copy_${Date.now()}`,r=await fetch("/api/objects/duplicate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sourceId:a,newInstanceId:s,shareConfig:!1,screenId:t})}),l=await r.json();r.ok&&l.success&&n.push(l.newObjectId)}catch(s){console.error(`[SceneEditor] Failed to duplicate ${a}:`,s)}n.length>0&&(this.selectedIds=new Set(n),this.selectedId=n[0],this.updateGizmos(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")))}copySelected(){if(this.selectedIds.size===0)return;let e=[];for(let t of this.selectedIds){let i=this.getEditableObjectConfig(t);i&&e.push({id:t,config:i})}window.__sceneEditorClipboard={configs:e,timestamp:Date.now()},this.showToast(`\u{1F4CB} Copied ${e.length} object${e.length>1?"s":""}`,1500)}async pasteObjects(){var a,s;let e=window.__sceneEditorClipboard;if(!e||!e.configs||e.configs.length===0)return;let t=window.__HANDLER_ACTIVE_SCREEN,i=t==="loading"||t==="start"||t==="gameplay"||t==="tutorial"||t==="endgame"?t:"gameplay",n=[];for(let{id:r,config:l}of e.configs)try{let c=`${r}_paste_${Date.now()}_${Math.random().toString(36).substr(2,5)}`,d=`json.${c}`,p=JSON.parse(JSON.stringify(l));if(p.identity.id=d,p.instance_id=c,p.object_config=d,(a=p.transform)!=null&&a.position){let h=p.transform.position,m=Array.isArray(h)?h[0]:h.x||0,f=Array.isArray(h)?h[1]:h.y||0;Array.isArray(h)?p.transform.position=[m+20,f+20]:p.transform.position={x:m+20,y:f+20}}let u=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:c,objectConfigId:d,config:p,layer:((s=p.identity)==null?void 0:s.category)==="ui"?"ui":"world"})}),g=await u.json();u.ok&&g.success&&n.push(c)}catch(c){console.error(`[SceneEditor] Failed to paste ${r}:`,c)}n.length>0&&(this.selectedIds=new Set(n),this.selectedId=n[0],this.updateGizmos(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),this.showToast(`\u{1F4CB} Pasted ${n.length} object${n.length>1?"s":""}`,1500))}toggleGrid(){this.gridEnabled=!this.gridEnabled,this.updateGrid();try{window.localStorage.setItem(this.getSceneStorageKey("grid_enabled"),String(this.gridEnabled))}catch{}this.showToast(this.gridEnabled?"\u{1F4D0} Grid enabled":"\u{1F4D0} Grid disabled",1e3)}toggleSnapToGrid(){this.snapToGrid=!this.snapToGrid;try{window.localStorage.setItem(this.getSceneStorageKey("snap_to_grid"),String(this.snapToGrid))}catch{}this.showToast(this.snapToGrid?"\u{1F532} Snap to grid enabled":"\u{1F532} Snap to grid disabled",1e3)}snapToGridPosition(e,t){if(!this.snapToGrid)return{x:e,y:t};let i=this.gridGap;return{x:Math.round(e/i)*i,y:Math.round(t/i)*i}}updateAlignmentGuides(e,t){var d,p,u,g;if(!this.alignmentGuidesEnabled||!e||!this.alignmentGuideLayer){this.alignmentGuideLayer&&this.alignmentGuideLayer.clear();return}let i=this.objectMap.get(e);if(!(i!=null&&i.displayObject)){this.alignmentGuideLayer.clear();return}let n=(p=(d=i.displayObject).getBounds)==null?void 0:p.call(d);if(!n){this.alignmentGuideLayer.clear();return}this.alignmentGuideLayer.clear();let a=this.camera.toLocal(new U(n.x,n.y)),s=this.camera.toLocal(new U(n.x+n.width,n.y+n.height)),r=(a.x+s.x)/2,l=(a.y+s.y)/2,c=5;for(let[h,m]of this.objectMap.entries()){if(h===e||!(m!=null&&m.displayObject)||m.displayObject.visible===!1)continue;let f=(g=(u=m.displayObject).getBounds)==null?void 0:g.call(u);if(!f)continue;let b=this.camera.toLocal(new U(f.x,f.y)),y=this.camera.toLocal(new U(f.x+f.width,f.y+f.height)),w=(b.x+y.x)/2,v=(b.y+y.y)/2;if(Math.abs(r-w)<c){let E=Math.min(a.y,b.y),C=Math.max(s.y,y.y);this.alignmentGuideLayer.moveTo(w,E),this.alignmentGuideLayer.lineTo(w,C),this.alignmentGuideLayer.stroke({width:1,color:3900150,alpha:.6})}if(Math.abs(l-v)<c){let E=Math.min(a.x,b.x),C=Math.max(s.x,y.x);this.alignmentGuideLayer.moveTo(E,v),this.alignmentGuideLayer.lineTo(C,v),this.alignmentGuideLayer.stroke({width:1,color:3900150,alpha:.6})}let T=a.x,P=s.x,_=a.y,I=s.y,j=b.x,L=y.x,S=b.y,x=y.y;if(Math.abs(T-j)<c||Math.abs(T-L)<c||Math.abs(P-j)<c||Math.abs(P-L)<c){let E=Math.abs(T-j)<c?j:Math.abs(T-L)<c?L:Math.abs(P-j)<c?j:L,C=Math.min(_,S),A=Math.max(I,x);this.alignmentGuideLayer.moveTo(E,C),this.alignmentGuideLayer.lineTo(E,A),this.alignmentGuideLayer.stroke({width:1,color:1096065,alpha:.5})}if(Math.abs(_-S)<c||Math.abs(_-x)<c||Math.abs(I-S)<c||Math.abs(I-x)<c){let E=Math.abs(_-S)<c?S:Math.abs(_-x)<c?x:Math.abs(I-S)<c?S:x,C=Math.min(T,j),A=Math.max(P,L);this.alignmentGuideLayer.moveTo(C,E),this.alignmentGuideLayer.lineTo(A,E),this.alignmentGuideLayer.stroke({width:1,color:1096065,alpha:.5})}}}selectAll(){let e=Array.from(this.objectMap.keys()).filter(t=>{let i=this.getEditableObjectConfig(t),n=this.objectMap.get(t);return!(!(n!=null&&n.displayObject)||n.displayObject.visible===!1||this.backgroundLocked&&this.isBackgroundObject(t,i,n.displayObject))});this.selectedIds=new Set(e),e.length>0&&(this.selectedId=e[0],this.updateGizmos())}deleteSelectedObjects(){let e=Array.from(this.selectedIds);for(let t of e){let i=window.__deleteObjectRequest;typeof i=="function"&&i(t)}this.selectedIds.clear(),this.selectedId=null,this.updateGizmos()}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid())}adjustPositionForAnchorChange(e,t,i){var L,S,x,E,C,A;if(t==null||i==null||t===i)return;let n=this.getEditableObjectConfig(e);if(!n)return;let a=(L=n.transform)!=null?L:{};if(a.position_ratio!=null)return;let s=(S=this.getRuntimeScreenSize())!=null?S:this.getScreen();if(!(s!=null&&s.width)||!(s!=null&&s.height))return;let r=this.objectMap.get(e);if(!(r!=null&&r.displayObject))return;let l=this.isBackgroundObject(e,n,r.displayObject),c=this.getRuntimeScale(),d=r.displayObject.position.x,p=r.displayObject.position.y,u=Se(s.width,s.height,t),g=Se(s.width,s.height,i),h=u.x,m=u.y,f=g.x,b=g.y;l||(h=(u.x-s.width/2)/c,m=(u.y-s.height/2)/c,f=(g.x-s.width/2)/c,b=(g.y-s.height/2)/c);let y={x:d-h,y:p-m},w={x:d-f,y:p-b},v=a.offset,T=Array.isArray(v)?Number((x=v[0])!=null?x:0):Number((E=v==null?void 0:v.x)!=null?E:0),P=Array.isArray(v)?Number((C=v[1])!=null?C:0):Number((A=v==null?void 0:v.y)!=null?A:0),_=w.x-T,I=w.y-P,j=this.buildPositionValue(a,{x:_,y:I});this.updateManager.updateProperty(e,"transform.position",j,{refreshInspector:!0})}getPickCandidates(e){var i;let t=[];for(let[n,a]of this.objectMap.entries()){let s=a.displayObject;if(!s||s.visible===!1||this.backgroundLocked&&this.isBackgroundObject(n,this.getEditableObjectConfig(n),s))continue;let r=(i=s.getBounds)==null?void 0:i.call(s);if(!r||r.width<=0||r.height<=0||e.x<r.x||e.x>r.x+r.width||e.y<r.y||e.y>r.y+r.height)continue;let l=s.parent,c=typeof(l==null?void 0:l.zIndex)=="number"?l.zIndex:0,d=typeof s.zIndex=="number"?s.zIndex:0,p=typeof(l==null?void 0:l.getChildIndex)=="function"?l.getChildIndex(s):0,u=c*1e6+d*1e3+p;t.push({id:n,order:u})}return t.sort((n,a)=>a.order-n.order),t.map(n=>n.id)}areSameIds(e,t){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i+=1)if(e[i]!==t[i])return!1;return!0}isGizmoTarget(e){return e&&this.spawnPointLayer.children.indexOf(e)!==-1?!0:e===this.moveHandle||e===this.scaleHandle||e===this.rotateHandle||e===this.gizmoOutline}restoreScenePreferences(){if(typeof window!="undefined"){try{let e=window.localStorage.getItem(this.getSceneStorageKey("grid_enabled")),t=window.localStorage.getItem(this.getSceneStorageKey("grid_gap")),i=window.localStorage.getItem(this.getSceneStorageKey("grid_alpha")),n=window.localStorage.getItem(this.getSceneStorageKey("snap_to_grid")),a=window.localStorage.getItem(this.getSceneStorageKey("background_cover")),s=window.localStorage.getItem(this.getSceneStorageKey("background_lock"));if(e!==null&&(this.gridEnabled=e==="true"),t!==null){let r=Number(t);Number.isFinite(r)&&r>2&&(this.gridGap=r)}if(i!==null){let r=Number(i);Number.isFinite(r)&&r>=0&&r<=1&&(this.gridAlpha=r)}n!==null&&(this.snapToGrid=n==="true"),a!==null&&(this.backgroundCoverEnabled=a==="true"),s!==null&&(this.backgroundLocked=s==="true")}catch{}this.updateGrid()}}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}applyPlayModeState(e){var t;this.playModeEnabled=e,(t=this.app)!=null&&t.ticker&&(this.app.ticker.remove(this.syncFromGameObjects),e&&this.app.ticker.add(this.syncFromGameObjects)),this.applyEditControls(),this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.syncFromConfig().then(()=>{this.playModeEnabled&&this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid()})}applyEditControls(){this.moveHandle.eventMode="static",this.scaleHandle.eventMode="static",this.rotateHandle.eventMode="static"}schedulePostScreenSync(e){this.screenSyncRaf&&cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=requestAnimationFrame(()=>{this.runPostScreenSync(e)})}async runPostScreenSync(e){this.screenSyncRaf=null,this.isVisible&&this.playModeEnabled&&(this.updateLayout(e),this.hasUserCamera||this.centerCamera(),await this.syncFromConfig(),this.syncFromGameObjectsInternal(),this.updateGizmos(),this.updateGrid())}getRuntimeScreenSize(){var a,s,r,l,c,d,p;let e=window.gameApp;if(e!=null&&e.renderer){let u=e.renderer.screen,g=Number((a=u==null?void 0:u.width)!=null?a:0),h=Number((s=u==null?void 0:u.height)!=null?s:0);if(Number.isFinite(g)&&g>0&&Number.isFinite(h)&&h>0)return{width:g,height:h};let m=Number((r=e.renderer.resolution)!=null?r:1)||1,f=Number((l=e.renderer.width)!=null?l:0)/m,b=Number((c=e.renderer.height)!=null?c:0)/m;if(Number.isFinite(f)&&f>0&&Number.isFinite(b)&&b>0)return{width:f,height:b}}let t=document.querySelector(".game-container"),i=Number((d=t==null?void 0:t.dataset)==null?void 0:d.screenWidth),n=Number((p=t==null?void 0:t.dataset)==null?void 0:p.screenHeight);return Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:null}getRuntimeLayoutReference(){var a,s,r,l,c,d,p,u,g,h,m,f,b,y,w,v,T,P,_,I,j,L,S,x,E,C,A,k,R,M,O,D,N,q;let e=window.__screenManager;if(e){let $=["gameplay","start","tutorial","endgame","loading"];for(let H of $){let z=(a=e.get)==null?void 0:a.call(e,H);if(z!=null&&z.visible){let G=(s=z.getContentLayer)==null?void 0:s.call(z);if(G){let Y=(r=z.x)!=null?r:0,V=(l=z.y)!=null?l:0,F=(c=G.x)!=null?c:0,Q=(d=G.y)!=null?d:0,W=(u=(p=G.scale)==null?void 0:p.x)!=null?u:1,K=(h=(g=G.scale)==null?void 0:g.y)!=null?h:W;return console.log("[SceneEditor] getRuntimeLayoutReference: using visible screen contentLayer",{screenId:H,contentLayerScale:{x:W,y:K},position:{x:Y+F,y:V+Q}}),{scale:{x:W,y:K},position:{x:Y+F,y:V+Q},pivot:G.pivot?{x:G.pivot.x,y:G.pivot.y}:void 0}}}}for(let H of $){let z=(m=e.get)==null?void 0:m.call(e,H);if(z){if(!z.visible&&typeof z.updateLayout=="function"){let Y=window.gameApp;if((f=Y==null?void 0:Y.renderer)!=null&&f.screen){let V=Y.renderer.screen.width,F=Y.renderer.screen.height;V>0&&F>0&&z.updateLayout(V,F)}}let G=(b=z.getContentLayer)==null?void 0:b.call(z);if(G){let Y=(y=z.x)!=null?y:0,V=(w=z.y)!=null?w:0,F=(v=G.x)!=null?v:0,Q=(T=G.y)!=null?T:0,W=(_=(P=G.scale)==null?void 0:P.x)!=null?_:1,K=(j=(I=G.scale)==null?void 0:I.y)!=null?j:W;return console.log("[SceneEditor] getRuntimeLayoutReference: using any screen contentLayer",{screenId:H,visible:z.visible,contentLayerScale:{x:W,y:K},position:{x:Y+F,y:V+Q}}),{scale:{x:W,y:K},position:{x:Y+F,y:V+Q},pivot:G.pivot?{x:G.pivot.x,y:G.pivot.y}:void 0}}}}}let t=window.__mainContainer;if(t){let $=(S=(L=t.scale)==null?void 0:L.x)!=null?S:1,H=(E=(x=t.scale)==null?void 0:x.y)!=null?E:$;return console.log("[SceneEditor] getRuntimeLayoutReference: using __mainContainer",{scale:{x:$,y:H},position:{x:(C=t.position)==null?void 0:C.x,y:(A=t.position)==null?void 0:A.y}}),t}let i=window.gameApp,n=(k=i==null?void 0:i.stage)!=null?k:null;if(n){let $=(M=(R=n.scale)==null?void 0:R.x)!=null?M:1,H=(D=(O=n.scale)==null?void 0:O.y)!=null?D:$;console.log("[SceneEditor] getRuntimeLayoutReference: using gameApp.stage (fallback)",{scale:{x:$,y:H},position:{x:(N=n.position)==null?void 0:N.x,y:(q=n.position)==null?void 0:q.y}})}else console.log("[SceneEditor] getRuntimeLayoutReference: no reference found");return n}getRuntimeScale(){var i,n;let e=this.getRuntimeLayoutReference(),t=Number((n=(i=e==null?void 0:e.scale)==null?void 0:i.x)!=null?n:1);return Number.isFinite(t)&&t>0?t:Number.isFinite(this.layoutScale)&&this.layoutScale>0?this.layoutScale:1}getRuntimeParentContainer(e){var c,d,p,u,g;let t=window.gameObjectManager;if(!(t!=null&&t.get))return null;let i=t.get(e),n=((c=i==null?void 0:i.getDisplayObject)==null?void 0:c.call(i))||(i==null?void 0:i.pixiObject)||i,a=n==null?void 0:n.parent;if(!a)return null;let s=window.__screenManager;if(s){let h=["gameplay","start","tutorial","endgame","loading"];for(let m of h){let f=(d=s.get)==null?void 0:d.call(s,m);if(!f)continue;let b=(u=(p=f.getBgLayer)==null?void 0:p.call(f))!=null?u:f.bgLayer;if(b&&(a===b||typeof b.contains=="function"&&b.contains(a)))return this.bgContainer}}let r=this.getRuntimeLayoutReference(),l=(g=window.gameApp)==null?void 0:g.stage;return r&&l&&r===l?this.mainContainer:r&&typeof r.contains=="function"&&r.contains(a)?this.mainContainer:a===r||a===l?this.mainContainer:this.uiContainer}applyRuntimeTransform(e){var s,r,l,c,d,p,u,g,h,m;if(!e)return console.log("[SceneEditor] applyRuntimeTransform: no reference"),!1;let t=1,i=1,n=Number((r=(s=e.position)==null?void 0:s.x)!=null?r:0),a=Number((c=(l=e.position)==null?void 0:l.y)!=null?c:0);if(!Number.isFinite(n)||!Number.isFinite(a))return console.log("[SceneEditor] applyRuntimeTransform: invalid position",{posX:n,posY:a}),!1;if(console.log("[SceneEditor] applyRuntimeTransform: applying (scale always 1)",{scale:{x:t,y:i},position:{x:n,y:a}}),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1),this.mainContainer.position.set(n,a),this.uiContainer.position.set(n,a),e.pivot&&((d=this.mainContainer.pivot)!=null&&d.set)&&((p=this.uiContainer.pivot)!=null&&p.set)){let f=Number((g=(u=e.pivot)==null?void 0:u.x)!=null?g:0),b=Number((m=(h=e.pivot)==null?void 0:h.y)!=null?m:0);Number.isFinite(f)&&Number.isFinite(b)&&(this.mainContainer.pivot.set(f,b),this.uiContainer.pivot.set(f,b))}return typeof e.rotation=="number"&&(this.mainContainer.rotation=e.rotation,this.uiContainer.rotation=e.rotation),!0}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let s=this.getEditableObjectConfig(a);if(!s){this.removeObject(a);continue}await this.upsertObject(a,s)}this.updateGizmos(),this.updateSpawnPointHandles(),this.updateGameFrame(this.getScreen())}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e),a=this.isUiConfig(e,t),s=this.playModeEnabled?this.getRuntimeParentContainer(e):null,l=this.isBackgroundObject(e,t)?this.bgContainer:a?this.uiContainer:this.mainContainer,c=s!=null?s:l;if(!n||n.assetKey!==i||n.isUi!==a){n&&this.removeObject(e);let p=await this.createDisplayObject(e,t);if(!p)return;c.addChild(p),this.objectMap.set(e,{id:e,displayObject:p,assetKey:i,isUi:a}),this.attachObjectInteraction(p,e)}let d=this.objectMap.get(e);d&&(d.displayObject.parent!==c&&c.addChild(d.displayObject),this.applyVisualConfig(d.displayObject,t),(!this.playModeEnabled||!s)&&this.applyTransformFromConfig(e,d.displayObject,t))}async createDisplayObject(e,t){var r,l,c,d,p,u,g,h,m,f,b,y,w,v,T;if((r=t==null?void 0:t.render)!=null&&r.asset)try{if(((c=(l=t==null?void 0:t.render)==null?void 0:l.asset)==null?void 0:c.type)!=="json"){let _=await Me.create(e,t,this.app);if(_ instanceof Ne)return _}}catch(P){console.warn("[SceneEditor] ObjectFactory failed for",e,P)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let P=this.getScreen(),_=(p=P==null?void 0:P.width)!=null?p:0,I=(u=P==null?void 0:P.height)!=null?u:0,j=new ge,L=this.parseColor(n.background_color,0),S=typeof n.background_alpha=="number"?n.background_alpha:1;_>0&&I>0&&j.rect(0,0,_,I).fill({color:L,alpha:S});let x=new Ne;return x.addChild(j),x}if(a){let P=(h=(g=i==null?void 0:i.color)!=null?g:n==null?void 0:n.tint)!=null?h:"#ffffff",_=new No({fontFamily:"Arial, sans-serif",fontSize:(m=i==null?void 0:i.fontSize)!=null?m:16,fill:P,align:(f=i==null?void 0:i.align)!=null?f:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new Ho({text:(y=i==null?void 0:i.text)!=null?y:"",style:_})}if((w=t==null?void 0:t.effects)!=null&&w.width||(v=t==null?void 0:t.effects)!=null&&v.height){let P=new ge,_=typeof t.effects.width=="number"?t.effects.width:100,I=typeof t.effects.height=="number"?t.effects.height:100,j=(T=t.effects.fill_color)!=null?T:"#ffffff",L=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,S=Number.parseInt(String(j).replace("#",""),16);return P.rect(0,0,_,I).fill({color:Number.isFinite(S)?S:16777215,alpha:L}),P}return new Ne}attachObjectInteraction(e,t){if(e&&(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function")){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=new hr(i.x,i.y,i.width,i.height))}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}isUiConfig(e,t){var a,s;let i=(((a=t==null?void 0:t.identity)==null?void 0:a.category)||"").toString().toLowerCase(),n=(((s=t==null?void 0:t.identity)==null?void 0:s.id)||e||"").toString().toLowerCase();return i.includes("ui")||n.startsWith("ui")||n.includes("label")}isBackgroundObject(e,t,i){var s,r;if((i==null?void 0:i.parent)===this.bgContainer)return!0;let n=(((s=t==null?void 0:t.identity)==null?void 0:s.category)||"").toString().toLowerCase(),a=(((r=t==null?void 0:t.identity)==null?void 0:r.id)||e||"").toString().toLowerCase();return!!(n.includes("bg")||n.includes("background")||a.startsWith("background_")||a.includes("background"))}queueBackgroundCoverRetry(e){var i;let t=(i=this.backgroundCoverRetries.get(e))!=null?i:0;t>=10||(this.backgroundCoverRetries.set(e,t+1),this.backgroundCoverRaf==null&&(this.backgroundCoverRaf=requestAnimationFrame(()=>{this.backgroundCoverRaf=null;let n=this.objectMap.get(e),a=this.getEditableObjectConfig(e);!(n!=null&&n.displayObject)||!a||this.applyTransformFromConfig(e,n.displayObject,a)})))}applyVisualConfig(e,t){var a,s,r;if(!e)return;let i=(a=t==null?void 0:t.render)!=null?a:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n={x:.5,y:.5};if((s=e.anchor)!=null&&s.set)e.anchor.set(n.x,n.y);else if(e.pivot){let l=(r=e.getLocalBounds)==null?void 0:r.call(e);l&&e.pivot.set(l.width*n.x,l.height*n.y)}}applyTransformFromConfig(e,t,i){var _,I,j,L,S,x,E,C,A,k,R,M,O,D,N,q,$,H,z,G,Y,V,F,Q;if(!t)return;let n=this.getScreen();if(!(n!=null&&n.width)||!(n!=null&&n.height))return;let a=(_=i==null?void 0:i.transform)!=null?_:{},s=this.getPositioningAnchor(e,a),r=a==null?void 0:a.position_ratio,l=a==null?void 0:a.position,c=a==null?void 0:a.offset,d=Array.isArray(l)?Number((I=l[0])!=null?I:0):Number((j=l==null?void 0:l.x)!=null?j:0),p=Array.isArray(l)?Number((L=l[1])!=null?L:0):Number((S=l==null?void 0:l.y)!=null?S:0),u=Array.isArray(c)?Number((x=c[0])!=null?x:0):Number((E=c==null?void 0:c.x)!=null?E:0),g=Array.isArray(c)?Number((C=c[1])!=null?C:0):Number((A=c==null?void 0:c.y)!=null?A:0),h=(Number.isFinite(d)?d:0)+(Number.isFinite(u)?u:0),m=(Number.isFinite(p)?p:0)+(Number.isFinite(g)?g:0);if(this.backgroundCoverEnabled&&this.isBackgroundObject(e,i,t)){let W=Number((R=(k=t==null?void 0:t.texture)==null?void 0:k.width)!=null?R:0),K=Number((O=(M=t==null?void 0:t.texture)==null?void 0:M.height)!=null?O:0),X=(D=t==null?void 0:t.getLocalBounds)==null?void 0:D.call(t),de=Number((N=X==null?void 0:X.width)!=null?N:0),ee=Number((q=X==null?void 0:X.height)!=null?q:0),we=Number(($=X==null?void 0:X.x)!=null?$:0),J=Number((H=X==null?void 0:X.y)!=null?H:0);if((!Number.isFinite(W)||W<=0||!Number.isFinite(K)||K<=0)&&(W=de,K=ee),!Number.isFinite(W)||W<=0||!Number.isFinite(K)||K<=0){this.queueBackgroundCoverRetry(e);return}if((z=t.anchor)!=null&&z.set)t.anchor.set(.5,.5);else if((G=t.pivot)!=null&&G.set){let Re=Number.isFinite(de)&&de>0?we+de*.5:W*.5,Kt=Number.isFinite(ee)&&ee>0?J+ee*.5:K*.5;t.pivot.set(Re,Kt)}(Y=t.position)!=null&&Y.set?t.position.set(n.width/2,n.height/2):t.position&&(t.position.x=n.width/2,t.position.y=n.height/2);let le=n.width/W,ie=n.height/K,se=Math.max(le,ie);(V=t.scale)!=null&&V.set?t.scale.set(se,se):t.scale&&(t.scale.x=se,t.scale.y=se);let Ae=typeof(a==null?void 0:a.rotation)=="number"?a.rotation:0;t.rotation=this.toRadians(Ae);return}let f=r!=null?De(n.width,n.height,r):Se(n.width,n.height,s),b=this.getRuntimeScale(),y=(f.x-n.width/2)/b+h,w=(f.y-n.height/2)/b+m;(F=t.position)!=null&&F.set?t.position.set(y,w):t.position&&(t.position.x=y,t.position.y=w);let T=(typeof(a==null?void 0:a.scale)=="number"?a.scale:1)*this.getRuntimeScale();(Q=t.scale)!=null&&Q.set?t.scale.set(T,T):t.scale&&(t.scale.x=T,t.scale.y=T);let P=typeof(a==null?void 0:a.rotation)=="number"?a.rotation:0;t.rotation=this.toRadians(P)}getAnchorLocalPoint(e,t=this.mainContainer){var d;let i=(d=this.getRuntimeScreenSize())!=null?d:this.getScreen();if(!(i!=null&&i.width)||!(i!=null&&i.height))return null;let n="top-right",a=this.getPositioningAnchor(this.selectedId,e!=null?e:{}),s=(e==null?void 0:e.position_ratio)!=null?De(i.width,i.height,e.position_ratio):Se(i.width,i.height,a!=null?a:n);if(t===this.bgContainer)return new U(s.x,s.y);let r=this.getRuntimeScale(),l=(s.x-i.width/2)/r,c=(s.y-i.height/2)/r;return new U(l,c)}getPositioningAnchor(e,t){var i,n,a,s,r,l,c,d,p,u;if((t==null?void 0:t.anchor)!=null&&t.anchor!=="")return t.anchor;if(typeof window!="undefined"&&e){let g=window,h=g.__editableConfig,m=(n=(i=h==null?void 0:h.objects)==null?void 0:i.get)==null?void 0:n.call(i,e),f=(r=(a=m==null?void 0:m.transform)==null?void 0:a.anchor)!=null?r:(s=m==null?void 0:m.render)==null?void 0:s.anchor;if(f!=null&&f!=="")return f;let b=g.__editableConfigBaseline,y=(c=(l=b==null?void 0:b.objects)==null?void 0:l.get)==null?void 0:c.call(l,e),w=(u=(d=y==null?void 0:y.transform)==null?void 0:d.anchor)!=null?u:(p=y==null?void 0:y.render)==null?void 0:p.anchor;if(w!=null&&w!=="")return w}return"top-left"}getActiveScreenSize(e){var t,i;return this.playModeEnabled?(i=(t=this.getRuntimeScreenSize())!=null?t:e)!=null?i:this.getScreen():e!=null?e:this.getScreen()}updateLayout(e){var i,n,a,s,r,l,c,d,p;let t=this.getActiveScreenSize(e);if(!(!(t!=null&&t.width)||!(t!=null&&t.height))){if(console.log("[SceneEditor] updateLayout: called",{screen:{width:t.width,height:t.height},currentScale:{x:this.mainContainer.scale.x,y:this.mainContainer.scale.y}}),this.playModeEnabled){let u=this.getRuntimeLayoutReference();if(u){let g=Number((n=(i=u.position)==null?void 0:i.x)!=null?n:t.width/2),h=Number((s=(a=u.position)==null?void 0:a.y)!=null?s:t.height/2);this.mainContainer.position.set(g,h),this.uiContainer.position.set(g,h);let m=Number((l=(r=u.scale)==null?void 0:r.x)!=null?l:1);Number.isFinite(m)&&m>0&&(this.layoutScale=m)}this.bgContainer.position.set(0,0),this.bgContainer.scale.set(1,1),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1)}else this.bgContainer.position.set(0,0),this.bgContainer.scale.set(1,1),this.mainContainer.position.set(t.width/2,t.height/2),this.uiContainer.position.set(t.width/2,t.height/2),this.mainContainer.scale.set(1,1),this.uiContainer.scale.set(1,1),this.mainContainer.rotation=0,this.uiContainer.rotation=0,(c=this.mainContainer.pivot)!=null&&c.set&&this.mainContainer.pivot.set(0,0),(d=this.uiContainer.pivot)!=null&&d.set&&this.uiContainer.pivot.set(0,0);console.log("[SceneEditor] updateLayout: result",{finalScale:{x:this.mainContainer.scale.x,y:this.mainContainer.scale.y},position:{x:this.mainContainer.position.x,y:this.mainContainer.position.y}}),this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),this.updateGameFrame(t),(p=this.app)!=null&&p.stage&&(this.app.stage.hitArea=new hr(0,0,this.app.renderer.width,this.app.renderer.height)),this.updateSpawnPointHandles()}}updateGrid(){if(!this.app)return;if(!this.gridEnabled){this.gridLayer.clear(),this.gridLayer.visible=!0;return}let e=Math.max(4,this.gridGap),t=this.app.renderer,i=this.camera.toLocal(new U(0,0)),n=this.camera.toLocal(new U(t.width,t.height)),a=Math.min(i.x,n.x),s=Math.max(i.x,n.x),r=Math.min(i.y,n.y),l=Math.max(i.y,n.y),c=400,d=Math.ceil((s-a)/e),p=Math.ceil((l-r)/e),u=e*Math.max(1,Math.ceil(d/c)),g=e*Math.max(1,Math.ceil(p/c)),h=Math.floor(a/u)*u,m=Math.floor(r/g)*g;this.gridLayer.clear(),this.gridLayer.visible=!0;for(let f=h;f<=s;f+=u)this.gridLayer.moveTo(f,r),this.gridLayer.lineTo(f,l);for(let f=m;f<=l;f+=g)this.gridLayer.moveTo(a,f),this.gridLayer.lineTo(s,f);this.gridLayer.stroke({width:1,color:16777215,alpha:this.gridAlpha})}updateGameFrame(e){let t=this.getActiveScreenSize(e);if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let i=t.width,n=t.height,a=0,s=0;this.lastGameFrameSize&&this.lastGameFrameSize.width===t.width&&this.lastGameFrameSize.height===t.height||(this.lastGameFrameSize={width:t.width,height:t.height},this.gameFrame.clear(),this.gameFrame.rect(a,s,i,n),this.gameFrame.stroke({width:2,color:6333946,alpha:.35}))}syncFromGameObjectsInternal(){var i,n,a,s,r,l,c,d,p;if(!this.app||!this.isVisible)return;let e=window.gameObjectManager;if(!(e!=null&&e.get))return;let t=this.dragMode||this.selectedId&&performance.now()<this.dragSyncHoldUntil?this.selectedId:null;for(let[u,g]of this.objectMap.entries()){if(t&&u===t)continue;let h=e.get(u),m=((i=h==null?void 0:h.getDisplayObject)==null?void 0:i.call(h))||(h==null?void 0:h.pixiObject)||h;if(!m)continue;let f=(a=(n=g.displayObject)==null?void 0:n.parent)!=null?a:this.mainContainer,b=new U;if(typeof m.getGlobalPosition=="function"){m.getGlobalPosition(b);let P=f.toLocal(b,this.camera);g.displayObject.position.set(P.x,P.y)}else if(m.worldTransform){b.set(m.worldTransform.tx,m.worldTransform.ty);let P=f.toLocal(b,this.camera);g.displayObject.position.set(P.x,P.y)}let y=this.getWorldScale(m);if(y){let P=Number((r=(s=f.scale)==null?void 0:s.x)!=null?r:1)||1,_=Number((c=(l=f.scale)==null?void 0:l.y)!=null?c:1)||1,I=y.x/P,j=y.y/_;(d=g.displayObject.scale)!=null&&d.set?g.displayObject.scale.set(I,j):g.displayObject.scale&&(g.displayObject.scale.x=I,g.displayObject.scale.y=j)}let w=this.getWorldRotation(m);if(typeof w=="number"){let P=f?f.rotation:0,_=w-P;g.displayObject.rotation=_;let I=this.getEditableObjectConfig(u);if(I){let j=(p=I.transform)!=null?p:{};I.transform||(I.transform=j);let L=this.toDegrees(_),S=typeof j.rotation=="number"?j.rotation:0;if(Math.abs(L-S)>.01){let x=Math.round(L*100)/100;j.rotation=x}}}let v=m.parent,T=typeof(v==null?void 0:v.getChildIndex)=="function"?v.getChildIndex(m):0;typeof m.zIndex=="number"?g.displayObject.zIndex=m.zIndex:Number.isFinite(T)&&(g.displayObject.zIndex=T)}this.updateGizmos()}getWorldScale(e){var a,s;let t=(s=e==null?void 0:e.worldTransform)!=null?s:(a=e==null?void 0:e.transform)==null?void 0:a.worldTransform;if(!t)return null;let i=Math.sqrt(t.a*t.a+t.b*t.b),n=Math.sqrt(t.c*t.c+t.d*t.d);return!Number.isFinite(i)||!Number.isFinite(n)?null:{x:i,y:n}}getWorldRotation(e){var i,n;let t=(n=e==null?void 0:e.worldTransform)!=null?n:(i=e==null?void 0:e.transform)==null?void 0:i.worldTransform;if(t){let a=Math.atan2(t.b,t.a);return Number.isFinite(a)?a:null}return typeof(e==null?void 0:e.rotation)=="number"?e.rotation:null}centerCamera(){if(!this.app)return;let e=this.getActiveScreenSize();if(!(e!=null&&e.width)||!(e!=null&&e.height))return;let t=this.app.renderer.width,i=this.app.renderer.height,n=Math.max(.01,Math.min(t/e.width,i/e.height));this.cameraScale=n,this.camera.scale.set(n),this.camera.position.set((t-e.width*n)/2,(i-e.height*n)/2)}updateGizmos(){var m,f,b,y,w,v;if(!this.selectedId&&this.selectedIds.size===0||!this.isVisible){this.clearGizmos();return}if(this.selectedIds.size>1){let T=1/0,P=1/0,_=-1/0,I=-1/0,j=!1;for(let L of this.selectedIds){let S=this.objectMap.get(L);if(!(S!=null&&S.displayObject))continue;let x=(f=(m=S.displayObject).getBounds)==null?void 0:f.call(m);if(!x||x.width<=0||x.height<=0)continue;let E=this.camera.toLocal(new U(x.x,x.y)),C=this.camera.toLocal(new U(x.x+x.width,x.y+x.height));T=Math.min(T,E.x,C.x),P=Math.min(P,E.y,C.y),_=Math.max(_,E.x,C.x),I=Math.max(I,E.y,C.y),j=!0}if(j){let L=_-T,S=I-P,x=T+L/2,E=P+S/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(T,P,L,S),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});for(let k of this.selectedIds){let R=this.objectMap.get(k);if(!(R!=null&&R.displayObject))continue;let M=(y=(b=R.displayObject).getBounds)==null?void 0:y.call(b);if(!M||M.width<=0||M.height<=0)continue;let O=this.camera.toLocal(new U(M.x,M.y)),D=this.camera.toLocal(new U(M.x+M.width,M.y+M.height)),N=D.x-O.x,q=D.y-O.y;this.gizmoOutline.rect(O.x,O.y,N,q),this.gizmoOutline.stroke({width:1,color:16752394,alpha:.5})}let C=7,A={width:2,color:988970,alpha:.6};this.moveHandle.clear(),this.moveHandle.circle(x,E,C).fill({color:2278750,alpha:.95}),this.moveHandle.stroke(A),this.moveHandle.cursor="move",this.scaleHandle.clear(),this.rotateHandle.clear()}else this.clearGizmos();return}if(!this.selectedId){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(v=(w=e.displayObject).getBounds)==null?void 0:v.call(w);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new U(t.x,t.y)),n=this.camera.toLocal(new U(t.x+t.width,t.y+t.height)),a=n.x-i.x,s=n.y-i.y,r=i.x+a/2,l=i.y+s/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,s),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});let c=7,d={width:2,color:988970,alpha:.6};this.moveHandle.clear(),this.moveHandle.circle(r,l,c).fill({color:2278750,alpha:.95}),this.moveHandle.stroke(d),this.moveHandle.cursor="move";let p=i.x+a,u=i.y+s;this.scaleHandle.clear(),this.scaleHandle.rect(p-c,u-c,c*2,c*2).fill({color:3718648,alpha:.95}),this.scaleHandle.stroke(d),this.scaleHandle.cursor="nwse-resize";let g=r,h=i.y-c*2;this.rotateHandle.clear(),this.rotateHandle.circle(g,h,c).fill({color:16347926,alpha:.95}),this.rotateHandle.stroke(d),this.rotateHandle.cursor="crosshair"}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}updateSpawnPointHandles(){if(this.clearSpawnPointHandles(),!this.selectedId)return;let e=this.getEditableObjectConfig(this.selectedId);if(!e||!this.isSpawnerConfig(e))return;let t=this.getSpawnPoints(e);!t||t.length===0||t.forEach((i,n)=>{let a=new ge;a.circle(0,0,5).fill({color:16096779,alpha:.9}),a.circle(0,0,9).stroke({width:1,color:16096779,alpha:.45});let s=this.toCameraFromMain(i);a.position.set(s.x,s.y),a.cursor="move",a.eventMode="static",a.on("pointerdown",r=>this.startSpawnPointDrag(n,r)),this.spawnPointLayer.addChild(a)})}clearSpawnPointHandles(){this.spawnPointLayer.removeChildren().forEach(t=>{var i;(i=t.destroy)==null||i.call(t)})}isSpawnerConfig(e){var i,n;return((i=e==null?void 0:e.logic)==null?void 0:i.id)==="Spawner"?!0:String(((n=e==null?void 0:e.identity)==null?void 0:n.system_role)||"").toLowerCase().includes("spawner")}getSpawnPoints(e){var i,n;let t=(n=(i=e==null?void 0:e.logic)==null?void 0:i.props)==null?void 0:n.spawnPoints;return Array.isArray(t)?t.map(a=>{var s,r;return{x:Number((s=a==null?void 0:a.x)!=null?s:0),y:Number((r=a==null?void 0:a.y)!=null?r:0)}}):null}toCameraFromMain(e){let t=this.mainContainer.toGlobal(new U(e.x,e.y)),i=new U;return this.camera.toLocal(t,void 0,i),i}startSpawnPointDrag(e,t){var r,l;if(!this.selectedId)return;let i=this.getEditableObjectConfig(this.selectedId);if(!i)return;let n=this.getSpawnPoints(i);if(!n||!n[e])return;(r=t==null?void 0:t.stopPropagation)==null||r.call(t),(l=t==null?void 0:t.stopImmediatePropagation)==null||l.call(t);let a=this.getEventLocalPoint(t,this.mainContainer);if(!a)return;let s=n[e];this.spawnPointDrag={objectId:this.selectedId,index:e,offset:new U(s.x-a.x,s.y-a.y),startPoints:n.map(c=>({x:c.x,y:c.y}))},window.addEventListener("pointermove",this.onSpawnPointDragMove),window.addEventListener("pointerup",this.onSpawnPointDragEnd)}updateLiveSpawnPoint(e,t,i,n){let a=this.getEditableObjectConfig(e);if(!a)return;let s=this.getSpawnPoints(a);if(!s||!s[t])return;let r=s.map((l,c)=>c===t?{x:i,y:n}:{x:l.x,y:l.y});this.setNestedValue(a,"logic.props.spawnPoints",r),this.queueLiveApply(e),this.updateSpawnPointHandles()}setSelected(e,t={}){if(!(this.selectedId===e&&this.selectedIds.size===1&&this.selectedIds.has(e||""))&&(this.selectedId=e,e?(this.selectedIds.clear(),this.selectedIds.add(e)):this.selectedIds.clear(),this.updateGizmos(),this.updateSpawnPointHandles(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var d,p,u,g,h,m,f;if(!this.selectedId)return;let i=this.objectMap.get(this.selectedId);if(!(i!=null&&i.displayObject))return;let n=this.getEditableObjectConfig(this.selectedId);if(!n||this.backgroundLocked&&this.isBackgroundObject(this.selectedId,n,i.displayObject))return;let a=(d=n.transform)!=null?d:{},s=(p=i.displayObject.parent)!=null?p:this.mainContainer,r=this.getEventLocalPoint(t,s);if(!r)return;(u=t==null?void 0:t.stopPropagation)==null||u.call(t),(g=t==null?void 0:t.stopImmediatePropagation)==null||g.call(t);let l=this.getPositioningAnchor(this.selectedId,a);(a.anchor==null||a.anchor==="")&&this.updateManager.updateProperty(this.selectedId,"transform.anchor",l),(((h=n==null?void 0:n.render)==null?void 0:h.anchor)==null||n.render.anchor==="")&&this.updateManager.updateProperty(this.selectedId,"render.anchor",l),this.dragMode=e,this.dragContainer=s,this.dragStartPointer=new U(r.x,r.y),this.dragStartPos=new U(i.displayObject.position.x,i.displayObject.position.y),this.dragLastPointer=new U(r.x,r.y),this.dragPointerOffset=new U(i.displayObject.position.x-r.x,i.displayObject.position.y-r.y),this.dragLogged=!1;let c=(m=this.getRuntimeScreenSize())!=null?m:this.getScreen();console.log("[SceneEditor][DragStart]",{objectId:this.selectedId,mode:e,isBackground:this.isBackgroundObject(this.selectedId,n,i.displayObject),screen:c,runtimeScale:this.getRuntimeScale(),pointer:{x:r.x,y:r.y},objectPos:{x:i.displayObject.position.x,y:i.displayObject.position.y},container:s===this.bgContainer?"bg":s===this.uiContainer?"ui":"main"}),this.dragStartScale=typeof((f=i.displayObject.scale)==null?void 0:f.x)=="number"?i.displayObject.scale.x:1,this.dragStartRotation=typeof i.displayObject.rotation=="number"?i.displayObject.rotation:0,this.dragAnchorLocal=this.getAnchorLocalPoint(a,s),this.dragStartValue=this.getDragStartValue(e,a),this.dragAnchorLocal&&(this.dragStartAngle=Math.atan2(r.y-this.dragAnchorLocal.y,r.x-this.dragAnchorLocal.x),this.dragStartDistance=Math.max(1,this.distance(r,this.dragAnchorLocal))),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPositionForObject(e,t,i){var T,P,_,I,j,L,S,x;let n=this.getEditableObjectConfig(e);if(!n)return;let a=(T=n.transform)!=null?T:{};n.transform||(n.transform=a);let s=(P=this.getRuntimeScreenSize())!=null?P:this.getScreen();if(!(s!=null&&s.width)||!(s!=null&&s.height))return;let r=this.objectMap.get(e),l=((_=r==null?void 0:r.displayObject)==null?void 0:_.parent)===this.bgContainer,c=this.getPositioningAnchor(e,a),d=(a==null?void 0:a.position_ratio)!=null?De(s.width,s.height,a.position_ratio):Se(s.width,s.height,c),p=d.x,u=d.y,g=t,h=i;if(!l){let E=this.getRuntimeScale();p=(d.x-s.width/2)/E,u=(d.y-s.height/2)/E,g=t/E,h=i/E}let m=g-p,f=h-u,b=(I=a.offset)!=null?I:{x:0,y:0},y=Array.isArray(b)?Number((j=b[0])!=null?j:0):Number((L=b==null?void 0:b.x)!=null?L:0),w=Array.isArray(b)?Number((S=b[1])!=null?S:0):Number((x=b==null?void 0:b.y)!=null?x:0),v=this.buildPositionValue(a,{x:m-y,y:f-w});this.updateManager.updateProperty(e,"transform.position",v,{refreshInspector:!0})}updateLiveConfigPosition(e,t){this.selectedId&&this.updateLiveConfigPositionForObject(this.selectedId,e,t)}updateLiveConfigScale(e){var a;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(a=t.transform)!=null?a:{};t.transform||(t.transform=i);let n=Math.round(e*100)/100;this.updateManager.updateProperty(this.selectedId,"transform.scale",n,{refreshInspector:!0})}updateLiveConfigRotation(e){var s;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(s=t.transform)!=null?s:{};t.transform||(t.transform=i);let n=this.toDegrees(e),a=typeof i.rotation=="number"?i.rotation:0;if(Math.abs(n-a)>.01){let r=Math.round(n*100)/100;this.updateManager.updateProperty(this.selectedId,"transform.rotation",r,{refreshInspector:!0})}}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),qe({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&(n(t,i),window.dispatchEvent(new CustomEvent("inspector:refresh")))}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let s=0;s<n.length-1;s+=1){let r=n[s];(!a[r]||typeof a[r]!="object")&&(a[r]={}),a=a[r]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position,n=Math.round(t.x*100)/100,a=Math.round(t.y*100)/100;return Array.isArray(i)?[n,a]:{x:n,y:a}}toRadians(e){return e*Math.PI/180}toDegrees(e){return e*180/Math.PI}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerButton(e){var t,i,n;return typeof(e==null?void 0:e.button)=="number"?e.button:typeof((t=e==null?void 0:e.data)==null?void 0:t.button)=="number"?e.data.button:typeof((n=(i=e==null?void 0:e.data)==null?void 0:i.originalEvent)==null?void 0:n.button)=="number"?e.data.originalEvent.button:0}getEventGlobalPoint(e){var l,c;let t=(c=e==null?void 0:e.global)!=null?c:(l=e==null?void 0:e.data)==null?void 0:l.global;if(t)return new U(t.x,t.y);if(!this.app)return null;let i=e==null?void 0:e.clientX,n=e==null?void 0:e.clientY;if(typeof i!="number"||typeof n!="number")return null;let a=this.app.canvas.getBoundingClientRect(),s=(i-a.left)*(this.app.renderer.width/a.width),r=(n-a.top)*(this.app.renderer.height/a.height);return new U(s,r)}getEventLocalPoint(e,t=this.mainContainer){var a,s;if(!this.app)return null;if(typeof(e==null?void 0:e.getLocalPosition)=="function"){let r=e.getLocalPosition(t);return new U(r.x,r.y)}let i=(s=e==null?void 0:e.global)!=null?s:(a=e==null?void 0:e.data)==null?void 0:a.global;if(!i)return null;let n=new U;return t.toLocal(new U(i.x,i.y),void 0,n),n}getPointerInContainer(e,t,i){if(!this.app)return null;let n=this.app.canvas.getBoundingClientRect(),a=(e-n.left)*(this.app.renderer.width/n.width),s=(t-n.top)*(this.app.renderer.height/n.height),r=new U;return i.toLocal(new U(a,s),void 0,r),r}parseColor(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let i=e.trim().replace("#",""),n=Number.parseInt(i,16);if(Number.isFinite(n))return n}return t}drawSelectionBox(e,t){if(!this.selectionBox)return;this.selectionBox.clear();let i=Math.min(e.x,t.x),n=Math.max(e.x,t.x),a=Math.min(e.y,t.y),s=Math.max(e.y,t.y),r=n-i,l=s-a;this.selectionBox.rect(i,a,r,l),this.selectionBox.stroke({width:2,color:3900150,alpha:.8}),this.selectionBox.rect(i,a,r,l),this.selectionBox.fill({color:3900150,alpha:.1})}finalizeSelectionBox(e,t){var l;let i=Math.min(e.x,t.x),n=Math.max(e.x,t.x),a=Math.min(e.y,t.y),s=Math.max(e.y,t.y),r=[];for(let[c,d]of this.objectMap.entries()){let p=d.displayObject;if(!p||p.visible===!1||this.backgroundLocked&&this.isBackgroundObject(c,this.getEditableObjectConfig(c),p))continue;let u=(l=p.getBounds)==null?void 0:l.call(p);if(!u||u.width<=0||u.height<=0)continue;let g=u.x+u.width/2,h=u.y+u.height/2;g>=i&&g<=n&&h>=a&&h<=s&&r.push(c)}r.length>0&&(this.selectedIds=new Set(r),this.selectedId=r[0],this.updateGizmos())}setupDragAndDrop(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("dragover",t=>{t.preventDefault(),t.stopPropagation(),this.dropZoneActive||(this.dropZoneActive=!0,this.showDropZone())}),e.addEventListener("dragleave",t=>{e.contains(t.relatedTarget)||(this.dropZoneActive=!1,this.hideDropZone())}),e.addEventListener("drop",async t=>{var d;t.preventDefault(),t.stopPropagation(),this.dropZoneActive=!1,this.hideDropZone();let n=Array.from(((d=t.dataTransfer)==null?void 0:d.files)||[]).filter(p=>p.type.startsWith("image/"));if(n.length===0)return;let a=e.getBoundingClientRect(),s=t.clientX-a.left,r=t.clientY-a.top,l=new U(s/a.width*this.app.renderer.width,r/a.height*this.app.renderer.height),c=this.camera.toLocal(l);await this.handleDroppedPNGs(n,c)})}showDropZone(){if(!this.dropZoneOverlay||!this.app)return;let e=this.camera.toLocal(new U(0,0)),t=this.camera.toLocal(new U(this.app.renderer.width,this.app.renderer.height)),i=t.x-e.x,n=t.y-e.y;this.dropZoneOverlay.clear(),this.dropZoneOverlay.rect(e.x,e.y,i,n),this.dropZoneOverlay.fill({color:3900150,alpha:.1}),this.dropZoneOverlay.rect(e.x,e.y,i,n),this.dropZoneOverlay.stroke({width:3,color:3900150,alpha:.6}),this.dropZoneOverlay.visible=!0}hideDropZone(){this.dropZoneOverlay&&(this.dropZoneOverlay.clear(),this.dropZoneOverlay.visible=!1)}async handleDroppedPNGs(e,t){let i=window.__HANDLER_ACTIVE_SCREEN,n=i==="loading"||i==="start"||i==="gameplay"||i==="tutorial"||i==="endgame"?i:"gameplay",a=this.showToast(`Processing ${e.length} PNG${e.length>1?"s":""}...`);try{for(let s=0;s<e.length;s++){let r=e[s];await this.processDroppedPNG(r,t,n,s)}this.hideToast(a),this.showToast(`\u2705 Added ${e.length} PNG${e.length>1?"s":""} to scene`,2e3),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh"))}catch(s){this.hideToast(a),this.showToast(`\u274C Error: ${s instanceof Error?s.message:String(s)}`,3e3),console.error("[SceneEditor] Failed to process dropped PNGs:",s)}}async processDroppedPNG(e,t,i,n){let a=await this.fileToDataUrl(e);if(!a)throw new Error(`Failed to read ${e.name}`);let s=e.name.replace(/\.[^/.]+$/,""),r=this.inferCategoryFromFilename(s),l=s.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"").toLowerCase(),c=`${l}_${Date.now()}${n>0?`_${n}`:""}`,d=`json.${c}`,p=`${l}.png`,g=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:r,filename:p,data:a,overwrite:!1})})).json();if(!g.success)throw new Error(`Failed to save ${e.name} to library: ${g.error}`);let h=this.getScreen(),m=this.getRuntimeScale(),f=(t.x-h.width/2)/m,b=(t.y-h.height/2)/m,y={identity:{id:d,category:r},transform:{anchor:"center",position:{x:f,y:b},scale:1,rotation:0},render:{z_index:0,alpha:1,visible:!0,anchor:{x:.5,y:.5},asset:{type:"image",path:g.path||`raw/library/${r}/${p}`}}},w=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:c,objectConfigId:d,config:y,layer:r==="ui"?"ui":"world"})}),v=await w.json();if(!w.ok||!v.success)throw new Error(`Failed to create object: ${v.error||"Unknown error"}`)}inferCategoryFromFilename(e){let t=e.toLowerCase();return t.startsWith("ui_")||t.includes("button")||t.includes("label")?"ui":t.startsWith("bg_")||t.includes("background")?"backgrounds":t.includes("character")||t.includes("player")?"character":"environment"}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}showToast(e,t=3e3){let i=document.createElement("div");return i.style.cssText=`
2273
2273
  position: fixed;
2274
2274
  top: 20px;
2275
2275
  right: 20px;
@@ -2291,7 +2291,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2291
2291
  <div class="preview-toolbar-center">
2292
2292
  <div class="device-selector-wrapper">
2293
2293
  <select class="device-dropdown" id="device-select">
2294
- ${As.map(i=>`
2294
+ ${Cs.map(i=>`
2295
2295
  <optgroup label="${i.label}">
2296
2296
  ${i.devices.map(n=>`
2297
2297
  <option value="${n.id}" ${n.id===this.currentPreset.id?"selected":""}>
@@ -2477,7 +2477,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2477
2477
  -->
2478
2478
 
2479
2479
  </div>
2480
- `,this.setupEventListeners(e),e}setupEventListeners(e){var w,v,T,P,_,I,j;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",L=>{if(this.viewMode==="compare")return;let S=L.target.value;this.setDevice(S)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",L=>{let S=L.target.value;this.setTheme(S)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(L=>{L.addEventListener("click",()=>{let S=L.dataset.viewToggle;S&&this.setViewMode(S)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(L=>{L.addEventListener("click",()=>{let S=L.dataset.layoutToggle;S&&this.setLayoutMode(S)})});let s=e.querySelector("#scene-toggle");s==null||s.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let r=e.querySelector("#scene-hide-btn");r==null||r.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())});let l=L=>{let S=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${L}::${S}`},c=e.querySelector("#scene-grid-btn"),d=e.querySelector("#scene-play-btn"),p=(L,S,x)=>{L&&(L.textContent=S?`${x} On`:`${x} Off`,L.setAttribute("aria-pressed",S?"true":"false"))},u=()=>{let L=window.localStorage.getItem(l("grid_gap")),S=Number(L!=null?L:50);return Number.isFinite(S)?S:50},g=L=>{try{window.localStorage.setItem(l("grid_enabled"),L?"true":"false")}catch{}p(c,L,"Grid");let S=u();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:L,gap:S}}))},h=L=>{try{window.localStorage.setItem(l("play_mode"),L?"true":"false")}catch{}p(d,L,"Play"),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:L}}))};try{let L=window.localStorage.getItem(l("grid_enabled"))==="true",S=!0;try{window.localStorage.setItem(l("play_mode"),"true")}catch{}if(p(c,L,"Grid"),p(d,S,"Play"),d&&(d.disabled=!0),c){let x=u();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:L,gap:x}}))}d&&window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:S}}))}catch{}c==null||c.addEventListener("click",()=>{let L=c.getAttribute("aria-pressed")==="true";g(!L)}),d==null||d.addEventListener("click",()=>{let L=d.getAttribute("aria-pressed")==="true";h(!L)}),(w=e.querySelector("#rotate-btn"))==null||w.addEventListener("click",()=>this.toggleRotation()),(v=e.querySelector("#zoom-in-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(.1)),(T=e.querySelector("#zoom-out-btn"))==null||T.addEventListener("click",()=>this.adjustUserZoom(-.1)),(P=e.querySelector("#refresh-btn"))==null||P.addEventListener("click",()=>this.refresh()),(_=e.querySelector("#corner-zoom-in-btn"))==null||_.addEventListener("click",()=>this.adjustUserZoom(.1)),(I=e.querySelector("#corner-zoom-out-btn"))==null||I.addEventListener("click",()=>this.adjustUserZoom(-.1)),(j=e.querySelector("#corner-grab-btn"))==null||j.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let m=e.querySelector(".scene-panel.scene-objects"),f=m==null?void 0:m.querySelector("[data-panel-resize-v]");m&&f&&this.makeSidebarResizable(m,f,"left");let b=e.querySelector(".debug-workbench"),y=b==null?void 0:b.querySelector("#workbench-resize-v");b&&y&&this.makeSidebarResizable(b,y,"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,r=a/t.height;if(this.autoScale=Math.max(.01,Math.min(s,r)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}(e==null?void 0:e.keepUserScaleMultiplier)!==void 0&&e.keepUserScaleMultiplier>0?this.userScaleMultiplier=e.keepUserScaleMultiplier:e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.gameViewPane||this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),Ba();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),Ga();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=rt().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.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier: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(r=>r.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;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]"),r=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||!r||!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:r,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,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((r,l)=>{r.root.classList.toggle("is-active",l===e),r.ghost.classList.toggle("hidden",l===e),r.focus&&(r.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,r=Math.max(.01,Math.min(a,s));e.wrapper.style.transform=`scale(${r})`})}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,r=Math.min(a/i.width,s/i.height),l=i.width*r,c=i.height*r,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"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.clientHeight-40}}let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function mr(o={}){let e=new Yn(o);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}function Wn(o){try{if(o&&typeof o.keys=="function")return Array.from(o.keys())}catch{}return[]}function fr(o){var e;return o?((e=o.getDisplayObject)==null?void 0:e.call(o))||o.pixiObject||o:null}function Fo(o,e){if(!o||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);o.eventMode=i?"static":"none",o.interactive=i,i&&(o.cursor=t.draggable?"move":"pointer")}function br(o,e){var d,p,u;if(!o||!e)return;let t=e.transform||{};Fo(o,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),r=333,l=111;a+=r,s+=l,console.log("[DEBUG FALLBACK] tryApplyTransform (live-edit) position.set",a,s,"(raw + 333, +111)"),(d=o.position)!=null&&d.set?o.position.set(a,s):(typeof o.x=="number"&&(o.x=a),typeof o.y=="number"&&(o.y=s)),typeof t.scale=="number"&&((p=o.scale)!=null&&p.set?o.scale.set(t.scale):o.scale&&(o.scale.x=t.scale,o.scale.y=t.scale));let c=t.anchor;if(c&&((u=o.anchor)!=null&&u.set)){let g=null;typeof window!="undefined"&&window.resolveAnchorVec2?g=window.resolveAnchorVec2(c):typeof c=="object"&&c.x!==void 0&&c.y!==void 0?g=c:Array.isArray(c)&&c.length===2&&(g={x:c[0],y:c[1]}),g&&typeof g.x=="number"&&typeof g.y=="number"&&o.anchor.set(g.x,g.y)}}function yr(o){if(typeof window=="undefined")return;let e=o==null?void 0:o.objects,t=Wn(e),i=a=>{var s;try{let r=window.__HANDLER_ACTIVE_SCREEN;if(!r||r==="all")return a;let l=window.__HANDLER_SCREEN_INDEX,c=(s=l==null?void 0:l.screenToInstances)==null?void 0:s[r];if(Array.isArray(c)&&c.length>0){let p=new Set(c);return a.filter(u=>p.has(u))}let d=l==null?void 0:l.instanceToScreen;return d?a.filter(p=>d[p]===r):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>yr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Wn((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Wn((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var p,u,g,h,m,f;let s=(h=(g=(u=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:u.get)==null?void 0:g.call(u,a))!=null?h:null,r=window.__HANDLER_ACTIVE_SCREEN;if(!r||r==="all")return s;let l=window.__HANDLER_SCREEN_INDEX,c=(m=l==null?void 0:l.screenToInstances)==null?void 0:m[r];if(Array.isArray(c))return c.includes(a)?s:null;let d=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[a];return d&&d===r?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 Bo(){if(typeof window=="undefined")return;let o=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,r;let n=o(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),d=Date.now(),p=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),u=await l.load(p);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let h=window.gameObjectManager,m=(s=h==null?void 0:h.get)==null?void 0:s.call(h,t);if(m){let f=((r=m.getDisplayObject)==null?void 0:r.call(m))||m.pixiObject||m.pixi||m;if(f!=null&&f.texture)f.texture=u;else if(f!=null&&f.children){let b=f.children.find(y=>y==null?void 0:y.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=rn();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Jt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=rn();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Jt(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&&Jt(n,{silent:!0,persist:!0,emitEvent:!0})}}function Kn(o){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=o;t&&(t.onObjectRebuildRequired=async(a,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let r=t.get(a),l=r==null?void 0:r.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);r?t.remove(a):l&&l.destroy();let p=window.gameApp,u=await Me.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"&&(Bo(),window.applyEditableObjectConfig=(a,s)=>{var r,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(r=d==null?void 0:d.objects)!=null&&r.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=fr(p);br(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 r=e();(d=r==null?void 0:r.objects)!=null&&d.set&&(r.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=fr(l);br(u,s)}let c=[a];i==null||i(a,s,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,yr(a))}};return n.rebuildIndexes(),n}import Go from"lottie-web";Zn(Ss);typeof window!="undefined"&&!window.lottie&&(window.lottie=Go);var ft=null,Uo=async()=>{if(!ft){let o=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(o==null?void 0:o["handler.config"])||(o==null?void 0:o["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);ft=JSON.parse(i)}else ft=JSON.parse(e);return ft}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}ft=await(await fetch("./handler.config.json")).json()}return ft},Qn,Ht,xr,bt,Xn,Jn;function Yp(o){Qn=o.initGame,Ht=o.CustomAssets,xr=o.updateScreenState,bt=o.globalResponsiveMultipliers,Xn=o.layout,Jn=o.clearResponsiveElements}var Yi="web_embed",Dt="https://example.com",vr={profile_id:Yi},Ke=null,je=null,$t={width:0,height:0},qo=!0,Wp=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let o=await Uo();vr={...o.ids||{},profile_id:Yi},Dt=o.destination_url||((d=(c=o.export_profiles)==null?void 0:c[Yi])==null?void 0:d.destination_url)||Dt,Fe.init({ids:vr,profile:Yi,destinationUrl:Dt});let e=Fe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),je=mr({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),wr()},onRefresh:wr});let g=je.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var w,v,T,P,_,I,j,L,S,x,E,A,C;let m=window.gameApp,f=window.gameObjectManager,{width:b,height:y}=h.detail;if($t.width=b,$t.height=y,xr(b,y),!(!m||!m.renderer)){f&&r(m,f);try{m.renderer.resize(b,y);let k=m.view;k&&(k.style.width="100%",k.style.height="100%",k.style.display="block")}catch(k){console.warn("[SCREEN] Error resizing renderer:",k);return}if(t&&f&&Xn)try{let k=(w=window.__mainContainer)!=null?w:m.stage,R=(j=(I=(P=window.__tutorialLabel)!=null?P:(T=(v=f.get("label_1"))==null?void 0:v.getDisplayObject)==null?void 0:T.call(v))!=null?I:(_=f.get("label_1"))==null?void 0:_.pixiObject)!=null?j:f.get("label_1"),M=f.get("background_1"),O=(E=(x=(S=window.__background)!=null?S:(L=M==null?void 0:M.getDisplayObject)==null?void 0:L.call(M))!=null?x:M==null?void 0:M.pixiObject)!=null?E:M;if(k){let D=k===m.stage;Xn({mainContainer:k,label:R,background:O,backgroundTexture:(O==null?void 0:O.texture)||null,app:m},t,0,$t,f,{skipMainContainerTransform:D}),window.dispatchEvent(new CustomEvent("handler:layout-applied",{detail:{width:$t.width,height:$t.height,presetId:(C=(A=h.detail)==null?void 0:A.presetId)!=null?C:null}}))}}catch(k){console.warn("[SCREEN] Error in layout:",k)}}})}let t=await Qt("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=st(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 Qt("scene.main"));let i=await Qn(e,t,Dt,je);Ke=i.app;let n=i.gameObjectManager;window.gameApp=Ke,window.gameObjectManager=n;try{window.__liveEditBridge=Kn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Ht})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}je&&je.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(bt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),r(Ke,n);async function s(){try{let g=async y=>{let w=y.startsWith("/")?y:`/${y}`,v=await fetch(w,{cache:"no-cache"});if(!v.ok)return null;let T=await v.text();try{return JSON.parse(T)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let m=h.screens;if(!m||typeof m!="object")return;let f={},b={};for(let[y,w]of Object.entries(m)){let v=w==null?void 0:w.source;if(typeof v!="string")continue;let T=await g(v),P=T==null?void 0:T.elements;if(!Array.isArray(P))continue;let _=P.map(I=>I==null?void 0:I.instance_id).filter(I=>typeof I=="string");f[y]=_;for(let I of _)b[I]||(b[I]=y)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function r(g,h){if(qo){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${bt.scale.toFixed(3)}`),g.stage){let f=function(b,y=0){if(!b||!b.children)return;let w=" ".repeat(y);b.children.forEach((v,T)=>{if(v&&v.zIndex===9999){console.log(`${w}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(v&&v.scale){let P=v.scale.x||1,_=v.scale.y||1;v.__originalScale||(v.__originalScale={x:P,y:_},console.log(`${w}[RESPONSIVE] Stored original scale for child[${T}]: ${P.toFixed(3)}, ${_.toFixed(3)}`));let I=v.__originalScale.x*bt.scale,j=v.__originalScale.y*bt.scale;typeof v.scale.set=="function"?v.scale.set(I,j):(v.scale.x=I,v.scale.y=j),console.log(`${w}[RESPONSIVE] Child[${T}] scale: ${P.toFixed(3)}\u2192${v.scale.x.toFixed(3)} (type: ${v.constructor.name})`),f(v,y+1)}else v&&console.log(`${w}[RESPONSIVE] Child[${T}] has no scale (type: ${v.constructor.name})`)})};var m=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){bt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,m=window.gameObjectManager;h&&m?(r(h,m),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!m}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Fe.start()},wr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let o=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(o){let a=((t=o.getDisplayObject)==null?void 0:t.call(o))||o;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(je){je.notifyGameDestroyed();try{Jn&&Jn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=je.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),Ke){try{Ke.destroy(!0,{children:!0,texture:!1})}catch(r){console.warn("[PREVIEW] Destroy warning:",r)}Ke=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof Ht.resetScene=="function"&&Ht.resetScene()}catch(r){console.warn("Asset reset failed",r)}setTimeout(()=>{Qt("scene.main").then(r=>{window.__editableConfig=r,window.__editableConfigBaseline||(window.__editableConfigBaseline=st(r)),Qn(a,r,Dt).then(l=>{Ke=l.app,window.gameApp=Ke,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Kn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Ht})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}je&&je.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Fe.start()}catch{}})})},100)},1e3)}};var Be={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Vo=1.25,Yo={fontFamily:"Inter, system-ui, sans-serif"};var ea=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=`
2480
+ `,this.setupEventListeners(e),e}setupEventListeners(e){var w,v,T,P,_,I,j;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",L=>{if(this.viewMode==="compare")return;let S=L.target.value;this.setDevice(S)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",L=>{let S=L.target.value;this.setTheme(S)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(L=>{L.addEventListener("click",()=>{let S=L.dataset.viewToggle;S&&this.setViewMode(S)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(L=>{L.addEventListener("click",()=>{let S=L.dataset.layoutToggle;S&&this.setLayoutMode(S)})});let s=e.querySelector("#scene-toggle");s==null||s.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let r=e.querySelector("#scene-hide-btn");r==null||r.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())});let l=L=>{let S=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${L}::${S}`},c=e.querySelector("#scene-grid-btn"),d=e.querySelector("#scene-play-btn"),p=(L,S,x)=>{L&&(L.textContent=S?`${x} On`:`${x} Off`,L.setAttribute("aria-pressed",S?"true":"false"))},u=()=>{let L=window.localStorage.getItem(l("grid_gap")),S=Number(L!=null?L:50);return Number.isFinite(S)?S:50},g=L=>{try{window.localStorage.setItem(l("grid_enabled"),L?"true":"false")}catch{}p(c,L,"Grid");let S=u();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:L,gap:S}}))},h=L=>{try{window.localStorage.setItem(l("play_mode"),L?"true":"false")}catch{}p(d,L,"Play"),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:L}}))};try{let L=window.localStorage.getItem(l("grid_enabled"))==="true",S=!0;try{window.localStorage.setItem(l("play_mode"),"true")}catch{}if(p(c,L,"Grid"),p(d,S,"Play"),d&&(d.disabled=!0),c){let x=u();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:L,gap:x}}))}d&&window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:S}}))}catch{}c==null||c.addEventListener("click",()=>{let L=c.getAttribute("aria-pressed")==="true";g(!L)}),d==null||d.addEventListener("click",()=>{let L=d.getAttribute("aria-pressed")==="true";h(!L)}),(w=e.querySelector("#rotate-btn"))==null||w.addEventListener("click",()=>this.toggleRotation()),(v=e.querySelector("#zoom-in-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(.1)),(T=e.querySelector("#zoom-out-btn"))==null||T.addEventListener("click",()=>this.adjustUserZoom(-.1)),(P=e.querySelector("#refresh-btn"))==null||P.addEventListener("click",()=>this.refresh()),(_=e.querySelector("#corner-zoom-in-btn"))==null||_.addEventListener("click",()=>this.adjustUserZoom(.1)),(I=e.querySelector("#corner-zoom-out-btn"))==null||I.addEventListener("click",()=>this.adjustUserZoom(-.1)),(j=e.querySelector("#corner-grab-btn"))==null||j.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let m=e.querySelector(".scene-panel.scene-objects"),f=m==null?void 0:m.querySelector("[data-panel-resize-v]");m&&f&&this.makeSidebarResizable(m,f,"left");let b=e.querySelector(".debug-workbench"),y=b==null?void 0:b.querySelector("#workbench-resize-v");b&&y&&this.makeSidebarResizable(b,y,"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,r=a/t.height;if(this.autoScale=Math.max(.01,Math.min(s,r)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}(e==null?void 0:e.keepUserScaleMultiplier)!==void 0&&e.keepUserScaleMultiplier>0?this.userScaleMultiplier=e.keepUserScaleMultiplier:e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.gameViewPane||this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),Ba();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),Ga();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=rt().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.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier: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(r=>r.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;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]"),r=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||!r||!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:r,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,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((r,l)=>{r.root.classList.toggle("is-active",l===e),r.ghost.classList.toggle("hidden",l===e),r.focus&&(r.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,r=Math.max(.01,Math.min(a,s));e.wrapper.style.transform=`scale(${r})`})}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,r=Math.min(a/i.width,s/i.height),l=i.width*r,c=i.height*r,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"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.clientHeight-40}}let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function mr(o={}){let e=new Yn(o);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}function Wn(o){try{if(o&&typeof o.keys=="function")return Array.from(o.keys())}catch{}return[]}function fr(o){var e;return o?((e=o.getDisplayObject)==null?void 0:e.call(o))||o.pixiObject||o:null}function Fo(o,e){if(!o||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);o.eventMode=i?"static":"none",o.interactive=i,i&&(o.cursor=t.draggable?"move":"pointer")}function br(o,e){var d,p,u;if(!o||!e)return;let t=e.transform||{};Fo(o,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),r=333,l=111;a+=r,s+=l,console.log("[DEBUG FALLBACK] tryApplyTransform (live-edit) position.set",a,s,"(raw + 333, +111)"),(d=o.position)!=null&&d.set?o.position.set(a,s):(typeof o.x=="number"&&(o.x=a),typeof o.y=="number"&&(o.y=s)),typeof t.scale=="number"&&((p=o.scale)!=null&&p.set?o.scale.set(t.scale):o.scale&&(o.scale.x=t.scale,o.scale.y=t.scale));let c=t.anchor;if(c&&((u=o.anchor)!=null&&u.set)){let g=null;typeof window!="undefined"&&window.resolveAnchorVec2?g=window.resolveAnchorVec2(c):typeof c=="object"&&c.x!==void 0&&c.y!==void 0?g=c:Array.isArray(c)&&c.length===2&&(g={x:c[0],y:c[1]}),g&&typeof g.x=="number"&&typeof g.y=="number"&&o.anchor.set(g.x,g.y)}}function yr(o){if(typeof window=="undefined")return;let e=o==null?void 0:o.objects,t=Wn(e),i=a=>a;window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>yr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Wn((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Wn((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var s,r,l,c;return(c=(l=(r=(s=window.__editableConfig)==null?void 0:s.objects)==null?void 0:r.get)==null?void 0:l.call(r,a))!=null?c: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 Bo(){if(typeof window=="undefined")return;let o=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,r;let n=o(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),d=Date.now(),p=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),u=await l.load(p);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let h=window.gameObjectManager,m=(s=h==null?void 0:h.get)==null?void 0:s.call(h,t);if(m){let f=((r=m.getDisplayObject)==null?void 0:r.call(m))||m.pixiObject||m.pixi||m;if(f!=null&&f.texture)f.texture=u;else if(f!=null&&f.children){let b=f.children.find(y=>y==null?void 0:y.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=rn();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Jt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=rn();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Jt(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&&Jt(n,{silent:!0,persist:!0,emitEvent:!0})}}function Kn(o){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=o;t&&(t.onObjectRebuildRequired=async(a,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let r=t.get(a),l=r==null?void 0:r.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);r?t.remove(a):l&&l.destroy();let p=window.gameApp,u=await Me.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"&&(Bo(),window.applyEditableObjectConfig=(a,s)=>{var r,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(r=d==null?void 0:d.objects)!=null&&r.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=fr(p);br(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 r=e();(d=r==null?void 0:r.objects)!=null&&d.set&&(r.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=fr(l);br(u,s)}let c=[a];i==null||i(a,s,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,yr(a))}};return n.rebuildIndexes(),n}import Go from"lottie-web";Zn(Ss);typeof window!="undefined"&&!window.lottie&&(window.lottie=Go);var ft=null,Uo=async()=>{if(!ft){let o=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(o==null?void 0:o["handler.config"])||(o==null?void 0:o["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);ft=JSON.parse(i)}else ft=JSON.parse(e);return ft}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}ft=await(await fetch("./handler.config.json")).json()}return ft},Qn,Ht,xr,bt,Xn,Jn;function Yp(o){Qn=o.initGame,Ht=o.CustomAssets,xr=o.updateScreenState,bt=o.globalResponsiveMultipliers,Xn=o.layout,Jn=o.clearResponsiveElements}var Yi="web_embed",Dt="https://example.com",vr={profile_id:Yi},Ke=null,je=null,$t={width:0,height:0},qo=!0,Wp=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let o=await Uo();vr={...o.ids||{},profile_id:Yi},Dt=o.destination_url||((d=(c=o.export_profiles)==null?void 0:c[Yi])==null?void 0:d.destination_url)||Dt,Fe.init({ids:vr,profile:Yi,destinationUrl:Dt});let e=Fe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),je=mr({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),wr()},onRefresh:wr});let g=je.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var w,v,T,P,_,I,j,L,S,x,E,C,A;let m=window.gameApp,f=window.gameObjectManager,{width:b,height:y}=h.detail;if($t.width=b,$t.height=y,xr(b,y),!(!m||!m.renderer)){f&&r(m,f);try{m.renderer.resize(b,y);let k=m.view;k&&(k.style.width="100%",k.style.height="100%",k.style.display="block")}catch(k){console.warn("[SCREEN] Error resizing renderer:",k);return}if(t&&f&&Xn)try{let k=(w=window.__mainContainer)!=null?w:m.stage,R=(j=(I=(P=window.__tutorialLabel)!=null?P:(T=(v=f.get("label_1"))==null?void 0:v.getDisplayObject)==null?void 0:T.call(v))!=null?I:(_=f.get("label_1"))==null?void 0:_.pixiObject)!=null?j:f.get("label_1"),M=f.get("background_1"),O=(E=(x=(S=window.__background)!=null?S:(L=M==null?void 0:M.getDisplayObject)==null?void 0:L.call(M))!=null?x:M==null?void 0:M.pixiObject)!=null?E:M;if(k){let D=k===m.stage;Xn({mainContainer:k,label:R,background:O,backgroundTexture:(O==null?void 0:O.texture)||null,app:m},t,0,$t,f,{skipMainContainerTransform:D}),window.dispatchEvent(new CustomEvent("handler:layout-applied",{detail:{width:$t.width,height:$t.height,presetId:(A=(C=h.detail)==null?void 0:C.presetId)!=null?A:null}}))}}catch(k){console.warn("[SCREEN] Error in layout:",k)}}})}let t=await Qt("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=st(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 Qt("scene.main"));let i=await Qn(e,t,Dt,je);Ke=i.app;let n=i.gameObjectManager;window.gameApp=Ke,window.gameObjectManager=n;try{window.__liveEditBridge=Kn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Ht})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}je&&je.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(bt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),r(Ke,n);async function s(){try{let g=async y=>{let w=y.startsWith("/")?y:`/${y}`,v=await fetch(w,{cache:"no-cache"});if(!v.ok)return null;let T=await v.text();try{return JSON.parse(T)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let m=h.screens;if(!m||typeof m!="object")return;let f={},b={};for(let[y,w]of Object.entries(m)){let v=w==null?void 0:w.source;if(typeof v!="string")continue;let T=await g(v),P=T==null?void 0:T.elements;if(!Array.isArray(P))continue;let _=P.map(I=>I==null?void 0:I.instance_id).filter(I=>typeof I=="string");f[y]=_;for(let I of _)b[I]||(b[I]=y)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function r(g,h){if(qo){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${bt.scale.toFixed(3)}`),g.stage){let f=function(b,y=0){if(!b||!b.children)return;let w=" ".repeat(y);b.children.forEach((v,T)=>{if(v&&v.zIndex===9999){console.log(`${w}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(v&&v.scale){let P=v.scale.x||1,_=v.scale.y||1;v.__originalScale||(v.__originalScale={x:P,y:_},console.log(`${w}[RESPONSIVE] Stored original scale for child[${T}]: ${P.toFixed(3)}, ${_.toFixed(3)}`));let I=v.__originalScale.x*bt.scale,j=v.__originalScale.y*bt.scale;typeof v.scale.set=="function"?v.scale.set(I,j):(v.scale.x=I,v.scale.y=j),console.log(`${w}[RESPONSIVE] Child[${T}] scale: ${P.toFixed(3)}\u2192${v.scale.x.toFixed(3)} (type: ${v.constructor.name})`),f(v,y+1)}else v&&console.log(`${w}[RESPONSIVE] Child[${T}] has no scale (type: ${v.constructor.name})`)})};var m=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){bt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,m=window.gameObjectManager;h&&m?(r(h,m),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!m}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Fe.start()},wr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let o=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(o){let a=((t=o.getDisplayObject)==null?void 0:t.call(o))||o;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(je){je.notifyGameDestroyed();try{Jn&&Jn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=je.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),Ke){try{Ke.destroy(!0,{children:!0,texture:!1})}catch(r){console.warn("[PREVIEW] Destroy warning:",r)}Ke=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof Ht.resetScene=="function"&&Ht.resetScene()}catch(r){console.warn("Asset reset failed",r)}setTimeout(()=>{Qt("scene.main").then(r=>{window.__editableConfig=r,window.__editableConfigBaseline||(window.__editableConfigBaseline=st(r)),Qn(a,r,Dt).then(l=>{Ke=l.app,window.gameApp=Ke,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Kn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Ht})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}je&&je.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Fe.start()}catch{}})})},100)},1e3)}};var Be={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Vo=1.25,Yo={fontFamily:"Inter, system-ui, sans-serif"};var ea=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=`
2481
2481
  position: fixed;
2482
2482
  inset: 0;
2483
2483
  display: flex;
@@ -2676,7 +2676,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2676
2676
  0%, 100% { opacity: 1; }
2677
2677
  50% { opacity: 0.3; }
2678
2678
  }
2679
- `,document.head.appendChild(e)}setProgress(e){this.currentProgress=Math.max(0,Math.min(100,e)),this.progressBar.style.width=`${this.currentProgress}%`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`}mount(e=document.body){e.appendChild(this.container)}unmount(){this.container.parentElement&&this.container.parentElement.removeChild(this.container)}getElement(){return this.container}};var ta=is.version,Wo=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);ts();var Tr={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},Pr=Math.random().toString(36).slice(2),wt=null,yt={...Tr},Ir="web_embed",sa={},Ft,ia=!1,Nt=!1,Gt=!1,Mr=!1,ca=1,Ki=0,Zi=!1,Ge=!1,vt="",xt=Math.floor(window.innerWidth),St=Math.floor(window.innerHeight),ra=xt>St,Ue=!1,Bt=!1,Sr=!1,Er=!1,na=!1,Xi=null,it=null,oa=!1,la=!1,Wi=new Map;function jr(){if(!it)return null;let o=Date.now()-it;return!Number.isFinite(o)||o<0?null:o}function aa(o){if(oa)return;let e=jr();e!==null&&(oa=!0,B("session_time",{duration_ms:e,reason:o}))}function Ar(){if(wt)return wt;let o=document.createElement("div");return o.id="handler-root",o.setAttribute("data-handler-root","true"),document.body.appendChild(o),wt=o,o}function Ji(o){switch(o){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return o}}function _r(o,e){return{event_name:o,ts:Date.now(),session_id:Pr,deployment_id:yt.deployment_id,variant_id:yt.variant_id,export_profile_id:yt.profile_id,instance_id:yt.instance_id||"default",env:Ir==="mraid"?"mraid":"web",attribution:Ft,payload:e}}function B(o,e){let t=Ji(o),i=_r(t,e);cn(i,!!sa.analytics),ti(t,i),t!==o&&ti(o,i)}function Ut(){Xi&&(Xi(xt,St),Xi=null)}function Et(o){ca=o,B("volume",o)}function At(o){o&&(Mr=!0),!Gt&&(Gt=!0,B("pause"),Et(0))}function qt(o){!o&&Mr||Gt&&(Gt=!1,B("resume"),Et(ca))}function Xe(o,e){xt=Math.floor(o||window.innerWidth),St=Math.floor(e||window.innerHeight),ra=xt>St,B("resize",{width:xt,height:St})}function Ko(){if(hs())try{let o=mraid.getMaxSize();Xe(o.width,o.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?qt():At()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Xe(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();Et(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&Et(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Zi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Ue=!0,B("boot"),B("view"),B("ready"),Ge=!0,Ut();else{let t=()=>{Ue=!0,B("boot"),B("view"),B("ready"),Ge=!0,Ut()};mraid.addEventListener("ready",t)}}catch(o){console.warn("MRAID hook skipped",o)}}function Xo(){if(ms())try{let o=dapi.getScreenSize();Xe(o.width,o.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?qt():At()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Xe(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(Et(e?1:0),dapi.addEventListener("audioVolumeChange",t=>Et(t?1:0)),Zi=!0,dapi.isViewable())Ue=!0,B("boot"),B("view"),B("ready"),Ge=!0,Ut();else{let t=()=>{Ue=!0,B("boot"),B("view"),B("ready"),Ge=!0,Ut()};dapi.addEventListener("ready",t)}}catch(o){console.warn("DAPI hook skipped",o)}}function Cr(){let o=()=>{Ue||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Ue=!0,B("boot"),B("view"),B("ready"),Ge=!0,Ut(),Bt&&(Bt=!1,_e.start()))};window.addEventListener("resize",()=>Xe()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(qt(),o()):At()}),document.readyState==="complete"||document.readyState==="interactive"?o():window.addEventListener("load",o),Zi=!0}function Jo(){let o=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Sr=!0),!(Sr&&e instanceof MouseEvent)&&(Ki+=1,la||(la=!0,B("first_interaction",{count:Ki})),B("interaction",Ki))};document.addEventListener("mousedown",o),document.addEventListener("touchstart",o)}function Lr(o){var i,n,a,s,r,l,c,d,p,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(o||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(ct())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(fs())(r=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||r.call(s);else if(ws())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(vs())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(m){console.warn("Smadex redirect failed",m)}else if(bs()){let m=window.ExitApi;m&&typeof m.exit=="function"?m.exit(o||vt||""):o&&window.open(o)}else lt()?(u=window.install)==null||u.call(window):ys()?(g=window.openAppStore)==null||g.call(window):dn()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):o&&window.open(o)}function Zo(){let o=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(o==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;be("view",()=>e(t.mraid_viewable)),be("start",()=>e(t.game_viewable)),be("engagement",()=>e(t.engagement));let i=()=>e(t.complete);be("complete",i),ei("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),be("cta_click",()=>e(t.click))}else if(o==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;be("view",()=>e(t.Ad_Load_Start)),be("start",()=>e(t.Ad_Viewable)),be("engagement",()=>e(t.First_Engagement)),be("complete",()=>e(t.Gameplay_Complete)),be("cta_click",()=>e(t.DSP_Click)),be("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Qo(){if(!ct())return;let o=window.TJ_API;o&&o.setPlayableAPI&&o.setPlayableAPI({skipAd:()=>{try{_e.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function kr(){var e,t,i;let o=window.TJ_API;(e=o==null?void 0:o.objectiveComplete)==null||e.call(o),(t=o==null?void 0:o.playableFinished)==null||t.call(o),(i=o==null?void 0:o.gameplayFinished)==null||i.call(o)}function el(){lt()&&(window.mintGameStart=()=>{qt(!0),Xe()},window.mintGameClose=()=>{At(!0)})}function tl(){if(!pn())return;let o=window.NUC;!o||!o.trigger||(_e.on("cta_click",()=>{var e,t;return(t=(e=o.trigger).convert)==null?void 0:t.call(e,vt)}),_e.on("complete",()=>{var e,t;return(t=(e=o.trigger).tryAgain)==null?void 0:t.call(e)}))}var _e={init(o={},e){var t;if(Ir=o.profile||"web_embed",sa=o.consent||{},yt={...Tr,...o.ids||{}},wt=o.rootEl||wt,Ft=void 0,Wa((t=o.telemetry)!=null&&t.endpoint?o.telemetry:null),it=null,oa=!1,la=!1,Wi.clear(),vt=o.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Xi=e),B("init"),document.body.oncontextmenu=()=>!1,Ar(),nl(wt),xs(),Ko(),Xo(),!Zi){if(document.readyState==="complete")Cr();else if(!Er){Er=!0;let i=()=>{Cr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Jo(),Zo(),Qo(),el(),tl(),console.log(`%c @handler/playable-sdk %c v${ta} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),Ue&&!Ge&&(B("boot"),B("view"),B("ready"),Bt&&(Bt=!1,_e.start()),Ge=!0),Ge=Ue},getRoot(){return Ar()},get version(){return ta},get maxWidth(){return xt},get maxHeight(){return St},get isLandscape(){return ra},get isReady(){return Ge},get isStarted(){return ia},get isPaused(){return Gt},get isFinished(){return Nt},get volume(){return ca},get interactions(){return Ki},on(o,e){ei(Ji(o),e)},off(o,e){ln(Ji(o),e)},start(){var o,e;if(!ia){if(!Ue){Bt=!0;return}if(ia=!0,it||(it=Date.now()),B("start"),Xe(),lt())At(),(o=window.gameReady)==null||o.call(window);else if(ct()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:ra?"landscape":"portrait",buildID:ta})}}},finish(){var o,e;Nt||(Nt=!0,B("complete"),aa("complete"),lt()?(o=window.gameEnd)==null||o.call(window):dn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):ct()&&kr())},install(o){if(!Nt){Nt=!0,ct()?(kr(),setTimeout(()=>_e.install(o),300)):(B("complete"),setTimeout(()=>_e.install(o),0));return}na||(na=!0,setTimeout(()=>na=!1,500),B("cta_click"),B("conversion"),aa("cta"),Lr(o||vt))},emit(o,e){let t=Ji(o);if(!Wo.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${o} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=_r(t,e);cn(i,!!sa.analytics),ti(t,i)},gameStart(){_e.start()},gameEnd(){_e.finish()},ctaClick(o,e){B("cta_click",{url:o||vt,manual:!0}),(e==null?void 0:e.open)!==!1&&Lr(o||vt)},ctaShow(o){B("cta_show",o)},ctaDismiss(o){B("cta_dismiss",o)},getGameTimeMs(){return jr()},endSession(o="manual"){aa(o)},setAttribution(o){Ft=o},abTest(o,e){if(!o)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(il(`${Pr}:${o}`))%e.length,i=e[t];return Ft={...Ft||{},experiment_id:o},yt.variant_id=i,B("ab_assign",{experiment_id:o,variant_id:i}),i},levelStart(o,e){it||(it=Date.now()),B("level_start",{level_id:o,...e})},levelComplete(o,e){B("level_complete",{level_id:o,...e})},levelFail(o,e){B("level_fail",{level_id:o,...e})},checkpoint(o,e){B("checkpoint",{checkpoint_id:o,...e})},reward(o,e){B("reward",{reward_id:o,...e})},tutorialStart(o,e){B("tutorial_start",{step_id:o,...e})},tutorialComplete(o,e){B("tutorial_complete",{step_id:o,...e})},tutorialSkip(o,e){B("tutorial_skip",{step_id:o,...e})},timerStart(o){o&&Wi.set(o,Date.now())},timerEnd(o,e="custom",t){if(!o)return;let i=Wi.get(o);if(!i)return;Wi.delete(o);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){B("engagement",{action:"timer",key:o,duration_ms:n,...t});return}B(e,{key:o,duration_ms:n,...t})}},fps(o,e){B("fps",{value:o,...e})},memory(o,e){B("memory",{bytes:o,...e})},assetLoadStart(o,e){B("asset_load_start",{asset_id:o,...e})},assetLoadComplete(o,e){B("asset_load_complete",{asset_id:o,...e})},reportError(o,e,t){B("error",{code:o,message:e,...t})},retry(){var o,e,t;if(lt())(o=window.gameRetry)==null||o.call(window);else if(pn()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}B("engagement",{action:"retry"})},pause(){At(!0)},resume(){qt(!0)},resize(o,e){Xe(o,e)}},Fe=_e;function il(o){let e=2166136261;for(let t=0;t<o.length;t++)e^=o.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function nl(o){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2679
+ `,document.head.appendChild(e)}setProgress(e){this.currentProgress=Math.max(0,Math.min(100,e)),this.progressBar.style.width=`${this.currentProgress}%`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`}mount(e=document.body){e.appendChild(this.container)}unmount(){this.container.parentElement&&this.container.parentElement.removeChild(this.container)}getElement(){return this.container}};var ta=is.version,Wo=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);ts();var Tr={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},Pr=Math.random().toString(36).slice(2),wt=null,yt={...Tr},Ir="web_embed",sa={},Ft,ia=!1,Nt=!1,Gt=!1,Mr=!1,ca=1,Ki=0,Zi=!1,Ge=!1,vt="",xt=Math.floor(window.innerWidth),St=Math.floor(window.innerHeight),ra=xt>St,Ue=!1,Bt=!1,Sr=!1,Er=!1,na=!1,Xi=null,it=null,oa=!1,la=!1,Wi=new Map;function jr(){if(!it)return null;let o=Date.now()-it;return!Number.isFinite(o)||o<0?null:o}function aa(o){if(oa)return;let e=jr();e!==null&&(oa=!0,B("session_time",{duration_ms:e,reason:o}))}function Cr(){if(wt)return wt;let o=document.createElement("div");return o.id="handler-root",o.setAttribute("data-handler-root","true"),document.body.appendChild(o),wt=o,o}function Ji(o){switch(o){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return o}}function _r(o,e){return{event_name:o,ts:Date.now(),session_id:Pr,deployment_id:yt.deployment_id,variant_id:yt.variant_id,export_profile_id:yt.profile_id,instance_id:yt.instance_id||"default",env:Ir==="mraid"?"mraid":"web",attribution:Ft,payload:e}}function B(o,e){let t=Ji(o),i=_r(t,e);cn(i,!!sa.analytics),ti(t,i),t!==o&&ti(o,i)}function Ut(){Xi&&(Xi(xt,St),Xi=null)}function Et(o){ca=o,B("volume",o)}function Ct(o){o&&(Mr=!0),!Gt&&(Gt=!0,B("pause"),Et(0))}function qt(o){!o&&Mr||Gt&&(Gt=!1,B("resume"),Et(ca))}function Xe(o,e){xt=Math.floor(o||window.innerWidth),St=Math.floor(e||window.innerHeight),ra=xt>St,B("resize",{width:xt,height:St})}function Ko(){if(hs())try{let o=mraid.getMaxSize();Xe(o.width,o.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?qt():Ct()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Xe(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();Et(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&Et(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Zi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Ue=!0,B("boot"),B("view"),B("ready"),Ge=!0,Ut();else{let t=()=>{Ue=!0,B("boot"),B("view"),B("ready"),Ge=!0,Ut()};mraid.addEventListener("ready",t)}}catch(o){console.warn("MRAID hook skipped",o)}}function Xo(){if(ms())try{let o=dapi.getScreenSize();Xe(o.width,o.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?qt():Ct()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Xe(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(Et(e?1:0),dapi.addEventListener("audioVolumeChange",t=>Et(t?1:0)),Zi=!0,dapi.isViewable())Ue=!0,B("boot"),B("view"),B("ready"),Ge=!0,Ut();else{let t=()=>{Ue=!0,B("boot"),B("view"),B("ready"),Ge=!0,Ut()};dapi.addEventListener("ready",t)}}catch(o){console.warn("DAPI hook skipped",o)}}function Ar(){let o=()=>{Ue||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Ue=!0,B("boot"),B("view"),B("ready"),Ge=!0,Ut(),Bt&&(Bt=!1,_e.start()))};window.addEventListener("resize",()=>Xe()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(qt(),o()):Ct()}),document.readyState==="complete"||document.readyState==="interactive"?o():window.addEventListener("load",o),Zi=!0}function Jo(){let o=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Sr=!0),!(Sr&&e instanceof MouseEvent)&&(Ki+=1,la||(la=!0,B("first_interaction",{count:Ki})),B("interaction",Ki))};document.addEventListener("mousedown",o),document.addEventListener("touchstart",o)}function Lr(o){var i,n,a,s,r,l,c,d,p,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(o||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(ct())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(fs())(r=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||r.call(s);else if(ws())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(vs())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(m){console.warn("Smadex redirect failed",m)}else if(bs()){let m=window.ExitApi;m&&typeof m.exit=="function"?m.exit(o||vt||""):o&&window.open(o)}else lt()?(u=window.install)==null||u.call(window):ys()?(g=window.openAppStore)==null||g.call(window):dn()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):o&&window.open(o)}function Zo(){let o=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(o==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;be("view",()=>e(t.mraid_viewable)),be("start",()=>e(t.game_viewable)),be("engagement",()=>e(t.engagement));let i=()=>e(t.complete);be("complete",i),ei("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),be("cta_click",()=>e(t.click))}else if(o==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;be("view",()=>e(t.Ad_Load_Start)),be("start",()=>e(t.Ad_Viewable)),be("engagement",()=>e(t.First_Engagement)),be("complete",()=>e(t.Gameplay_Complete)),be("cta_click",()=>e(t.DSP_Click)),be("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Qo(){if(!ct())return;let o=window.TJ_API;o&&o.setPlayableAPI&&o.setPlayableAPI({skipAd:()=>{try{_e.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function kr(){var e,t,i;let o=window.TJ_API;(e=o==null?void 0:o.objectiveComplete)==null||e.call(o),(t=o==null?void 0:o.playableFinished)==null||t.call(o),(i=o==null?void 0:o.gameplayFinished)==null||i.call(o)}function el(){lt()&&(window.mintGameStart=()=>{qt(!0),Xe()},window.mintGameClose=()=>{Ct(!0)})}function tl(){if(!pn())return;let o=window.NUC;!o||!o.trigger||(_e.on("cta_click",()=>{var e,t;return(t=(e=o.trigger).convert)==null?void 0:t.call(e,vt)}),_e.on("complete",()=>{var e,t;return(t=(e=o.trigger).tryAgain)==null?void 0:t.call(e)}))}var _e={init(o={},e){var t;if(Ir=o.profile||"web_embed",sa=o.consent||{},yt={...Tr,...o.ids||{}},wt=o.rootEl||wt,Ft=void 0,Wa((t=o.telemetry)!=null&&t.endpoint?o.telemetry:null),it=null,oa=!1,la=!1,Wi.clear(),vt=o.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Xi=e),B("init"),document.body.oncontextmenu=()=>!1,Cr(),nl(wt),xs(),Ko(),Xo(),!Zi){if(document.readyState==="complete")Ar();else if(!Er){Er=!0;let i=()=>{Ar(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Jo(),Zo(),Qo(),el(),tl(),console.log(`%c @handler/playable-sdk %c v${ta} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),Ue&&!Ge&&(B("boot"),B("view"),B("ready"),Bt&&(Bt=!1,_e.start()),Ge=!0),Ge=Ue},getRoot(){return Cr()},get version(){return ta},get maxWidth(){return xt},get maxHeight(){return St},get isLandscape(){return ra},get isReady(){return Ge},get isStarted(){return ia},get isPaused(){return Gt},get isFinished(){return Nt},get volume(){return ca},get interactions(){return Ki},on(o,e){ei(Ji(o),e)},off(o,e){ln(Ji(o),e)},start(){var o,e;if(!ia){if(!Ue){Bt=!0;return}if(ia=!0,it||(it=Date.now()),B("start"),Xe(),lt())Ct(),(o=window.gameReady)==null||o.call(window);else if(ct()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:ra?"landscape":"portrait",buildID:ta})}}},finish(){var o,e;Nt||(Nt=!0,B("complete"),aa("complete"),lt()?(o=window.gameEnd)==null||o.call(window):dn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):ct()&&kr())},install(o){if(!Nt){Nt=!0,ct()?(kr(),setTimeout(()=>_e.install(o),300)):(B("complete"),setTimeout(()=>_e.install(o),0));return}na||(na=!0,setTimeout(()=>na=!1,500),B("cta_click"),B("conversion"),aa("cta"),Lr(o||vt))},emit(o,e){let t=Ji(o);if(!Wo.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${o} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=_r(t,e);cn(i,!!sa.analytics),ti(t,i)},gameStart(){_e.start()},gameEnd(){_e.finish()},ctaClick(o,e){B("cta_click",{url:o||vt,manual:!0}),(e==null?void 0:e.open)!==!1&&Lr(o||vt)},ctaShow(o){B("cta_show",o)},ctaDismiss(o){B("cta_dismiss",o)},getGameTimeMs(){return jr()},endSession(o="manual"){aa(o)},setAttribution(o){Ft=o},abTest(o,e){if(!o)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(il(`${Pr}:${o}`))%e.length,i=e[t];return Ft={...Ft||{},experiment_id:o},yt.variant_id=i,B("ab_assign",{experiment_id:o,variant_id:i}),i},levelStart(o,e){it||(it=Date.now()),B("level_start",{level_id:o,...e})},levelComplete(o,e){B("level_complete",{level_id:o,...e})},levelFail(o,e){B("level_fail",{level_id:o,...e})},checkpoint(o,e){B("checkpoint",{checkpoint_id:o,...e})},reward(o,e){B("reward",{reward_id:o,...e})},tutorialStart(o,e){B("tutorial_start",{step_id:o,...e})},tutorialComplete(o,e){B("tutorial_complete",{step_id:o,...e})},tutorialSkip(o,e){B("tutorial_skip",{step_id:o,...e})},timerStart(o){o&&Wi.set(o,Date.now())},timerEnd(o,e="custom",t){if(!o)return;let i=Wi.get(o);if(!i)return;Wi.delete(o);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){B("engagement",{action:"timer",key:o,duration_ms:n,...t});return}B(e,{key:o,duration_ms:n,...t})}},fps(o,e){B("fps",{value:o,...e})},memory(o,e){B("memory",{bytes:o,...e})},assetLoadStart(o,e){B("asset_load_start",{asset_id:o,...e})},assetLoadComplete(o,e){B("asset_load_complete",{asset_id:o,...e})},reportError(o,e,t){B("error",{code:o,message:e,...t})},retry(){var o,e,t;if(lt())(o=window.gameRetry)==null||o.call(window);else if(pn()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}B("engagement",{action:"retry"})},pause(){Ct(!0)},resume(){qt(!0)},resize(o,e){Xe(o,e)}},Fe=_e;function il(o){let e=2166136261;for(let t=0;t<o.length;t++)e^=o.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function nl(o){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2680
2680
  (function(){
2681
2681
  var events = ['touchstart','touchend','mousedown','keydown'];
2682
2682
  function unlock(){
@@ -2692,7 +2692,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2692
2692
  }
2693
2693
  events.forEach(function(e){ document.addEventListener(e, unlock, false); });
2694
2694
  })();
2695
- `,o.appendChild(e)}async function da(o,e={}){let t=new al;await t.init({resizeTo:o,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var p,u,g,h;if(!t.renderer)return;let r=(p=s==null?void 0:s.width)!=null?p:o.clientWidth,l=(u=s==null?void 0:s.height)!=null?u:o.clientHeight,c=r&&r>0?r:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(h=window.innerHeight)!=null?h:480;t.renderer.resize(c,d)};o.appendChild(t.canvas),o.style.position="relative",o.style.display="flex",o.style.flexDirection="column",o.style.alignItems="stretch",o.style.width="100%",o.style.height="100dvh",o.style.minHeight="100vh",o.style.maxWidth="100%",o.style.maxHeight="100%",o.style.boxSizing="border-box",o.style.overflow="hidden",e.background&&(o.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(";")),o.appendChild(n),Fe.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(r=>r.pause())}),Fe.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(r=>{r.currentTime>0&&!r.ended&&r.play().catch(()=>{})})}),Fe.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 r=s[0];if(r&&r.contentRect.width>0&&r.contentRect.height>0){let l=Math.round(r.contentRect.width),c=Math.round(r.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(o),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as pa,Ticker as Ct,ColorMatrixFilter as sl}from"pixi.js";var Qi=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)}},en=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}=Hr("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},tn=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 Qi(n.transform),this.renderer=new en(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&&(Ct.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,d,p,u,g,h,m,f,b,y;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(d=e==null?void 0:e.motion)==null?void 0:d.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(u=(p=this._config)==null?void 0:p.render)==null?void 0:u.asset)==null?void 0:g.type,a=(m=(h=e==null?void 0:e.render)==null?void 0:h.asset)==null?void 0:m.type,s=(b=(f=this._config)==null?void 0:f.ui)==null?void 0:b.renderMode,r=(y=e==null?void 0:e.ui)==null?void 0:y.renderMode;if((n!==a||s!==r)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} to ${a}/${r}`),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,r;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=(r=(s=this._config)==null?void 0:s.transform)==null?void 0:r.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,r;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=(r=this.transform.scale)!=null?r: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,r,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 pa;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 pa;g.blur=(r=u.blur)!=null?r: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 pa;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let h=new sl,m=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;h.tint(m),t.push(h)}}(d=e.stroke)!=null&&d.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(p=e.distortion)!=null&&p.enabled&&console.warn("[Effects] Distortion effect requires pixi-filters or a displacement map. Install: npm install pixi-filters"),this.pixiObject.filters=t.length>0?t:null}applyIntro(){var d,p,u,g,h,m,f;let e=(d=this._config)==null?void 0:d.motion;if(!e||!((p=e.intro)!=null&&p.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,a=this.transform.position.y,s=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),r=this.transform.scale*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_y)||1);if(this.pixiObject.alpha=(f=t.startAlpha)!=null?f:0,t.startScale!==void 0&&this.pixiObject.scale.set(s*t.startScale,r*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=a+(t.startYOffset||0)),this._introTicker&&Ct.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,r);return}let l=0,c=b=>{var j,L,S,x,E,A;if(l+=b.deltaTime/60,l<n)return;let y=i>0?Math.min(1,(l-n)/i):1,w=1-Math.pow(1-y,3),v=this.renderer.alpha,T=this.transform.scale*(((L=(j=this._config)==null?void 0:j.effects)==null?void 0:L.scale_x)||1),P=this.transform.scale*(((x=(S=this._config)==null?void 0:S.effects)==null?void 0:x.scale_y)||1),_=this.transform.position.y,I=this.transform.position.x;if(this.pixiObject.alpha=((E=t.startAlpha)!=null?E:0)+(v-((A=t.startAlpha)!=null?A:0))*w,t.startScale!==void 0){let C=t.startScale+(1-t.startScale)*w;this.pixiObject.scale.set(T*C,P*C)}t.startYOffset!==void 0&&(this.pixiObject.y=_+t.startYOffset+(_-(_+t.startYOffset))*w),y>=1&&(Ct.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=v,this.pixiObject.x=I,this.pixiObject.y=_,this.pixiObject.scale.set(T,P))};this._introTicker=c,Ct.shared.add(c)}applyMotion(){var p,u,g,h,m,f;let e=(p=this._config)==null?void 0:p.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(this._lastMotionStr===i&&this._tickerCleanup)return;if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),!(((u=e.pulse)==null?void 0:u.enabled)||((g=e.swing)==null?void 0:g.enabled)||((h=e.continuousMove)==null?void 0:h.enabled)||((m=e.continuousRotate)==null?void 0:m.enabled)||((f=e.orbit)==null?void 0:f.enabled)))return;let a=0,s=0,r=0,l=0,c=1/60,d=b=>{var S,x,E,A,C,k,R,M,O,D,N,q,$,H,z,G,Y,V,F,Q,W,K,X,de,ee,we;let y=((S=b.deltaTime)!=null?S:1)*c;a+=b.deltaTime*.05;let w=this.transform.scale,v=w*(((E=(x=this._config)==null?void 0:x.effects)==null?void 0:E.scale_x)||1),T=w*(((C=(A=this._config)==null?void 0:A.effects)==null?void 0:C.scale_y)||1),P=this.transform.position.x,_=this.transform.position.y,I=this.transform.rotation,j=0,L=0;if((k=e.swing)!=null&&k.enabled){let J=(R=e.swing.amplitude)!=null?R:10,le=(M=e.swing.speed)!=null?M:1,ie=Math.sin(a*le)*J;e.swing.axis==="vertical"?L+=ie:e.swing.axis==="both"?(j+=ie,L+=ie):j+=ie}if((O=e.continuousMove)!=null&&O.enabled){let J=(D=e.continuousMove.axis)!=null?D:"x",le=Math.max(0,(N=e.continuousMove.speed)!=null?N:50),ie=Math.sign((q=e.continuousMove.direction)!=null?q:1)||1,se=Math.max(0,($=e.continuousMove.lifetime)!=null?$:0);s+=y;let Ce=se>0?Math.min(s,se):s,Re=le*ie*Ce;(J==="x"||J==="both")&&(j+=Re),(J==="y"||J==="both")&&(L+=Re)}if((H=e.orbit)!=null&&H.enabled){let J=Math.max(0,(z=e.orbit.radius)!=null?z:50),le=Math.max(0,(G=e.orbit.speed)!=null?G:45),ie=Math.sign((Y=e.orbit.direction)!=null?Y:1)||1,se=le*Math.PI/180;l+=se*ie*y;let Ce=(V=e.orbit.pivotOffsetX)!=null?V:0,Re=(F=e.orbit.pivotOffsetY)!=null?F:0;j+=Ce+J*Math.cos(l),L+=Re+J*Math.sin(l)}if(this.pixiObject.x=P+j,this.pixiObject.y=_+L,(Q=e.pulse)!=null&&Q.enabled){let J=(W=e.pulse.intensity)!=null?W:.1,le=(K=e.pulse.speed)!=null?K:1,se=1+Math.sin(a*le)*J;(X=this.pixiObject.scale)!=null&&X.set?this.pixiObject.scale.set(v*se,T*se):this.pixiObject.scale&&(this.pixiObject.scale.x=v*se,this.pixiObject.scale.y=T*se)}if((de=e.continuousRotate)!=null&&de.enabled){let J=Math.max(0,(ee=e.continuousRotate.speed)!=null?ee:90),le=Math.sign((we=e.continuousRotate.direction)!=null?we:1)||1,ie=J*Math.PI/180;r+=ie*le*y,this.pixiObject.rotation=I+r}};Ct.shared.add(d),this._tickerCleanup=()=>{var b,y,w,v,T;if(Ct.shared.remove(d),this.pixiObject){let P=this.transform.scale*(((y=(b=this._config)==null?void 0:b.effects)==null?void 0:y.scale_x)||1),_=this.transform.scale*(((v=(w=this._config)==null?void 0:w.effects)==null?void 0:v.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(T=this.pixiObject.scale)!=null&&T.set?this.pixiObject.scale.set(P,_):this.pixiObject.scale&&(this.pixiObject.scale.x=P,this.pixiObject.scale.y=_)}}}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)}},Vt=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 tn(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 r=await this.onObjectRebuildRequired(e,s);r&&this.objects.get(e)===r&&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 nn={"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 rl(o){let e=nn[o];return e?e.family:(console.warn(`Font ID "${o}" not found in registry, using fallback`),"Arial, sans-serif")}function ol(o){var t;let e=nn[o];return e&&(t=e.weight)!=null?t:"400"}function ll(o,e){nn[o]=e}function cl(){return Object.keys(nn)}var Lt=null;function dl(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!Lt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),Lt||(typeof window!="undefined"&&window.lottie?(Lt=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(o=>o.toLowerCase().includes("lottie")):"no window"),Lt=null)),Lt}function pl(o){return!o||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("/")?o:`/${o.replace(/^\.\//,"")}`}function ul(o){try{let e=new XMLHttpRequest;return e.open("GET",pl(o),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Rr(o){return!o||typeof o!="object"||!Array.isArray(o.layers)?null:(Array.isArray(o.assets)||(o.assets=[]),Array.isArray(o.chars)||(o.chars=[]),o)}function Zn(o){Lt=o}function gl(o,e,t,i){var P,_,I,j,L,S,x,E,A,C,k,R,M,O,D,N,q,$,H;let n=t.objects.get(o);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${o}`),null;let a=((P=n.effects)==null?void 0:P.lottie)||{},s=n.transform||{},r=n.render||{};if(a.enabled===!1||r.visible===!1)return null;let l=i==null?void 0:i[o],c=Rr(l);if(!c){let z=(I=(_=n.render)==null?void 0:_.asset)==null?void 0:I.path;if(typeof z=="string"&&z.toLowerCase().endsWith(".json")){let G=ul(z);if(c=Rr(G),c)try{i[o]=c}catch{}}}if(!c){let z=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${o}`,{kind:z}),null}let d=dl();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${o}`),null;let p=(j=a.width)!=null?j:300,u=(L=a.height)!=null?L:300,g=(S=s.scale)!=null?S:1,h=((E=(x=s.position)==null?void 0:x.x)!=null?E:0)+((C=(A=s.offset)==null?void 0:A.x)!=null?C:0),m=((R=(k=s.position)==null?void 0:k.y)!=null?R:0)+((O=(M=s.offset)==null?void 0:M.y)!=null?O:0),f=(D=s.rotation)!=null?D:0,b=(N=r.z_index)!=null?N:100,y=(q=r.alpha)!=null?q:1,w=document.createElement("div");w.style.cssText=`
2695
+ `,o.appendChild(e)}async function da(o,e={}){let t=new al;await t.init({resizeTo:o,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var p,u,g,h;if(!t.renderer)return;let r=(p=s==null?void 0:s.width)!=null?p:o.clientWidth,l=(u=s==null?void 0:s.height)!=null?u:o.clientHeight,c=r&&r>0?r:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(h=window.innerHeight)!=null?h:480;t.renderer.resize(c,d)};o.appendChild(t.canvas),o.style.position="relative",o.style.display="flex",o.style.flexDirection="column",o.style.alignItems="stretch",o.style.width="100%",o.style.height="100dvh",o.style.minHeight="100vh",o.style.maxWidth="100%",o.style.maxHeight="100%",o.style.boxSizing="border-box",o.style.overflow="hidden",e.background&&(o.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(";")),o.appendChild(n),Fe.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(r=>r.pause())}),Fe.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(r=>{r.currentTime>0&&!r.ended&&r.play().catch(()=>{})})}),Fe.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 r=s[0];if(r&&r.contentRect.width>0&&r.contentRect.height>0){let l=Math.round(r.contentRect.width),c=Math.round(r.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(o),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as pa,Ticker as At,ColorMatrixFilter as sl}from"pixi.js";var Qi=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)}},en=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}=Hr("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},tn=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 Qi(n.transform),this.renderer=new en(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&&(At.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,d,p,u,g,h,m,f,b,y;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(d=e==null?void 0:e.motion)==null?void 0:d.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(u=(p=this._config)==null?void 0:p.render)==null?void 0:u.asset)==null?void 0:g.type,a=(m=(h=e==null?void 0:e.render)==null?void 0:h.asset)==null?void 0:m.type,s=(b=(f=this._config)==null?void 0:f.ui)==null?void 0:b.renderMode,r=(y=e==null?void 0:e.ui)==null?void 0:y.renderMode;if((n!==a||s!==r)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} to ${a}/${r}`),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,r;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=(r=(s=this._config)==null?void 0:s.transform)==null?void 0:r.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,r;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=(r=this.transform.scale)!=null?r: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,r,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 pa;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 pa;g.blur=(r=u.blur)!=null?r: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 pa;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let h=new sl,m=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;h.tint(m),t.push(h)}}(d=e.stroke)!=null&&d.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(p=e.distortion)!=null&&p.enabled&&console.warn("[Effects] Distortion effect requires pixi-filters or a displacement map. Install: npm install pixi-filters"),this.pixiObject.filters=t.length>0?t:null}applyIntro(){var d,p,u,g,h,m,f;let e=(d=this._config)==null?void 0:d.motion;if(!e||!((p=e.intro)!=null&&p.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,a=this.transform.position.y,s=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),r=this.transform.scale*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_y)||1);if(this.pixiObject.alpha=(f=t.startAlpha)!=null?f:0,t.startScale!==void 0&&this.pixiObject.scale.set(s*t.startScale,r*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=a+(t.startYOffset||0)),this._introTicker&&At.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,r);return}let l=0,c=b=>{var j,L,S,x,E,C;if(l+=b.deltaTime/60,l<n)return;let y=i>0?Math.min(1,(l-n)/i):1,w=1-Math.pow(1-y,3),v=this.renderer.alpha,T=this.transform.scale*(((L=(j=this._config)==null?void 0:j.effects)==null?void 0:L.scale_x)||1),P=this.transform.scale*(((x=(S=this._config)==null?void 0:S.effects)==null?void 0:x.scale_y)||1),_=this.transform.position.y,I=this.transform.position.x;if(this.pixiObject.alpha=((E=t.startAlpha)!=null?E:0)+(v-((C=t.startAlpha)!=null?C:0))*w,t.startScale!==void 0){let A=t.startScale+(1-t.startScale)*w;this.pixiObject.scale.set(T*A,P*A)}t.startYOffset!==void 0&&(this.pixiObject.y=_+t.startYOffset+(_-(_+t.startYOffset))*w),y>=1&&(At.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=v,this.pixiObject.x=I,this.pixiObject.y=_,this.pixiObject.scale.set(T,P))};this._introTicker=c,At.shared.add(c)}applyMotion(){var p,u,g,h,m,f;let e=(p=this._config)==null?void 0:p.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(this._lastMotionStr===i&&this._tickerCleanup)return;if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),!(((u=e.pulse)==null?void 0:u.enabled)||((g=e.swing)==null?void 0:g.enabled)||((h=e.continuousMove)==null?void 0:h.enabled)||((m=e.continuousRotate)==null?void 0:m.enabled)||((f=e.orbit)==null?void 0:f.enabled)))return;let a=0,s=0,r=0,l=0,c=1/60,d=b=>{var S,x,E,C,A,k,R,M,O,D,N,q,$,H,z,G,Y,V,F,Q,W,K,X,de,ee,we;let y=((S=b.deltaTime)!=null?S:1)*c;a+=b.deltaTime*.05;let w=this.transform.scale,v=w*(((E=(x=this._config)==null?void 0:x.effects)==null?void 0:E.scale_x)||1),T=w*(((A=(C=this._config)==null?void 0:C.effects)==null?void 0:A.scale_y)||1),P=this.transform.position.x,_=this.transform.position.y,I=this.transform.rotation,j=0,L=0;if((k=e.swing)!=null&&k.enabled){let J=(R=e.swing.amplitude)!=null?R:10,le=(M=e.swing.speed)!=null?M:1,ie=Math.sin(a*le)*J;e.swing.axis==="vertical"?L+=ie:e.swing.axis==="both"?(j+=ie,L+=ie):j+=ie}if((O=e.continuousMove)!=null&&O.enabled){let J=(D=e.continuousMove.axis)!=null?D:"x",le=Math.max(0,(N=e.continuousMove.speed)!=null?N:50),ie=Math.sign((q=e.continuousMove.direction)!=null?q:1)||1,se=Math.max(0,($=e.continuousMove.lifetime)!=null?$:0);s+=y;let Ae=se>0?Math.min(s,se):s,Re=le*ie*Ae;(J==="x"||J==="both")&&(j+=Re),(J==="y"||J==="both")&&(L+=Re)}if((H=e.orbit)!=null&&H.enabled){let J=Math.max(0,(z=e.orbit.radius)!=null?z:50),le=Math.max(0,(G=e.orbit.speed)!=null?G:45),ie=Math.sign((Y=e.orbit.direction)!=null?Y:1)||1,se=le*Math.PI/180;l+=se*ie*y;let Ae=(V=e.orbit.pivotOffsetX)!=null?V:0,Re=(F=e.orbit.pivotOffsetY)!=null?F:0;j+=Ae+J*Math.cos(l),L+=Re+J*Math.sin(l)}if(this.pixiObject.x=P+j,this.pixiObject.y=_+L,(Q=e.pulse)!=null&&Q.enabled){let J=(W=e.pulse.intensity)!=null?W:.1,le=(K=e.pulse.speed)!=null?K:1,se=1+Math.sin(a*le)*J;(X=this.pixiObject.scale)!=null&&X.set?this.pixiObject.scale.set(v*se,T*se):this.pixiObject.scale&&(this.pixiObject.scale.x=v*se,this.pixiObject.scale.y=T*se)}if((de=e.continuousRotate)!=null&&de.enabled){let J=Math.max(0,(ee=e.continuousRotate.speed)!=null?ee:90),le=Math.sign((we=e.continuousRotate.direction)!=null?we:1)||1,ie=J*Math.PI/180;r+=ie*le*y,this.pixiObject.rotation=I+r}};At.shared.add(d),this._tickerCleanup=()=>{var b,y,w,v,T;if(At.shared.remove(d),this.pixiObject){let P=this.transform.scale*(((y=(b=this._config)==null?void 0:b.effects)==null?void 0:y.scale_x)||1),_=this.transform.scale*(((v=(w=this._config)==null?void 0:w.effects)==null?void 0:v.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(T=this.pixiObject.scale)!=null&&T.set?this.pixiObject.scale.set(P,_):this.pixiObject.scale&&(this.pixiObject.scale.x=P,this.pixiObject.scale.y=_)}}}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)}},Vt=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 tn(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 r=await this.onObjectRebuildRequired(e,s);r&&this.objects.get(e)===r&&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 nn={"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 rl(o){let e=nn[o];return e?e.family:(console.warn(`Font ID "${o}" not found in registry, using fallback`),"Arial, sans-serif")}function ol(o){var t;let e=nn[o];return e&&(t=e.weight)!=null?t:"400"}function ll(o,e){nn[o]=e}function cl(){return Object.keys(nn)}var Lt=null;function dl(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!Lt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),Lt||(typeof window!="undefined"&&window.lottie?(Lt=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(o=>o.toLowerCase().includes("lottie")):"no window"),Lt=null)),Lt}function pl(o){return!o||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("/")?o:`/${o.replace(/^\.\//,"")}`}function ul(o){try{let e=new XMLHttpRequest;return e.open("GET",pl(o),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Rr(o){return!o||typeof o!="object"||!Array.isArray(o.layers)?null:(Array.isArray(o.assets)||(o.assets=[]),Array.isArray(o.chars)||(o.chars=[]),o)}function Zn(o){Lt=o}function gl(o,e,t,i){var P,_,I,j,L,S,x,E,C,A,k,R,M,O,D,N,q,$,H;let n=t.objects.get(o);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${o}`),null;let a=((P=n.effects)==null?void 0:P.lottie)||{},s=n.transform||{},r=n.render||{};if(a.enabled===!1||r.visible===!1)return null;let l=i==null?void 0:i[o],c=Rr(l);if(!c){let z=(I=(_=n.render)==null?void 0:_.asset)==null?void 0:I.path;if(typeof z=="string"&&z.toLowerCase().endsWith(".json")){let G=ul(z);if(c=Rr(G),c)try{i[o]=c}catch{}}}if(!c){let z=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${o}`,{kind:z}),null}let d=dl();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${o}`),null;let p=(j=a.width)!=null?j:300,u=(L=a.height)!=null?L:300,g=(S=s.scale)!=null?S:1,h=((E=(x=s.position)==null?void 0:x.x)!=null?E:0)+((A=(C=s.offset)==null?void 0:C.x)!=null?A:0),m=((R=(k=s.position)==null?void 0:k.y)!=null?R:0)+((O=(M=s.offset)==null?void 0:M.y)!=null?O:0),f=(D=s.rotation)!=null?D:0,b=(N=r.z_index)!=null?N:100,y=(q=r.alpha)!=null?q:1,w=document.createElement("div");w.style.cssText=`
2696
2696
  position: absolute;
2697
2697
  top: calc(50% + ${m}px);
2698
2698
  left: calc(50% + ${h}px);
@@ -2702,4 +2702,4 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2702
2702
  pointer-events: none;
2703
2703
  z-index: ${b};
2704
2704
  opacity: ${y};
2705
- `,e.appendChild(w);let v;try{v=d.loadAnimation({container:w,renderer:a.renderer||"svg",loop:($=a.loop)!=null?$:!1,autoplay:(H=a.autoplay)!=null?H:!0,animationData:c})}catch(z){return w.parentNode&&w.parentNode.removeChild(w),console.warn(`[LottieOverlay] Failed to start animation: ${o}`,z),null}a.speed!==void 0&&v.setSpeed(a.speed);let T=()=>{v.destroy(),w.parentNode&&w.parentNode.removeChild(w)};return a.loop||v.addEventListener("complete",T),{animation:v,cleanup:T}}var ua=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 da(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 Vt(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 Yt=class{setContext(e){this.context=e}};var Wt=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 Or from"pixi.js";var hl=Or;typeof window!="undefined"&&(window.__basePixi=Or);import{Sprite as ml,Text as fl,TextStyle as bl,Texture as zr}from"pixi.js";var $r=o=>o*Math.PI/180;function yl(o,e){var s,r,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 bl({fontFamily:(r=t.font)!=null?r:"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 fl({text:t.text,style:n});return a.label=o,a}function vl(o){var d,p,u,g,h,m,f,b,y,w;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:s}=o,r={},l={},c={};t.sortableChildren=!0;for(let[v,T]of i.objects.entries()){if(s!=null&&s.has(v)||a&&!a.has(v)||(T==null?void 0:T.enabled)===!1)continue;let P=(p=(d=T==null?void 0:T.render)==null?void 0:d.asset)==null?void 0:p.path,_=(g=(u=T==null?void 0:T.render)==null?void 0:u.asset)==null?void 0:g.type,I=!!(P&&_==="image"),j=!!((h=T==null?void 0:T.ui)!=null&&h.text),L=j?(m=T==null?void 0:T.ui)==null?void 0:m.renderMode:void 0,S;if(L==="png"&&I?S="png":L==="text"&&j?S="text":I?S="png":j?S="text":S="skip",S!=="skip"){if(S==="text"){let x=yl(v,T);if(!x)continue;let E=T.render;x.alpha=typeof(E==null?void 0:E.alpha)=="number"?E.alpha:1,x.visible=(E==null?void 0:E.visible)!==!1,x.zIndex=typeof(E==null?void 0:E.z_index)=="number"?E.z_index:0,E!=null&&E.anchor&&typeof E.anchor.x=="number"&&typeof E.anchor.y=="number"?x.anchor.set(E.anchor.x,E.anchor.y):x.anchor.set(.5,.5);let A=T.transform,C=(A==null?void 0:A.position)||(A==null?void 0:A.offset);C&&x.position.set((f=C.x)!=null?f:0,(b=C.y)!=null?b:0);let k=typeof(A==null?void 0:A.scale)=="number"?A.scale:1;x.scale.set(k,k);let R=typeof(A==null?void 0:A.rotation)=="number"?A.rotation:0;x.rotation=$r(R),x.parent||t.addChild(x);try{n.create(v,x)}catch{}r[v]=x,c[v]=x}else if(S==="png"){let x=Te[v]||(typeof zr!="undefined"?zr.EMPTY:void 0),E=new ml(x);E.label=v;let A=T.render;E.alpha=typeof(A==null?void 0:A.alpha)=="number"?A.alpha:1,E.visible=(A==null?void 0:A.visible)!==!1,E.zIndex=typeof(A==null?void 0:A.z_index)=="number"?A.z_index:0,A!=null&&A.anchor&&typeof A.anchor.x=="number"&&typeof A.anchor.y=="number"&&E.anchor.set(A.anchor.x,A.anchor.y);let C=T.transform,k=(C==null?void 0:C.position)||(C==null?void 0:C.offset);k&&E.position.set((y=k.x)!=null?y:0,(w=k.y)!=null?w:0);let R=typeof(C==null?void 0:C.scale)=="number"?C.scale:1;E.scale.set(R,R);let M=typeof(C==null?void 0:C.rotation)=="number"?C.rotation:0;E.rotation=$r(M),E.parent||t.addChild(E);try{n.create(v,E)}catch{}r[v]=E,l[v]=E}}}return t.parent||e.addChild(t),{objects:r,sprites:l,texts:c}}var ga=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Wt}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 r;let s=this.registry.get(a);if(!s){console.warn("[Assets] No config found for object:",a);return}try{let l=await Me.create(a,s,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(r=l==null?void 0:l.constructor)==null?void 0:r.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 Me.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},Dr=new ga,wl=new Proxy(Dr,{get(o,e){if(e in o&&typeof o[e]=="function")return o[e].bind(o);if(o.get(e))return o.get(e)}});function xl(o,e){Dr.init(o,e)}var ha=class extends Yt{async init(){sn(this.context.config,this.context.app),await Te.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};function Sl(o){var r,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=o,s=((l=(r=n.engine)==null?void 0:r.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{Ss as a,da as b,Qi as c,en as d,tn as e,Vt as f,rl as g,ol as h,ll as i,cl as j,Zn as k,gl as l,Me as m,ua as n,Yt as o,Wt as p,hl as q,vl as r,wl as s,xl as t,ha as u,xi as v,Jr as w,fn as x,$e as y,Se as z,De as A,bn as B,ho as C,Sl as D,Es as E,As as F,hn as G,dt as H,Ol as I,qi as J,Yn as K,mr as L,Kn as M,Yp as N,Wp as O,Be as P,Vo as Q,Yo as R,ea as S,_e as T,Fe as U};
2705
+ `,e.appendChild(w);let v;try{v=d.loadAnimation({container:w,renderer:a.renderer||"svg",loop:($=a.loop)!=null?$:!1,autoplay:(H=a.autoplay)!=null?H:!0,animationData:c})}catch(z){return w.parentNode&&w.parentNode.removeChild(w),console.warn(`[LottieOverlay] Failed to start animation: ${o}`,z),null}a.speed!==void 0&&v.setSpeed(a.speed);let T=()=>{v.destroy(),w.parentNode&&w.parentNode.removeChild(w)};return a.loop||v.addEventListener("complete",T),{animation:v,cleanup:T}}var ua=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 da(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 Vt(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 Yt=class{setContext(e){this.context=e}};var Wt=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 Or from"pixi.js";var hl=Or;typeof window!="undefined"&&(window.__basePixi=Or);import{Sprite as ml,Text as fl,TextStyle as bl,Texture as zr}from"pixi.js";var $r=o=>o*Math.PI/180;function yl(o,e){var s,r,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 bl({fontFamily:(r=t.font)!=null?r:"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 fl({text:t.text,style:n});return a.label=o,a}function vl(o){var d,p,u,g,h,m,f,b,y,w;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:s}=o,r={},l={},c={};t.sortableChildren=!0;for(let[v,T]of i.objects.entries()){if(s!=null&&s.has(v)||a&&!a.has(v)||(T==null?void 0:T.enabled)===!1)continue;let P=(p=(d=T==null?void 0:T.render)==null?void 0:d.asset)==null?void 0:p.path,_=(g=(u=T==null?void 0:T.render)==null?void 0:u.asset)==null?void 0:g.type,I=!!(P&&_==="image"),j=!!((h=T==null?void 0:T.ui)!=null&&h.text),L=j?(m=T==null?void 0:T.ui)==null?void 0:m.renderMode:void 0,S;if(L==="png"&&I?S="png":L==="text"&&j?S="text":I?S="png":j?S="text":S="skip",S!=="skip"){if(S==="text"){let x=yl(v,T);if(!x)continue;let E=T.render;x.alpha=typeof(E==null?void 0:E.alpha)=="number"?E.alpha:1,x.visible=(E==null?void 0:E.visible)!==!1,x.zIndex=typeof(E==null?void 0:E.z_index)=="number"?E.z_index:0,E!=null&&E.anchor&&typeof E.anchor.x=="number"&&typeof E.anchor.y=="number"?x.anchor.set(E.anchor.x,E.anchor.y):x.anchor.set(.5,.5);let C=T.transform,A=(C==null?void 0:C.position)||(C==null?void 0:C.offset);A&&x.position.set((f=A.x)!=null?f:0,(b=A.y)!=null?b:0);let k=typeof(C==null?void 0:C.scale)=="number"?C.scale:1;x.scale.set(k,k);let R=typeof(C==null?void 0:C.rotation)=="number"?C.rotation:0;x.rotation=$r(R),x.parent||t.addChild(x);try{n.create(v,x)}catch{}r[v]=x,c[v]=x}else if(S==="png"){let x=Te[v]||(typeof zr!="undefined"?zr.EMPTY:void 0),E=new ml(x);E.label=v;let C=T.render;E.alpha=typeof(C==null?void 0:C.alpha)=="number"?C.alpha:1,E.visible=(C==null?void 0:C.visible)!==!1,E.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"&&E.anchor.set(C.anchor.x,C.anchor.y);let A=T.transform,k=(A==null?void 0:A.position)||(A==null?void 0:A.offset);k&&E.position.set((y=k.x)!=null?y:0,(w=k.y)!=null?w:0);let R=typeof(A==null?void 0:A.scale)=="number"?A.scale:1;E.scale.set(R,R);let M=typeof(A==null?void 0:A.rotation)=="number"?A.rotation:0;E.rotation=$r(M),E.parent||t.addChild(E);try{n.create(v,E)}catch{}r[v]=E,l[v]=E}}}return t.parent||e.addChild(t),{objects:r,sprites:l,texts:c}}var ga=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Wt}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 r;let s=this.registry.get(a);if(!s){console.warn("[Assets] No config found for object:",a);return}try{let l=await Me.create(a,s,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(r=l==null?void 0:l.constructor)==null?void 0:r.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 Me.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},Dr=new ga,wl=new Proxy(Dr,{get(o,e){if(e in o&&typeof o[e]=="function")return o[e].bind(o);if(o.get(e))return o.get(e)}});function xl(o,e){Dr.init(o,e)}var ha=class extends Yt{async init(){sn(this.context.config,this.context.app),await Te.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};function Sl(o){var r,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=o,s=((l=(r=n.engine)==null?void 0:r.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{Ss as a,da as b,Qi as c,en as d,tn as e,Vt as f,rl as g,ol as h,ll as i,cl as j,Zn as k,gl as l,Me as m,ua as n,Yt as o,Wt as p,hl as q,vl as r,wl as s,xl as t,ha as u,xi as v,Jr as w,fn as x,$e as y,Se as z,De as A,bn as B,ho as C,Sl as D,Es as E,Cs as F,hn as G,dt as H,Ol as I,qi as J,Yn as K,mr as L,Kn as M,Yp as N,Wp as O,Be as P,Vo as Q,Yo as R,ea as S,_e as T,Fe as U};