handler-playable-sdk 1.0.95 → 1.0.101

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 (48) hide show
  1. package/dist/ConfigOverride-SLXAGR2M.js +1 -0
  2. package/dist/chunk-2MR65LDX.js +1 -0
  3. package/dist/chunk-FOTLNUIS.js +1 -0
  4. package/dist/{chunk-LWADIFXM.js → chunk-RZAAEBBT.js} +137 -134
  5. package/dist/cli/brand-dna.mjs +1 -1
  6. package/dist/cli/canva-import.mjs +1 -1
  7. package/dist/cli/cleanup-assets.mjs +1 -1
  8. package/dist/cli/fix-scales.mjs +1 -1
  9. package/dist/cli/index.js +1 -1
  10. package/dist/cli/screen-helper.mjs +1 -1
  11. package/dist/cli/setup-library.mjs +1 -1
  12. package/dist/cli/student-helper/add-logic.mjs +1 -1
  13. package/dist/cli/student-helper/add-object.mjs +1 -1
  14. package/dist/cli/student-helper/arg-parsing.mjs +1 -1
  15. package/dist/cli/student-helper/asset-registry.mjs +1 -1
  16. package/dist/cli/student-helper/bullet-system.mjs +1 -1
  17. package/dist/cli/student-helper/collectable-system.mjs +1 -1
  18. package/dist/cli/student-helper/constants.mjs +1 -1
  19. package/dist/cli/student-helper/drag-snap-couples.mjs +1 -1
  20. package/dist/cli/student-helper/endgame-screen.mjs +1 -1
  21. package/dist/cli/student-helper/fs-io.mjs +1 -1
  22. package/dist/cli/student-helper/logic-defaults.mjs +1 -1
  23. package/dist/cli/student-helper/print-help.mjs +1 -1
  24. package/dist/cli/student-helper/prompts.mjs +1 -1
  25. package/dist/cli/student-helper/scratch-card.mjs +1 -1
  26. package/dist/cli/student-helper/screen-utils.mjs +1 -1
  27. package/dist/cli/student-helper/snippets.mjs +1 -1
  28. package/dist/cli/student-helper/start-screen.mjs +1 -1
  29. package/dist/cli/student-helper/swerve-collect.mjs +1 -1
  30. package/dist/cli/student-helper/tap-destroy.mjs +1 -1
  31. package/dist/cli/student-helper/template-packs.mjs +1 -1
  32. package/dist/cli/student-helper.mjs +1 -1
  33. package/dist/cli/sync-screens.mjs +1 -1
  34. package/dist/cli/validate-assets.mjs +1 -1
  35. package/dist/cli/validate.mjs +1 -1
  36. package/dist/{config-VJNOXXCC.js → config-HQX4AQNX.js} +1 -1
  37. package/dist/index.cjs +151 -148
  38. package/dist/index.d.cts +7 -4
  39. package/dist/index.d.ts +7 -4
  40. package/dist/index.js +1 -1
  41. package/dist/pixi/index.cjs +12 -12
  42. package/dist/pixi/index.js +1 -1
  43. package/dist/three/index.cjs +22 -22
  44. package/dist/three/index.js +1 -1
  45. package/package.json +1 -1
  46. package/dist/ConfigOverride-2HOZGV6G.js +0 -1
  47. package/dist/chunk-5IRAZMOA.js +0 -1
  48. package/dist/chunk-SDFKEAA5.js +0 -1
@@ -1,4 +1,4 @@
1
- import{a as Kt,c as tn,d as Ce,e as nn}from"./chunk-I5OOVR5U.js";import{i as Zt}from"./chunk-5IRAZMOA.js";import{c as Re,d as Xt,e as Ze,g as Na,h as an,j as Fa,k as Ba,n as Tt,o as Jt,p as st,q as Ga,r as sn,s as Ua}from"./chunk-SDFKEAA5.js";import{a as Dr}from"./chunk-JXBG6UFL.js";import{Application as al}from"pixi.js";var qe={};function Qt(o,e,t=!1){qe[o]||(qe[o]=[]),qe[o].push({fn:e,once:t})}function rn(o,e){if(qe[o]){if(!e){delete qe[o];return}qe[o]=qe[o].filter(t=>t.fn!==e)}}function ei(o,...e){let t=qe[o];if(t)for(let i of[...t])i.fn(...e),i.once&&rn(o,i.fn)}function fe(o,e){Qt(o,e,!0)}var ne=null,ve=[],rt=null;function Ya(o){ne=o,ve=[],rt!==null&&(clearTimeout(rt),rt=null)}function Wa(){var o,e,t;return{endpoint:(ne==null?void 0:ne.endpoint)||"",transport:(ne==null?void 0:ne.transport)||"beacon",batchSize:(o=ne==null?void 0:ne.batchSize)!=null?o:10,flushIntervalMs:(e=ne==null?void 0:ne.flushIntervalMs)!=null?e:300,maxQueue:(t=ne==null?void 0:ne.maxQueue)!=null?t:200,debug:!!(ne!=null&&ne.debug)}}async function qa(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 on(o,e){let t=Wa();if(e&&t.endpoint){if(ve.push(o),ve.length>t.maxQueue&&(ve=ve.slice(ve.length-t.maxQueue)),ve.length>=t.batchSize){Va();return}rt===null&&(rt=window.setTimeout(()=>{rt=null,Va()},t.flushIntervalMs))}}async function Va(){let o=Wa();if(!o.endpoint||ve.length===0)return;let e=ve.splice(0,o.batchSize);await qa(o.endpoint,{events:e},o.transport,o.debug),ve.length>0&&await qa(o.endpoint,{events:ve.splice(0,o.batchSize)},o.transport,o.debug)}function Ka(o){return Math.max(0,Math.min(1,o))}function Hr(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 Nr(o,e){let t=o==null?void 0:o[e];return typeof t=="number"?t:0}function Xa(o,e,t){try{o[e]=t}catch{}}function Fr(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 Ja(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 Za(o,e){let t=Fr(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 Qa(){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 p;o.add(d);let u=(p=e.get(d.target))!=null?p:new Set;u.add(d),e.set(d.target,u),i()},a=d=>{o.delete(d);let u=e.get(d.target);u&&(u.delete(d),u.size===0&&e.delete(d.target))},s=d=>{d.killed||(d.killed=!0,a(d))},r=()=>{var u,p;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=Ka(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 k=m-y;f=Ka(k)}let w=g.ease(f);g.yoyo&&y%2===1&&(w=1-w);for(let k of g.props)Xa(g.target,k.key,k.from+(k.to-k.from)*w);g.scaleFrom&&g.scaleTo&&Ja(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{(u=g.onUpdate)==null||u.call(g)}catch{}if(m>=b){s(g);try{(p=g.onComplete)==null||p.call(g)}catch{}}}},l=(d,u,p)=>{var k;let g=Math.max(0,(typeof u.duration=="number"?u.duration:.5)*1e3),h=Math.max(0,(typeof u.delay=="number"?u.delay:0)*1e3+((k=p==null?void 0:p.delayMsOverride)!=null?k:0)),m=Hr(u.ease),f=typeof u.repeat=="number"?Math.max(0,u.repeat|0):0,b=u.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),w=[];for(let M of Object.keys(u)){if(y.has(M))continue;let _=u[M];typeof _=="number"&&w.push({key:M,from:Nr(d,M),to:_})}let v=Za(d,u);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 u.onUpdate=="function"?u.onUpdate:void 0,onComplete:typeof u.onComplete=="function"?u.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,u){let p=l(d,u);return n(p),{kill:()=>s(p),pause:()=>{p.paused||(p.paused=!0,p.pauseAtMs=Pt())},resume:()=>{var m;if(!p.paused)return;let g=(m=p.pauseAtMs)!=null?m:Pt(),h=Pt()-g;p.startMs+=h,p.paused=!1,p.pauseAtMs=null},isActive:()=>!p.killed&&!p.paused}},fromTo(d,u,p){return c.set(d,u),c.to(d,p)},set(d,u){if(!d||!u)return;for(let g of Object.keys(u)){let h=u[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&Xa(d,g,h)}let p=Za(d,u);p.to&&Ja(d,p.to)},killTweensOf(d){let u=e.get(d);if(u)for(let p of Array.from(u))s(p)},timeline(d={}){let u=[],p=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("+=")?p+Math.max(0,Number(w.slice(2))*1e3||0):w?Math.max(0,Number(w)*1e3||0):p},f=y=>{u.push(y);let w=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);p=Math.max(p,y.atMs+w)},b={to(y,w,v){return f({kind:"to",target:y,vars:w,atMs:m(v)}),b},fromTo(y,w,v,k){return f({kind:"fromTo",target:y,vars:v,from:w,atMs:m(k)}),b},play(){var y,w;if(g)return b;g=!0,h=[];for(let v of u)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 es(){if(typeof window=="undefined")return;let o=window;if(!o.gsap)try{o.gsap=Qa()}catch{}}var ts={name:"handler-playable-sdk",version:"1.0.95",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 be=0,Gr=be++,is=be++,ns=be++,as=be++,ss=be++,rs=be++,os=be++,ls=be++,cs=be++,ds=be++,ps=be++,us=be++,Q=Gr;function gs(){return Q===is}function hs(){return Q===ns}function ms(){return Q===as}function fs(){return Q===ss}function ot(){return Q===rs}function lt(){return Q===os}function bs(){return Q===ls}function ys(){return Q===cs}function vs(){return Q===ds}function ln(){return Q===ps}function cn(){return Q===us}function ws(){let o=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(o==="mraid")try{mraid.getState(),Q=is;return}catch{}else if(o==="dapi")try{dapi.isReady(),Q=ns;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(Q=as)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(Q=ss)}catch{}else if(e==="mintegral")window.gameReady&&(Q=rs);else if(e==="tapjoy")window.TJ_API&&(Q=os);else if(e==="tiktok")window.openAppStore&&(Q=ls);else if(e==="smadex")try{window.smxTracking&&(Q=cs)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(Q=ds)}catch{}else e==="vungle"?Q=ps:(o==="nucleo"||e==="nucleo")&&(Q=us)}import dn from"lottie-web";var xs=dn;typeof window!="undefined"&&(window.lottie=dn,window.__baseLottie=dn);function ae(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:ae(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:ae(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:ae(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:ae(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:ae(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:ae(360,780)}],_l=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:ae(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:ae(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:ae(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:ae(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:ae(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:ae(412,915)}],Rl=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:ae(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:ae(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:ae(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:ae(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:ae(800,1280)}],pn=[{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:ae(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:ae(768,1024),mraidScale:.7}];var Ss=[...pn],Es=[{category:"playable",label:"Playable Ad",devices:pn}],un=pn[0];function ct(o){return Ss.find(e=>e.id===o)||un}function Ol(o){return Ss.filter(e=>e.category===o)}var Le=class{async updateProperty(e,t,i,n={}){var l,c,d,u,p,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(Re({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&&(((u=v==null?void 0:v.intro)==null?void 0:u.enabled)===!0||((p=v==null?void 0:v.pulse)==null?void 0:p.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 T=window.__editableConfig,j=(w=(y=(b=T==null?void 0:T.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 k=window.__editableConfig,M=(d=(c=(l=k==null?void 0:k.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:s;await v(e,M),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 gn(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",u=d==="jpg"?"jpeg":d,p=`${c||"new_asset"}_uploaded_${Date.now()}.${u}`;console.log("[QuickActionsBar] Uploading file:",p,"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:p,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(L=>setTimeout(L,100));let w=window.addAssetToRegistry;typeof w=="function"&&(w(l,p),console.log("[QuickActionsBar] \u2705 Added to registry:",l,p));let v=window.getEditableAssets;if(typeof v=="function"){let L=v();L&&!L.categories&&(L.categories=[]),L!=null&&L.categories&&!L.categories.includes(l)&&(L.categories.push(l),console.log(`[QuickActionsBar] Added category ${l} to registry`))}let k=!1,M=0,_=10;for(;!k&&M<_;){M++,console.log(`[QuickActionsBar] Refresh attempt ${M}/${_}...`);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(x=>setTimeout(x,300));let L=window.refreshAssetLibrary;typeof L=="function"&&(console.log("[QuickActionsBar] Refreshing library panel..."),await L());let E=window.reRenderAssetLibrary;typeof E=="function"&&(console.log("[QuickActionsBar] Re-rendering library panel..."),E());let A=window.getEditableAssets;if(typeof A=="function"){let x=A(),S=((h=x==null?void 0:x.libraryAssets)==null?void 0:h[l])||[];S.some(R=>(R==null?void 0:R.filename)===p)?(console.log("[QuickActionsBar] \u2705 Asset found in registry!"),k=!0):(console.log(`[QuickActionsBar] Asset not found yet, retrying... (found ${S.length} assets in ${l})`),await new Promise(R=>setTimeout(R,500)))}else M>=2&&(k=!0)}k||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(L){console.warn("[QuickActionsBar] Failed to refresh textures:",L)}},300),console.log("[QuickActionsBar] Applying asset to object:",y.path);let T=!1,j=0,P=5;for(;!T&&j<P;){j++;try{await o.onApply(y.path),await new Promise(E=>setTimeout(E,200));let L=window.getEditableObjectConfig;if(typeof L=="function"){let E=L(o.objectId),A=((f=(m=E==null?void 0:E.render)==null?void 0:m.asset)==null?void 0:f.path)||"";A===y.path||A.includes(p)?(console.log("[QuickActionsBar] \u2705 Asset confirmed applied to object"),T=!0):(console.log(`[QuickActionsBar] Asset not applied yet (attempt ${j}), retrying...`),await new Promise(x=>setTimeout(x,300)))}else T=!0}catch(L){console.error(`[QuickActionsBar] Apply attempt ${j} failed:`,L),j<P&&await new Promise(E=>setTimeout(E,500))}}T?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 ti=class{constructor(){this.updateManager=new Le}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 u=window.reRenderAssetLibrary;typeof u=="function"&&u()}}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");gn({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 u=window.__debugContext;(h=(g=u==null?void 0:u.options)==null?void 0:g.onPropertyChange)==null||h.call(g,e,t,r);let p=window.__highlightLibrarySlot;typeof p=="function"&&setTimeout(()=>{p(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 Ur=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],qr=["environment","ui","character","system","backgrounds"],Vr=["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}}},ii=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-FOTLNUIS.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.101",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=`
2
2
  <div class="wizard-card">
3
3
  <div class="wizard-header">
4
4
  <div class="wizard-title">
@@ -50,19 +50,19 @@ import{a as Kt,c as tn,d as Ce,e as nn}from"./chunk-I5OOVR5U.js";import{i as Zt}
50
50
  <div class="wizard-field-group">
51
51
  <label class="wizard-label required">Category</label>
52
52
  <select class="wizard-select" data-field="category">
53
- ${qr.map(e=>`<option value="${e}">${e}</option>`).join("")}
53
+ ${Vr.map(e=>`<option value="${e}">${e}</option>`).join("")}
54
54
  </select>
55
55
  </div>
56
56
  <div class="wizard-field-group">
57
57
  <label class="wizard-label required">Screen</label>
58
58
  <select class="wizard-select" data-field="screenId" required>
59
- ${Ur.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}
59
+ ${qr.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}
60
60
  </select>
61
61
  </div>
62
62
  <div class="wizard-field-group">
63
63
  <label class="wizard-label required">Layer</label>
64
64
  <select class="wizard-select" data-field="layer">
65
- ${Vr.map(e=>`<option value="${e}">${e}</option>`).join("")}
65
+ ${Yr.map(e=>`<option value="${e}">${e}</option>`).join("")}
66
66
  </select>
67
67
  </div>
68
68
  </div>
@@ -225,7 +225,7 @@ import{a as Kt,c as tn,d as Ce,e as nn}from"./chunk-I5OOVR5U.js";import{i as Zt}
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(As).map(e=>`<option value="${e}">${e}</option>`).join("")}
228
+ ${Object.keys(Cs).map(e=>`<option value="${e}">${e}</option>`).join("")}
229
229
  </select>
230
230
  </div>
231
231
  <div class="wizard-field-group">
@@ -252,14 +252,14 @@ import{a as Kt,c as tn,d as Ce,e as nn}from"./chunk-I5OOVR5U.js";import{i as Zt}
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";gn({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`
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`
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>
259
259
  </div>
260
260
  `});e.innerHTML=t.join("")}updateTypeSections(){if(!this.modal||!this.state)return;let e=this.state.objectType;Array.from(this.modal.querySelectorAll("[data-type-section]")).forEach(n=>{let a=n.dataset.typeSection,r=a==="sprite"&&(e==="sprite"||e==="ui-image")||a===e;n.style.display=r?"block":"none"});let i=this.modal.querySelector("[data-type-help]");if(i){let n=e==="ui-text"?"UI text uses the UI renderer with font settings.":e==="graphics"?"Graphics are simple shapes with width/height and fill.":e==="container"?"Containers are empty parents for grouping objects.":"Sprite/UI image uses image assets.";i.textContent=n}}syncFieldValues(){if(!this.modal||!this.state)return;let e=this.state;Array.from(this.modal.querySelectorAll("[data-field]")).forEach(n=>{let a=n.dataset.field;if(!a)return;let s=e[a];n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked=!!s:typeof s!="undefined"&&(n.value=String(s))}),Array.from(this.modal.querySelectorAll("[data-object-type]")).forEach(n=>{n.classList.toggle("selected",n.dataset.objectType===this.state.objectType)})}updatePreview(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-preview-json]"),t=this.modal.querySelector("[data-validation-errors]");if(!e||!t)return;let i=this.buildPayload();e.textContent=JSON.stringify(i,null,2);let n=this.validate();n.length>0?(t.style.display="block",t.textContent=n.join(`
261
261
  `)):(t.style.display="none",t.textContent="")}updateActionButtons(){if(!this.modal||!this.state)return;let e=this.modal.querySelector('[data-action="back"]'),t=this.modal.querySelector('[data-action="next"]');e&&(e.disabled=this.state.step===1),t&&(t.textContent=this.state.step===6?"Create":"Next",t.disabled=this.state.step===6&&this.validate().length>0)}validate(){if(!this.state)return[];let e=[],t=this.state.instanceId.trim();return t||e.push("Object ID is required."),t.startsWith("json.")&&e.push('Object ID must not start with "json." (instance id only).'),t&&!/^[a-zA-Z0-9._-]+$/.test(t)&&e.push("Object ID must use letters, numbers, dot, dash, or underscore."),t&&!this.isInstanceIdUnique(t)&&e.push(`Object ID "${t}" already exists.`),(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&!this.state.assetPath.trim()&&e.push("Asset path is required for image-based objects."),this.state.objectType==="ui-text"&&!this.state.text.trim()&&e.push("Text content is required for UI Text."),e}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}buildPayload(){if(!this.state)return{};let e=this.state.instanceId.trim(),t=`json.${e}`;return{screenId:this.state.screenId,instanceId:e,objectConfigId:t,layer:this.state.layer,config:this.buildObjectConfig(t),forceSync:!0}}buildObjectConfig(e){if(!this.state)return{};let t=this.state.category||"environment",i={identity:{id:e,category:t},transform:{position:{x:this.state.positionX,y:this.state.positionY},offset:{x:this.state.offsetX,y:this.state.offsetY},scale:this.state.scale,rotation:this.state.rotation,anchor:this.state.anchorPreset==="custom"?{x:this.state.anchorX,y:this.state.anchorY}:this.state.anchorPreset,position_ratio:null,position_mode:this.state.positionMode},render:{alpha:this.state.alpha,visible:!0,tint:this.state.tint||null,z_index:this.state.zIndex},instance_id:this.state.instanceId.trim(),object_config:e};return(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&(i.render.asset={type:"image",path:this.normalizeAssetPath(this.state.assetPath.trim())}),this.state.objectType==="ui-text"&&(i.ui={kind:"text",renderMode:"text",text:this.state.text,font:this.state.font,fontSize:this.state.fontSize,letterSpacing:this.state.letterSpacing,align:this.state.align,color:this.state.tint||"#FFFFFF"},i.render.tint=null),this.state.objectType==="graphics"&&(i.effects={width:this.state.graphicsWidth,height:this.state.graphicsHeight,fill_color:this.state.graphicsFill,fill_alpha:this.state.graphicsAlpha}),this.state.interactionEnabled&&(i.interaction={enabled:!0,drag:{enabled:this.state.dragEnabled},hover:{enabled:this.state.hoverEnabled},click:{enabled:this.state.clickEnabled}}),this.state.logicId&&(i.logic={id:this.state.logicId,props:this.parseLogicProps(this.state.logicPropsRaw)}),i}parseLogicProps(e){if(!e||!e.trim())return{};try{return JSON.parse(e)}catch{return{}}}normalizeAssetPath(e){return!e||e.startsWith("raw/")?e:e.startsWith("/raw/")?e.replace(/^\/raw\//,"raw/"):e}async submit(){var i;if(!this.state)return;if(this.validate().length>0){this.updatePreview();return}let t=this.buildPayload();try{let n=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let s=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
262
- `))||(a==null?void 0:a.error)||"Failed to create object.";alert(s);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),this.close()}catch(n){alert(`Failed to create object: ${n instanceof Error?n.message:String(n)}`)}}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("[AddObjectWizard] Failed to sync screens:",e)}}};var dt=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.options=e}open(e){this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=`
262
+ `))||(a==null?void 0:a.error)||"Failed to create object.";alert(s);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),this.close()}catch(n){alert(`Failed to create object: ${n instanceof Error?n.message:String(n)}`)}}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("[AddObjectWizard] Failed to sync screens:",e)}}};var pt=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.options=e}open(e){this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=`
263
263
  <div class="context-menu-item" data-action="add-logic">\u2699\uFE0F Add Logic</div>
264
264
  <div class="context-menu-separator"></div>
265
265
  <div class="context-menu-item-wrapper">
@@ -285,10 +285,10 @@ import{a as Kt,c as tn,d as Ce,e as nn}from"./chunk-I5OOVR5U.js";import{i as Zt}
285
285
  <div class="context-menu-separator"></div>
286
286
  <div class="context-menu-item danger" data-action="delete">\u{1F5D1}\uFE0F Delete</div>
287
287
  `,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,s=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),s>0&&(this.menu.style.top=`${i-s-8}px`)}attachListeners(){if(!this.menu)return;let e=this.menu.querySelector('[data-action="image-menu"]'),t=this.menu.querySelector('[data-submenu="image-menu"]'),i=e==null?void 0:e.parentElement;if(e&&t&&i){i.style.position="relative",e.addEventListener("mouseenter",()=>{t.style.display="block"}),t.addEventListener("mouseenter",()=>{t.style.display="block"});let n=()=>{setTimeout(()=>{!t.matches(":hover")&&!e.matches(":hover")&&(t.style.display="none")},100)};e.addEventListener("mouseleave",n),t.addEventListener("mouseleave",()=>{t.style.display="none"})}this.menu.addEventListener("click",n=>{let s=n.target.dataset.action;s&&(n.stopPropagation(),this.handleAction(s))}),this.closeHandler=n=>{let a=n.target;this.menu&&a&&this.menu.contains(a)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=n=>{n.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler)}handleAction(e){var t,i;switch(e){case"image-menu":return;case"change-image":this.handleChangeImage();break;case"edit-image-crop":this.handleEditImageCrop();break;case"edit-image-ai":this.handleEditImageAI();break;case"upload-image":this.handleUploadImage();break;case"go-to-library":this.handleGoToLibrary();break;case"add-logic":this.handleAddLogic();break;case"duplicate":this.handleDuplicate();break;case"rename":this.handleRename();break;case"move":this.handleMove();break;case"copy":this.handleCopyConfig();break;case"inspect":this.handleOpenInspector();break;case"delete":(i=(t=this.options).onDeleteRequest)==null||i.call(t,this.options.objectId),this.close();break}}async handleDuplicate(){var n,a,s,r,l;let e=`${this.options.objectId}_copy`,t=window.prompt("New instance ID",e);if(!t)return;if(!this.isInstanceIdUnique(t)){alert(`Instance ID "${t}" already exists.`);return}let i=window.confirm(`Share config with original?
288
- OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sourceId:this.options.objectId,newInstanceId:t,shareConfig:i,screenId:this.options.screenId})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let u=((n=d==null?void 0:d.errors)==null?void 0:n.join(`
289
- `))||(d==null?void 0:d.error)||"Duplicate failed.";alert(u);return}(s=(a=this.options).onRefresh)==null||s.call(a),(l=(r=this.options).onSelect)==null||l.call(r,t),this.close()}catch(c){alert(`Duplicate failed: ${c instanceof Error?c.message:String(c)}`)}}async handleRename(){var t,i,n,a,s;let e=window.prompt("New instance ID",this.options.objectId);if(!(!e||e===this.options.objectId)){if(!this.isInstanceIdUnique(e)){alert(`Instance ID "${e}" already exists.`);return}try{let r=await fetch("/api/objects/rename",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,screenId:this.options.screenId,newInstanceId:e})}),l=await r.json().catch(()=>({}));if(!r.ok||(l==null?void 0:l.success)===!1){let c=((t=l==null?void 0:l.errors)==null?void 0:t.join(`
288
+ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sourceId:this.options.objectId,newInstanceId:t,shareConfig:i,screenId:this.options.screenId})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let p=((n=d==null?void 0:d.errors)==null?void 0:n.join(`
289
+ `))||(d==null?void 0:d.error)||"Duplicate failed.";alert(p);return}(s=(a=this.options).onRefresh)==null||s.call(a),(l=(r=this.options).onSelect)==null||l.call(r,t),this.close()}catch(c){alert(`Duplicate failed: ${c instanceof Error?c.message:String(c)}`)}}async handleRename(){var t,i,n,a,s;let e=window.prompt("New instance ID",this.options.objectId);if(!(!e||e===this.options.objectId)){if(!this.isInstanceIdUnique(e)){alert(`Instance ID "${e}" already exists.`);return}try{let r=await fetch("/api/objects/rename",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,screenId:this.options.screenId,newInstanceId:e})}),l=await r.json().catch(()=>({}));if(!r.ok||(l==null?void 0:l.success)===!1){let c=((t=l==null?void 0:l.errors)==null?void 0:t.join(`
290
290
  `))||(l==null?void 0:l.error)||"Rename failed.";alert(c);return}(n=(i=this.options).onRefresh)==null||n.call(i),(s=(a=this.options).onSelect)==null||s.call(a,e),this.close()}catch(r){alert(`Rename failed: ${r instanceof Error?r.message:String(r)}`)}}}async handleMove(){var i,n,a;let e=window.prompt("Move to screen (loading/start/gameplay/tutorial/endgame)",this.options.screenId);if(!e)return;let t=e.trim();if(!["loading","start","gameplay","tutorial","endgame"].includes(t)){alert("Invalid screen. Use: loading, start, gameplay, tutorial, endgame.");return}if(t!==this.options.screenId){if(this.options.onMoveRequest){this.options.onMoveRequest(this.options.objectId,t),this.close();return}try{let s=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,fromScreenId:this.options.screenId,toScreenId:t})}),r=await s.json().catch(()=>({}));if(!s.ok||(r==null?void 0:r.success)===!1){let l=((i=r==null?void 0:r.errors)==null?void 0:i.join(`
291
- `))||(r==null?void 0:r.error)||"Move failed.";alert(l);return}(a=(n=this.options).onRefresh)==null||a.call(n),this.close()}catch(s){alert(`Move failed: ${s instanceof Error?s.message:String(s)}`)}}}handleCopyConfig(){var n,a;let e=window.getEditableObjectConfig,t=typeof e=="function"?e(this.options.objectId):null;if(!t){let s=window.__editableObjectConfigs;s&&typeof s.get=="function"&&(t=(n=s.get(this.options.objectId))!=null?n:null)}if(!t){alert("Config not found.");return}let i=JSON.stringify(t,null,2);(a=navigator.clipboard)==null||a.writeText(i).catch(()=>{alert("Failed to copy to clipboard.")}),this.close()}handleOpenInspector(){var t,i;let e=window.__previewSelectObject;typeof e=="function"&&e(this.options.objectId),(i=(t=this.options).onSelect)==null||i.call(t,this.options.objectId),this.close()}handleChangeImage(){var i,n;let e=this.getObjectConfig(),t=((n=(i=e==null?void 0:e.render)==null?void 0:i.asset)==null?void 0:n.path)||"";import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:a})=>{new a().show(this.options.objectId,"render.asset.path",t,r=>{var c,d;let l=window.updateEditableObjectConfig;typeof l=="function"&&(l(this.options.objectId,"render.asset.path",r),(d=(c=this.options).onRefresh)==null||d.call(c))})}).catch(a=>{console.error("Failed to load AssetEditorModal:",a),this.handleGoToLibrary()}),this.close()}handleEditImageCrop(){var n,a;let e=this.getObjectConfig(),t=(a=(n=e==null?void 0:e.render)==null?void 0:n.asset)==null?void 0:a.path;if(!t){alert("No image asset found for this object."),this.close();return}let i;t.startsWith("http")||t.startsWith("data:")?i=t:t.startsWith("raw/")||t.startsWith("/raw/")?i=t.startsWith("/")?t:`/${t}`:i=`/raw/${t}`,console.log("[ObjectContextMenu] Opening crop modal with image:",i),import("./AssetCropModal-JJSHJZCX.js").then(({AssetCropModal:s})=>{new s().open({imageSrc:i,onCrop:async l=>{var c,d,u;try{let p=((c=e==null?void 0:e.identity)==null?void 0:c.category)||"ui",g=this.options.objectId.replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),m=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:p,filename:`${g}_cropped_${Date.now()}.png`,data:l,overwrite:!0})})).json();if(m.success&&m.path){console.log("[ObjectContextMenu] \u2705 Cropped image saved:",m.path);let f=window.addAssetToRegistry;if(typeof f=="function"){let w=m.path.split("/").pop()||"";f(p,w)}let b=window.refreshAssetLibrary;typeof b=="function"&&await b();let y=window.applyAssetToSlot;if(typeof y=="function"){let w=m.path.split("/").pop()||"";await y(this.options.objectId,w,p)}else{let{applyConfigOverride:w}=await import("./ConfigOverride-2HOZGV6G.js");w({objectId:this.options.objectId,path:"render.asset.path",value:m.path},{persist:!0,emitEvent:!0})}window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:this.options.objectId,action:"update",path:"render.asset.path"}})),(u=(d=this.options).onRefresh)==null||u.call(d),console.log("[ObjectContextMenu] \u2705 Cropped image applied")}else alert(`Failed to save cropped image: ${m.error||"Unknown error"}`)}catch(p){alert(`Failed to save cropped image: ${p instanceof Error?p.message:String(p)}`)}},onCancel:()=>{}})}).catch(s=>{console.error("Failed to load AssetCropModal:",s),alert("Crop editor not available.")}),this.close()}handleEditImageAI(){var i,n;let e=this.getObjectConfig(),t=((n=(i=e==null?void 0:e.render)==null?void 0:i.asset)==null?void 0:n.path)||"";import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:a})=>{new a().show(this.options.objectId,"render.asset.path",t,r=>{var c,d;let l=window.updateEditableObjectConfig;typeof l=="function"&&(l(this.options.objectId,"render.asset.path",r),(d=(c=this.options).onRefresh)==null||d.call(c))}),setTimeout(()=>{let r=document.querySelector('.asset-editor-tab[data-tab="ai"]');r==null||r.click()},100)}).catch(a=>{console.error("Failed to load AssetEditorModal:",a),alert("AI editor not available.")}),this.close()}handleUploadImage(){var i,n;let e=this.getObjectConfig(),t=((n=(i=e==null?void 0:e.render)==null?void 0:i.asset)==null?void 0:n.path)||"";import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:a})=>{new a().show(this.options.objectId,"render.asset.path",t,r=>{var c,d;let l=window.updateEditableObjectConfig;typeof l=="function"&&(l(this.options.objectId,"render.asset.path",r),(d=(c=this.options).onRefresh)==null||d.call(c))}),setTimeout(()=>{let r=document.querySelector('.asset-editor-tab[data-tab="upload"]');r==null||r.click()},100)}).catch(a=>{console.error("Failed to load AssetEditorModal:",a),alert("Upload not available.")}),this.close()}handleGoToLibrary(){var t;let e=window.__debugContext;if(e){(t=e.setActiveTab)==null||t.call(e,"library");let i=window.__highlightLibrarySlot;typeof i=="function"&&i(this.options.objectId)}this.close()}handleAddLogic(){this.handleOpenInspector(),setTimeout(()=>{var t,i,n;let e=document.querySelector('[data-path="logic.id"]');if(e)(t=e.focus)==null||t.call(e),(i=e.scrollIntoView)==null||i.call(e,{behavior:"smooth",block:"center"});else{let a=document.querySelector('[data-section="logic"]');(n=a==null?void 0:a.scrollIntoView)==null||n.call(a,{behavior:"smooth",block:"center"})}},100),this.close()}getObjectConfig(){var i;let e=window.getEditableObjectConfig;if(typeof e=="function")return e(this.options.objectId);let t=window.__editableObjectConfigs;return t&&typeof t.get=="function"&&(i=t.get(this.options.objectId))!=null?i:null}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}};var It=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],ni=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.templates=[];this.isLoadingTemplates=!1;this.targetScreen="gameplay";this.view="root";this.templateQuery="";this.templateGroup=null;this.options=e}getTargetScreenStorageKey(){return`handler_preview_add_menu_target_screen::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}async open(e){await this.loadTemplates(),this.loadTargetScreen(),this.view="root",this.templateQuery="",this.templateGroup=null,this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}async loadTemplates(){if(!this.isLoadingTemplates){this.isLoadingTemplates=!0;try{let e=await fetch("/api/objects/templates");if(e.ok){let t=await e.json();this.templates=Array.isArray(t.templates)?t.templates:[]}}catch(e){console.warn("[AddObjectMenu] Failed to load templates:",e),this.templates=[]}finally{this.isLoadingTemplates=!1}}}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=this.renderMenuHtml(),this.menu=e,this.updateTargetScreenUI()}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,s=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),s>0&&(this.menu.style.top=`${i-s-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let t=e.target,i=t==null?void 0:t.closest("[data-action]");if(!i||i.classList.contains("disabled"))return;let n=i.dataset.action;if(!n)return;if(e.preventDefault(),e.stopPropagation(),n==="set-screen"){let d=i.dataset.screenId;if(!d||!It.some(u=>u.value===d))return;this.setTargetScreen(d);return}if(n==="open-view"){let d=(i.dataset.view||"").trim();(d==="templates"||d==="templates-group"||d==="screens"||d==="systems"||d==="root")&&this.setView(d);return}if(n==="back"){this.setView("root");return}if(n==="open-template-group"){let d=(i.dataset.templateGroup||"").trim();if(!d)return;this.templateGroup=d,this.setView("templates-group");return}if(n==="template-pack"){let d=(i.dataset.templatePack||"").trim();(d==="ui"||d==="screen")&&this.handleInstallTemplatePack(d);return}let a=i.dataset.objectType,s=i.dataset.systemType,r=i.dataset.templateId,l=i.dataset.screenId,c=l!=null?l:this.targetScreen;n==="object"&&a?this.handleCreateObject(a,c):n==="system"&&s?this.handleCreateSystem(s,c):n==="template"&&r&&this.handleCreateFromTemplate(r,c)}),this.menu.addEventListener("input",e=>{if(!this.menu)return;let t=e.target,i=t&&t instanceof HTMLInputElement?t:null;i&&i.classList.contains("context-menu-search")&&(this.templateQuery=i.value||"",this.updateMenuContents({preserveTemplateSearchFocus:!0}))}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}async promptScreen(e="Select Screen"){return new Promise(t=>{var c,d,u;let i=document.createElement("div");i.className="add-menu-modal-overlay",i.innerHTML=`
291
+ `))||(r==null?void 0:r.error)||"Move failed.";alert(l);return}(a=(n=this.options).onRefresh)==null||a.call(n),this.close()}catch(s){alert(`Move failed: ${s instanceof Error?s.message:String(s)}`)}}}handleCopyConfig(){var n,a;let e=window.getEditableObjectConfig,t=typeof e=="function"?e(this.options.objectId):null;if(!t){let s=window.__editableObjectConfigs;s&&typeof s.get=="function"&&(t=(n=s.get(this.options.objectId))!=null?n:null)}if(!t){alert("Config not found.");return}let i=JSON.stringify(t,null,2);(a=navigator.clipboard)==null||a.writeText(i).catch(()=>{alert("Failed to copy to clipboard.")}),this.close()}handleOpenInspector(){var t,i;let e=window.__previewSelectObject;typeof e=="function"&&e(this.options.objectId),(i=(t=this.options).onSelect)==null||i.call(t,this.options.objectId),this.close()}handleChangeImage(){var i,n;let e=this.getObjectConfig(),t=((n=(i=e==null?void 0:e.render)==null?void 0:i.asset)==null?void 0:n.path)||"";import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:a})=>{new a().show(this.options.objectId,"render.asset.path",t,r=>{var c,d;let l=window.updateEditableObjectConfig;typeof l=="function"&&(l(this.options.objectId,"render.asset.path",r),(d=(c=this.options).onRefresh)==null||d.call(c))})}).catch(a=>{console.error("Failed to load AssetEditorModal:",a),this.handleGoToLibrary()}),this.close()}handleEditImageCrop(){var n,a;let e=this.getObjectConfig(),t=(a=(n=e==null?void 0:e.render)==null?void 0:n.asset)==null?void 0:a.path;if(!t){alert("No image asset found for this object."),this.close();return}let i;t.startsWith("http")||t.startsWith("data:")?i=t:t.startsWith("raw/")||t.startsWith("/raw/")?i=t.startsWith("/")?t:`/${t}`:i=`/raw/${t}`,console.log("[ObjectContextMenu] Opening crop modal with image:",i),import("./AssetCropModal-JJSHJZCX.js").then(({AssetCropModal:s})=>{new s().open({imageSrc:i,onCrop:async l=>{var c,d,p;try{let u=((c=e==null?void 0:e.identity)==null?void 0:c.category)||"ui",g=this.options.objectId.replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,""),m=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:u,filename:`${g}_cropped_${Date.now()}.png`,data:l,overwrite:!0})})).json();if(m.success&&m.path){console.log("[ObjectContextMenu] \u2705 Cropped image saved:",m.path);let f=window.addAssetToRegistry;if(typeof f=="function"){let w=m.path.split("/").pop()||"";f(u,w)}let b=window.refreshAssetLibrary;typeof b=="function"&&await b();let y=window.applyAssetToSlot;if(typeof y=="function"){let w=m.path.split("/").pop()||"";await y(this.options.objectId,w,u)}else{let{applyConfigOverride:w}=await import("./ConfigOverride-SLXAGR2M.js");w({objectId:this.options.objectId,path:"render.asset.path",value:m.path},{persist:!0,emitEvent:!0})}window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:this.options.objectId,action:"update",path:"render.asset.path"}})),(p=(d=this.options).onRefresh)==null||p.call(d),console.log("[ObjectContextMenu] \u2705 Cropped image applied")}else alert(`Failed to save cropped image: ${m.error||"Unknown error"}`)}catch(u){alert(`Failed to save cropped image: ${u instanceof Error?u.message:String(u)}`)}},onCancel:()=>{}})}).catch(s=>{console.error("Failed to load AssetCropModal:",s),alert("Crop editor not available.")}),this.close()}handleEditImageAI(){var i,n;let e=this.getObjectConfig(),t=((n=(i=e==null?void 0:e.render)==null?void 0:i.asset)==null?void 0:n.path)||"";import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:a})=>{new a().show(this.options.objectId,"render.asset.path",t,r=>{var c,d;let l=window.updateEditableObjectConfig;typeof l=="function"&&(l(this.options.objectId,"render.asset.path",r),(d=(c=this.options).onRefresh)==null||d.call(c))}),setTimeout(()=>{let r=document.querySelector('.asset-editor-tab[data-tab="ai"]');r==null||r.click()},100)}).catch(a=>{console.error("Failed to load AssetEditorModal:",a),alert("AI editor not available.")}),this.close()}handleUploadImage(){var i,n;let e=this.getObjectConfig(),t=((n=(i=e==null?void 0:e.render)==null?void 0:i.asset)==null?void 0:n.path)||"";import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:a})=>{new a().show(this.options.objectId,"render.asset.path",t,r=>{var c,d;let l=window.updateEditableObjectConfig;typeof l=="function"&&(l(this.options.objectId,"render.asset.path",r),(d=(c=this.options).onRefresh)==null||d.call(c))}),setTimeout(()=>{let r=document.querySelector('.asset-editor-tab[data-tab="upload"]');r==null||r.click()},100)}).catch(a=>{console.error("Failed to load AssetEditorModal:",a),alert("Upload not available.")}),this.close()}handleGoToLibrary(){var t;let e=window.__debugContext;if(e){(t=e.setActiveTab)==null||t.call(e,"library");let i=window.__highlightLibrarySlot;typeof i=="function"&&i(this.options.objectId)}this.close()}handleAddLogic(){this.handleOpenInspector(),setTimeout(()=>{var t,i,n;let e=document.querySelector('[data-path="logic.id"]');if(e)(t=e.focus)==null||t.call(e),(i=e.scrollIntoView)==null||i.call(e,{behavior:"smooth",block:"center"});else{let a=document.querySelector('[data-section="logic"]');(n=a==null?void 0:a.scrollIntoView)==null||n.call(a,{behavior:"smooth",block:"center"})}},100),this.close()}getObjectConfig(){var i;let e=window.getEditableObjectConfig;if(typeof e=="function")return e(this.options.objectId);let t=window.__editableObjectConfigs;return t&&typeof t.get=="function"&&(i=t.get(this.options.objectId))!=null?i:null}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}};var It=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],ai=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.templates=[];this.isLoadingTemplates=!1;this.targetScreen="gameplay";this.view="root";this.templateQuery="";this.templateGroup=null;this.options=e}getTargetScreenStorageKey(){return`handler_preview_add_menu_target_screen::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}async open(e){await this.loadTemplates(),this.loadTargetScreen(),this.view="root",this.templateQuery="",this.templateGroup=null,this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}async loadTemplates(){if(!this.isLoadingTemplates){this.isLoadingTemplates=!0;try{let e=await fetch("/api/objects/templates");if(e.ok){let t=await e.json();this.templates=Array.isArray(t.templates)?t.templates:[]}}catch(e){console.warn("[AddObjectMenu] Failed to load templates:",e),this.templates=[]}finally{this.isLoadingTemplates=!1}}}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=this.renderMenuHtml(),this.menu=e,this.updateTargetScreenUI()}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,s=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),s>0&&(this.menu.style.top=`${i-s-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let t=e.target,i=t==null?void 0:t.closest("[data-action]");if(!i||i.classList.contains("disabled"))return;let n=i.dataset.action;if(!n)return;if(e.preventDefault(),e.stopPropagation(),n==="set-screen"){let d=i.dataset.screenId;if(!d||!It.some(p=>p.value===d))return;this.setTargetScreen(d);return}if(n==="open-view"){let d=(i.dataset.view||"").trim();(d==="templates"||d==="templates-group"||d==="screens"||d==="systems"||d==="root")&&this.setView(d);return}if(n==="back"){this.setView("root");return}if(n==="open-template-group"){let d=(i.dataset.templateGroup||"").trim();if(!d)return;this.templateGroup=d,this.setView("templates-group");return}if(n==="template-pack"){let d=(i.dataset.templatePack||"").trim();(d==="ui"||d==="screen")&&this.handleInstallTemplatePack(d);return}let a=i.dataset.objectType,s=i.dataset.systemType,r=i.dataset.templateId,l=i.dataset.screenId,c=l!=null?l:this.targetScreen;n==="object"&&a?this.handleCreateObject(a,c):n==="system"&&s?this.handleCreateSystem(s,c):n==="template"&&r&&this.handleCreateFromTemplate(r,c)}),this.menu.addEventListener("input",e=>{if(!this.menu)return;let t=e.target,i=t&&t instanceof HTMLInputElement?t:null;i&&i.classList.contains("context-menu-search")&&(this.templateQuery=i.value||"",this.updateMenuContents({preserveTemplateSearchFocus:!0}))}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}async promptScreen(e="Select Screen"){return new Promise(t=>{var c,d,p;let i=document.createElement("div");i.className="add-menu-modal-overlay",i.innerHTML=`
292
292
  <div class="add-menu-modal">
293
293
  <div class="add-menu-modal-header">
294
294
  <div class="add-menu-modal-title">${this.escapeHtml(e)}</div>
@@ -297,7 +297,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
297
297
  <div class="add-menu-modal-body">
298
298
  <label class="add-menu-modal-label">Screen:</label>
299
299
  <select class="add-menu-modal-select" id="screen-select" required>
300
- ${It.map((p,g)=>`<option value="${this.escapeHtml(p.value)}" ${g===2?"selected":""}>${this.escapeHtml(p.label)}</option>`).join("")}
300
+ ${It.map((u,g)=>`<option value="${this.escapeHtml(u.value)}" ${g===2?"selected":""}>${this.escapeHtml(u.label)}</option>`).join("")}
301
301
  </select>
302
302
  </div>
303
303
  <div class="add-menu-modal-footer">
@@ -305,7 +305,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
305
305
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
306
306
  </div>
307
307
  </div>
308
- `;let n=()=>{i.parentNode&&i.parentNode.removeChild(i)},a=()=>{let g=i.querySelector("#screen-select").value.trim();if(!g||!It.some(h=>h.value===g)){alert("Please select a valid screen.");return}n(),t(g)},s=()=>{n(),t(null)};i.querySelector(".add-menu-modal").addEventListener("click",p=>{p.stopPropagation()}),(c=i.querySelector('[data-action="confirm"]'))==null||c.addEventListener("click",a),(d=i.querySelector('[data-action="cancel"]'))==null||d.addEventListener("click",s),(u=i.querySelector(".add-menu-modal-close"))==null||u.addEventListener("click",s),i.addEventListener("click",p=>{p.target===i&&s()});let l=i.querySelector("#screen-select");l.addEventListener("keydown",p=>{p.key==="Enter"?(p.preventDefault(),a()):p.key==="Escape"&&(p.preventDefault(),s())}),document.body.appendChild(i),l.focus()})}loadTargetScreen(){try{let t=(window.localStorage.getItem(this.getTargetScreenStorageKey())||"").trim();It.some(i=>i.value===t)?this.targetScreen=t:this.targetScreen="gameplay"}catch{this.targetScreen="gameplay"}}setTargetScreen(e){this.targetScreen=e;try{window.localStorage.setItem(this.getTargetScreenStorageKey(),e)}catch{}this.updateTargetScreenUI()}updateTargetScreenUI(){let e=this.menu;if(!e)return;Array.from(e.querySelectorAll(".context-menu-screen-chip[data-screen-id]")).forEach(i=>{let n=i.dataset.screenId;i.classList.toggle("active",n===this.targetScreen)})}setView(e){var t;if(this.view=e,e!=="templates-group"&&(this.templateGroup=null),this.updateMenuContents(),e==="templates"||e==="templates-group"){let i=(t=this.menu)==null?void 0:t.querySelector(".context-menu-search");i&&i.focus()}}updateMenuContents(e){if(!this.menu)return;let t=!!(e!=null&&e.preserveTemplateSearchFocus)&&document.activeElement===this.menu.querySelector(".context-menu-search");if(this.menu.innerHTML=this.renderMenuHtml(),this.updateTargetScreenUI(),t){let i=this.menu.querySelector(".context-menu-search");i==null||i.focus(),i&&(i.selectionStart=i.selectionEnd=i.value.length)}}renderMenuHtml(){return this.view==="templates"?this.renderTemplatesView():this.view==="templates-group"?this.renderTemplatesGroupView():this.view==="screens"?this.renderScreensView():this.view==="systems"?this.renderSystemsView():this.renderRootView()}getPackTemplateIds(e){return e==="ui"?["template.ui.rotating_logo","template.ui.floating_cta_badge","template.ui.bottom_cta_button","template.ui.hand_pointer","template.ui.title_banner","template.ui.instruction_text","template.ui.score_hud"]:["template.screen.rotating_coin","template.screen.rotating_gem","template.screen.tap_destroy_target","template.screen.draggable_piece","template.screen.snap_slot","template.screen.collectable_coin","template.screen.player_swerve","template.screen.enemy_damageable"]}getMissingPackTemplateIds(e){let t=new Set(this.templates.map(i=>String(i.id||"").toLowerCase()));return this.getPackTemplateIds(e).filter(i=>!t.has(i.toLowerCase()))}async handleInstallTemplatePack(e){var t;try{let n=await fetch(e==="ui"?"/api/templates/ui":"/api/templates/screen",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let s=((t=a==null?void 0:a.errors)==null?void 0:t.join(`
308
+ `;let n=()=>{i.parentNode&&i.parentNode.removeChild(i)},a=()=>{let g=i.querySelector("#screen-select").value.trim();if(!g||!It.some(h=>h.value===g)){alert("Please select a valid screen.");return}n(),t(g)},s=()=>{n(),t(null)};i.querySelector(".add-menu-modal").addEventListener("click",u=>{u.stopPropagation()}),(c=i.querySelector('[data-action="confirm"]'))==null||c.addEventListener("click",a),(d=i.querySelector('[data-action="cancel"]'))==null||d.addEventListener("click",s),(p=i.querySelector(".add-menu-modal-close"))==null||p.addEventListener("click",s),i.addEventListener("click",u=>{u.target===i&&s()});let l=i.querySelector("#screen-select");l.addEventListener("keydown",u=>{u.key==="Enter"?(u.preventDefault(),a()):u.key==="Escape"&&(u.preventDefault(),s())}),document.body.appendChild(i),l.focus()})}loadTargetScreen(){try{let t=(window.localStorage.getItem(this.getTargetScreenStorageKey())||"").trim();It.some(i=>i.value===t)?this.targetScreen=t:this.targetScreen="gameplay"}catch{this.targetScreen="gameplay"}}setTargetScreen(e){this.targetScreen=e;try{window.localStorage.setItem(this.getTargetScreenStorageKey(),e)}catch{}this.updateTargetScreenUI()}updateTargetScreenUI(){let e=this.menu;if(!e)return;Array.from(e.querySelectorAll(".context-menu-screen-chip[data-screen-id]")).forEach(i=>{let n=i.dataset.screenId;i.classList.toggle("active",n===this.targetScreen)})}setView(e){var t;if(this.view=e,e!=="templates-group"&&(this.templateGroup=null),this.updateMenuContents(),e==="templates"||e==="templates-group"){let i=(t=this.menu)==null?void 0:t.querySelector(".context-menu-search");i&&i.focus()}}updateMenuContents(e){if(!this.menu)return;let t=!!(e!=null&&e.preserveTemplateSearchFocus)&&document.activeElement===this.menu.querySelector(".context-menu-search");if(this.menu.innerHTML=this.renderMenuHtml(),this.updateTargetScreenUI(),t){let i=this.menu.querySelector(".context-menu-search");i==null||i.focus(),i&&(i.selectionStart=i.selectionEnd=i.value.length)}}renderMenuHtml(){return this.view==="templates"?this.renderTemplatesView():this.view==="templates-group"?this.renderTemplatesGroupView():this.view==="screens"?this.renderScreensView():this.view==="systems"?this.renderSystemsView():this.renderRootView()}getPackTemplateIds(e){return e==="ui"?["template.ui.rotating_logo","template.ui.floating_cta_badge","template.ui.bottom_cta_button","template.ui.hand_pointer","template.ui.title_banner","template.ui.instruction_text","template.ui.score_hud"]:["template.screen.rotating_coin","template.screen.rotating_gem","template.screen.tap_destroy_target","template.screen.draggable_piece","template.screen.snap_slot","template.screen.collectable_coin","template.screen.player_swerve","template.screen.enemy_damageable"]}getMissingPackTemplateIds(e){let t=new Set(this.templates.map(i=>String(i.id||"").toLowerCase()));return this.getPackTemplateIds(e).filter(i=>!t.has(i.toLowerCase()))}async handleInstallTemplatePack(e){var t;try{let n=await fetch(e==="ui"?"/api/templates/ui":"/api/templates/screen",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let s=((t=a==null?void 0:a.errors)==null?void 0:t.join(`
309
309
  `))||(a==null?void 0:a.error)||"Failed to install templates.";alert(s);return}await this.loadTemplates(),this.updateMenuContents()}catch(i){alert(`Failed to install templates: ${i instanceof Error?i.message:String(i)}`)}}renderRootView(){let e=this.templates.length;return`
310
310
  ${this.renderTargetScreenSection()}
311
311
  <div class="context-menu-section-title">Objects</div>
@@ -323,7 +323,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
323
323
  <div class="context-menu-section-title">Templates</div>
324
324
  <input class="context-menu-search" type="text" placeholder="Search templates\u2026" value="${this.escapeHtml(this.templateQuery)}" />
325
325
  ${r||'<div class="context-menu-item disabled">No matches</div>'}
326
- `}let n=i.map(s=>{var d,u;let r=(u=(d=t.get(s))==null?void 0:d.length)!=null?u:0,l=s==="UI Templates"||s==="Screen Templates";return r<=0&&!l?`<div class="context-menu-item disabled">${this.escapeHtml(s)} <span class="context-menu-subtle">0</span></div>`:`<div class="${r>0,"context-menu-item context-menu-submenu"}" data-action="open-template-group" data-template-group="${this.escapeHtml(s)}">${this.escapeHtml(s)} <span class="context-menu-subtle">${r}</span></div>`}).join(""),a=this.templates.length>0?"":'<div class="context-menu-item disabled">No templates available</div>';return`
326
+ `}let n=i.map(s=>{var d,p;let r=(p=(d=t.get(s))==null?void 0:d.length)!=null?p:0,l=s==="UI Templates"||s==="Screen Templates";return r<=0&&!l?`<div class="context-menu-item disabled">${this.escapeHtml(s)} <span class="context-menu-subtle">0</span></div>`:`<div class="${r>0,"context-menu-item context-menu-submenu"}" data-action="open-template-group" data-template-group="${this.escapeHtml(s)}">${this.escapeHtml(s)} <span class="context-menu-subtle">${r}</span></div>`}).join(""),a=this.templates.length>0?"":'<div class="context-menu-item disabled">No templates available</div>';return`
327
327
  <div class="context-menu-item context-menu-back" data-action="back">\u2190 Back</div>
328
328
  <div class="context-menu-section-title">Templates</div>
329
329
  <input class="context-menu-search" type="text" placeholder="Search templates\u2026" value="${this.escapeHtml(this.templateQuery)}" />
@@ -361,7 +361,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
361
361
  `).join("")}
362
362
  </div>
363
363
  <div class="context-menu-separator"></div>
364
- `}groupTemplates(e){let t=new Map,i=(n,a)=>{var r;let s=(r=t.get(n))!=null?r:[];s.push(a),t.set(n,s)};return e.forEach(n=>{let a=(n.id||"").toLowerCase();return a.startsWith("template.ui.")||a.startsWith("template.start.")||a.startsWith("template.endgame.")?i("UI Templates",n):a.startsWith("template.screen.")?i("Screen Templates",n):a.includes(".template")?i("Gameplay Templates",n):a.startsWith("effects.")||a.includes("effect")?i("Effects",n):i("Other",n)}),t}async promptName(e="new_object",t="Enter Object Name"){return new Promise(i=>{var d,u,p;let n=document.createElement("div");n.className="add-menu-modal-overlay",n.innerHTML=`
364
+ `}groupTemplates(e){let t=new Map,i=(n,a)=>{var r;let s=(r=t.get(n))!=null?r:[];s.push(a),t.set(n,s)};return e.forEach(n=>{let a=(n.id||"").toLowerCase();return a.startsWith("template.ui.")||a.startsWith("template.start.")||a.startsWith("template.endgame.")?i("UI Templates",n):a.startsWith("template.screen.")?i("Screen Templates",n):a.includes(".template")?i("Gameplay Templates",n):a.startsWith("effects.")||a.includes("effect")?i("Effects",n):i("Other",n)}),t}async promptName(e="new_object",t="Enter Object Name"){return new Promise(i=>{var d,p,u;let n=document.createElement("div");n.className="add-menu-modal-overlay",n.innerHTML=`
365
365
  <div class="add-menu-modal">
366
366
  <div class="add-menu-modal-header">
367
367
  <div class="add-menu-modal-title">${this.escapeHtml(t)}</div>
@@ -377,7 +377,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
377
377
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
378
378
  </div>
379
379
  </div>
380
- `;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},s=()=>{let h=n.querySelector("#name-input").value.trim(),m=this.sanitizeInstanceId(h);if(!m){alert("Invalid name. Use letters, numbers, dots, dashes, or underscores.");return}a(),i(m)},r=()=>{a(),i(null)};n.querySelector(".add-menu-modal").addEventListener("click",g=>{g.stopPropagation()}),(d=n.querySelector('[data-action="confirm"]'))==null||d.addEventListener("click",s),(u=n.querySelector('[data-action="cancel"]'))==null||u.addEventListener("click",r),(p=n.querySelector(".add-menu-modal-close"))==null||p.addEventListener("click",r),n.addEventListener("click",g=>{g.target===n&&r()});let c=n.querySelector("#name-input");c.addEventListener("keydown",g=>{g.key==="Enter"?(g.preventDefault(),s()):g.key==="Escape"&&(g.preventDefault(),r())}),c.select(),document.body.appendChild(n),c.focus()})}async promptSpawnerConfig(){return new Promise(e=>{var f,b,y;let t=document.createElement("div");t.className="add-menu-modal-overlay";let i="template_id",n=`${i}_spawner_1`,a="",s=JSON.stringify([{x:-120,y:-120},{x:0,y:-120},{x:120,y:-120}],null,2),r=JSON.stringify({x:[-240,240],y:[-170,-170]},null,2),l="";t.innerHTML=`
380
+ `;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},s=()=>{let h=n.querySelector("#name-input").value.trim(),m=this.sanitizeInstanceId(h);if(!m){alert("Invalid name. Use letters, numbers, dots, dashes, or underscores.");return}a(),i(m)},r=()=>{a(),i(null)};n.querySelector(".add-menu-modal").addEventListener("click",g=>{g.stopPropagation()}),(d=n.querySelector('[data-action="confirm"]'))==null||d.addEventListener("click",s),(p=n.querySelector('[data-action="cancel"]'))==null||p.addEventListener("click",r),(u=n.querySelector(".add-menu-modal-close"))==null||u.addEventListener("click",r),n.addEventListener("click",g=>{g.target===n&&r()});let c=n.querySelector("#name-input");c.addEventListener("keydown",g=>{g.key==="Enter"?(g.preventDefault(),s()):g.key==="Escape"&&(g.preventDefault(),r())}),c.select(),document.body.appendChild(n),c.focus()})}async promptSpawnerConfig(){return new Promise(e=>{var f,b,y;let t=document.createElement("div");t.className="add-menu-modal-overlay";let i="template_id",n=`${i}_spawner_1`,a="",s=JSON.stringify([{x:-120,y:-120},{x:0,y:-120},{x:120,y:-120}],null,2),r=JSON.stringify({x:[-240,240],y:[-170,-170]},null,2),l="";t.innerHTML=`
381
381
  <div class="add-menu-modal add-menu-modal-wide">
382
382
  <div class="add-menu-modal-header">
383
383
  <div class="add-menu-modal-title">
@@ -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"),u=t.querySelectorAll(".add-menu-modal-tab-content");d.forEach(w=>{w.addEventListener("click",()=>{var k;let v=w.dataset.tab;d.forEach(M=>M.classList.remove("active")),u.forEach(M=>M.classList.remove("active")),w.classList.add("active"),(k=t.querySelector(`[data-tab-content="${v}"]`))==null||k.classList.add("active")})});let p=w=>{let v=w.trim();if(!v)return null;try{return JSON.parse(v)}catch{return null}},g=()=>{var F;let w=t.querySelector("#spawner-instance-id").value.trim(),v=t.querySelector("#spawner-template-id").value.trim(),k=t.querySelector("#spawner-spawn-templates").value,M=t.querySelector("#spawner-position-source").value.trim(),_=t.querySelector("#spawner-point-mode").value.trim(),T=t.querySelector("#spawner-spawn-points").value,j=t.querySelector("#spawner-pattern").value.trim(),P=Number(t.querySelector("#spawner-rate").value.trim()),L=Number(t.querySelector("#spawner-pool").value.trim()),E=Number(t.querySelector("#spawner-lifetime").value.trim()),A=t.querySelector("#spawner-return-on-invisible").checked,x=t.querySelector("#spawner-movement").value.trim(),S=Number(t.querySelector("#spawner-vel-x").value.trim()),C=Number(t.querySelector("#spawner-vel-y").value.trim()),R=t.querySelector("#spawner-velocity-range").value,I=p(k),O=Array.isArray(I)&&I.length?I:null,z=typeof((F=O==null?void 0:O[0])==null?void 0:F.templateId)=="string"?String(O[0].templateId):v;if(!w){alert("Instance ID is required.");return}if(!z){alert("Template ID is required.");return}let $={templateId:z,spawnPattern:j,spawnRate:Number.isFinite(P)?P:650,poolSize:Number.isFinite(L)?L:18,returnOnInvisible:A,positionSource:M,spawnPointMode:_,movementMode:x,lifetime:Number.isFinite(E)?E:5e3};O&&($.spawnTemplates=O);let q=p(T);Array.isArray(q)&&($.spawnPoints=q),Number.isFinite(S)&&Number.isFinite(C)&&($.velocity={x:S,y:C});let B=p(R);B&&typeof B=="object"&&($.velocityRange=B),c(),e({templateId:z,instanceId:w,spawnerProps:$})},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 u=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})}),p=await u.json().catch(()=>({}));if(!u.ok||(p==null?void 0:p.success)===!1){let h=((l=p==null?void 0:p.errors)==null?void 0:l.join(`
511
- `))||(p==null?void 0:p.error)||"Failed to create object.";alert(h);return}let{trackObjectCreation:g}=await import("./ConfigOverride-2HOZGV6G.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(u){alert(`Failed to create object: ${u instanceof Error?u.message:String(u)}`)}}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 u=((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(u);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,u,p,g,h,m,f,b,y,w,v,k,M,_,T,j,P,L,E,A,x;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let S=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),C=await S.json().catch(()=>({}));if(!S.ok||(C==null?void 0:C.success)===!1){let R=((n=C==null?void 0:C.errors)==null?void 0:n.join(`
513
- `))||(C==null?void 0:C.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(S){alert(`Failed to create collectable system: ${S instanceof Error?S.message:String(S)}`)}if(e==="drag-snap-couples")try{let S=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),C=await S.json().catch(()=>({}));if(!S.ok||(C==null?void 0:C.success)===!1){let R=((r=C==null?void 0:C.errors)==null?void 0:r.join(`
514
- `))||(C==null?void 0:C.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(S){alert(`Failed to create drag-snap system: ${S instanceof Error?S.message:String(S)}`)}if(e==="swerve-collect")try{let S=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),C=await S.json().catch(()=>({}));if(!S.ok||(C==null?void 0:C.success)===!1){let R=((d=C==null?void 0:C.errors)==null?void 0:d.join(`
515
- `))||(C==null?void 0:C.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")),(p=(u=this.options).onRefresh)==null||p.call(u)}catch(S){alert(`Failed to create swerve collect system: ${S instanceof Error?S.message:String(S)}`)}if(e==="tap-destroy")try{let S=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),C=await S.json().catch(()=>({}));if(!S.ok||(C==null?void 0:C.success)===!1){let R=((g=C==null?void 0:C.errors)==null?void 0:g.join(`
516
- `))||(C==null?void 0:C.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(S){alert(`Failed to create tap destroy system: ${S instanceof Error?S.message:String(S)}`)}if(e==="scratch-card")try{let S=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),C=await S.json().catch(()=>({}));if(!S.ok||(C==null?void 0:C.success)===!1){let R=((f=C==null?void 0:C.errors)==null?void 0:f.join(`
517
- `))||(C==null?void 0:C.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(S){alert(`Failed to create scratch card system: ${S instanceof Error?S.message:String(S)}`)}if(e==="start-screen"||e==="start-screen-no-hand")try{let C=await fetch("/api/systems/start-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="start-screen"})}),R=await C.json().catch(()=>({}));if(!C.ok||(R==null?void 0:R.success)===!1){let I=((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(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(k=(v=this.options).onRefresh)==null||k.call(v)}catch(S){alert(`Failed to create start screen template: ${S instanceof Error?S.message:String(S)}`)}if(e==="endgame-screen"||e==="endgame-screen-no-hand")try{let C=await fetch("/api/systems/endgame-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="endgame-screen"})}),R=await C.json().catch(()=>({}));if(!C.ok||(R==null?void 0:R.success)===!1){let I=((M=R==null?void 0:R.errors)==null?void 0:M.join(`
519
- `))||(R==null?void 0:R.error)||"Failed to create endgame screen template.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(T=(_=this.options).onRefresh)==null||T.call(_)}catch(S){alert(`Failed to create endgame screen template: ${S instanceof Error?S.message:String(S)}`)}if(e==="bullet-system")try{let S=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),C=await S.json().catch(()=>({}));if(!S.ok||(C==null?void 0:C.success)===!1){let R=((j=C==null?void 0:C.errors)==null?void 0:j.join(`
520
- `))||(C==null?void 0:C.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")),(L=(P=this.options).onRefresh)==null||L.call(P)}catch(S){alert(`Failed to create bullet system: ${S instanceof Error?S.message:String(S)}`)}if(e==="spawner"){let S=await this.promptSpawnerConfig();if(!S)return;let{templateId:C,instanceId:R,spawnerProps:I}=S;try{let O=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,templateId:C,instanceId:R,spawnerProps:I,forceSync:!0})}),z=await O.json().catch(()=>({}));if(!O.ok||(z==null?void 0:z.success)===!1){let $=((E=z==null?void 0:z.errors)==null?void 0:E.join(`
521
- `))||(z==null?void 0:z.error)||"Failed to create spawner.";alert($);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(x=(A=this.options).onRefresh)==null||x.call(A)}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 ai=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`
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(`
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`
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,21 +553,21 @@ 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,u,p;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 k=m.dataset.collapseKey||"";if(!k)return;let M=(v=this.listContainer)==null?void 0:v.querySelector(`[data-collapse-content="${k}"]`),_=this.isCollapsed(k);M&&(M.style.display=_?"":"none"),m.textContent=_?"\u25BE":"\u25B8",this.setCollapsed(k,!_),g.preventDefault(),g.stopPropagation();return}let f=h==null?void 0:h.closest("[data-object-visibility-toggle][data-object-id]");if(f){let k=f.dataset.objectId;if(!k)return;g.preventDefault(),g.stopPropagation(),this.toggleObjectVisibility(k);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){try{let g=window.localStorage.getItem(this.getScreenFilterStorageKey());g&&(this.screenFilter=g)}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()})}(u=this.root)==null||u.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)}),(p=this.listContainer)==null||p.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 k=window.__editableObjectConfigs;k&&typeof k.get=="function"&&(y=(v=k.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 u=d.dataset.objectId,p=u?this.selectedIds.has(u):!1,g=u===this.selectedId;d.classList.toggle("selected",p),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=p)});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 u=window.getEditableObjectConfig,p=typeof u=="function"?u(d):null;if(!p){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(p=(l=b.get(d))!=null?l:null)}let g=this.inferScreen(d,p),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},m=(((c=p==null?void 0:p.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 p;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=(((p=this.searchInput)==null?void 0:p.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 x,S,C,R,I,O,z;let h=l(g),m=(((x=h==null?void 0:h.identity)==null?void 0:x.category)||"scene").toString(),f=(((S=h==null?void 0:h.identity)==null?void 0:S.id)||g).toString(),b=m.toLowerCase(),y=f.toLowerCase(),w=b.includes("ui")||y.startsWith("ui")||y.includes("label"),v=b==="system",k=((C=h==null?void 0:h.identity)==null?void 0:C.is_template)===!0||y.includes(".template")||g.toLowerCase().includes(".template"),M=typeof((R=h==null?void 0:h.identity)==null?void 0:R.system_group)=="string"?h.identity.system_group:null,_=typeof((I=h==null?void 0:h.identity)==null?void 0:I.system_label)=="string"?h.identity.system_label:M?this.formatDisplayName(M):null,T=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,P=this.getObjectType(h),L={id:g,label:T,category:m,isUi:w,isTemplate:k,isUnused:j,objectType:P,systemGroupId:M,systemLabel:_},E=this.inferScreen(L.id,h);if(!(this.screenFilter!=="all"&&E!==this.screenFilter||!(!a||L.id.toLowerCase().includes(a)||L.label.toLowerCase().includes(a)))){if(M){let $=this.getSystemBundleKey(E,M),q=_!=null?_:M,B=r[E],F=B.bundles.get($);F?(F.entries.push(L),F.objectIds.push(g)):B.bundles.set($,{key:$,label:q,objectIds:[g],entries:[L]});let D=(z=this.systemBundles.get($))!=null?z:{label:q,objectIds:[]};D.label=q,D.objectIds.push(g),this.systemBundles.set($,D);return}if(k){r[E].templates.push(L);return}v?r[E].systems.push(L):r[E].objects.push(L)}});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},d=this.screenFilter==="all"?s:[this.screenFilter],u=d.map(g=>this.renderScreenGroup(g,c[g],r[g])).join("");this.listContainer.innerHTML=u,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}`),u=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){try{let g=window.localStorage.getItem(this.getScreenFilterStorageKey());g&&(this.screenFilter=g)}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`
557
557
  <div class="scene-object-group scene-object-group-bundle" data-system-bundle="${c}">
558
558
  <div class="scene-object-group-title">
559
- <button class="scene-object-group-toggle" type="button" data-collapse-key="${d}">${u?"\u25B8":"\u25BE"}</button>
559
+ <button class="scene-object-group-toggle" type="button" data-collapse-key="${d}">${p?"\u25B8":"\u25BE"}</button>
560
560
  <span>${this.escapeHtml(t)} <span class="scene-object-count">${i.length}</span></span>
561
561
  <div class="scene-object-group-actions">
562
562
  <button class="scene-object-group-action scene-object-group-visibility ${r}" data-system-bundle-action="toggle-visibility" data-system-bundle-id="${c}" type="button" title="${s}">\u{1F441}\uFE0F</button>
563
563
  <button class="scene-object-group-delete" data-system-bundle-action="delete" data-system-bundle-id="${c}" type="button" title="Delete this system">\u{1F5D1}\uFE0F</button>
564
564
  </div>
565
565
  </div>
566
- <div class="scene-object-group-items" data-collapse-content="${d}" style="${u?"display:none;":""}">
566
+ <div class="scene-object-group-items" data-collapse-content="${d}" style="${p?"display:none;":""}">
567
567
  ${l}
568
568
  </div>
569
569
  </div>
570
- `}renderEntryItem(e){var l,c,d;let t=window.getEditableObjectConfig,i=typeof t=="function"?t(e.id):null;if(!i){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(i=(l=u.get(e.id))!=null?l:null)}let n=(c=i==null?void 0:i.ui)!=null&&c.text?`"${i.ui.text.substring(0,12)}${i.ui.text.length>12?"...":""}"`:"",a=e.isTemplate?'<span class="scene-object-badge template">template</span>':"",s=((d=i==null?void 0:i.render)==null?void 0:d.visible)===!1;return`
570
+ `}renderEntryItem(e){var l,c,d;let t=window.getEditableObjectConfig,i=typeof t=="function"?t(e.id):null;if(!i){let p=window.__editableObjectConfigs;p&&typeof p.get=="function"&&(i=(l=p.get(e.id))!=null?l:null)}let n=(c=i==null?void 0:i.ui)!=null&&c.text?`"${i.ui.text.substring(0,12)}${i.ui.text.length>12?"...":""}"`:"",a=e.isTemplate?'<span class="scene-object-badge template">template</span>':"",s=((d=i==null?void 0:i.render)==null?void 0:d.visible)===!1;return`
571
571
  <div class="scene-object-item-wrapper">
572
572
  <input type="checkbox" class="scene-object-checkbox" ${this.selectedIds.has(e.id)?"checked":""} data-object-id="${e.id}">
573
573
  ${this.renderVisibilityButton(e.id,s)}
@@ -578,7 +578,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
578
578
  <span class="scene-object-badge ${e.isUi?"ui":"scene"}">${e.category}</span>
579
579
  </button>
580
580
  </div>
581
- `}escapeHtml(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}toggleObjectVisibility(e){var a;let t=(a=window.__editableConfig)==null?void 0:a.objects;if(!t||typeof t.get!="function")return;let i=t.get(e);if(!i)return;i.render||(i.render={});let n=i.render.visible!==!1;i.render.visible=!n;try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e,action:"update"}}))}catch{}this.refreshObjects()}renderVisibilityButton(e,t){let i=t?"Show object":"Hide object";return`<button class="${t?"scene-object-eye is-hidden":"scene-object-eye"}" type="button" data-object-visibility-toggle="true" data-object-id="${this.escapeHtml(e)}" title="${i}">\u{1F441}\uFE0F</button>`}isBundleAllHidden(e){var i;if(!e.length)return!1;let t=(i=window.__editableConfig)==null?void 0:i.objects;return e.every(n=>{var s,r,l;let a=(r=(s=t==null?void 0:t.get)==null?void 0:s.call(t,n))!=null?r:null;return((l=a==null?void 0:a.render)==null?void 0:l.visible)===!1})}toggleSystemBundleVisibility(e){var r;let t=this.systemBundles.get(e);if(!t)return;let i=t.objectIds||[];if(!i.length)return;let n=(r=window.__editableConfig)==null?void 0:r.objects;if(!n||typeof n.get!="function")return;let s=this.isBundleAllHidden(i);i.forEach(l=>{let c=n.get(l);c&&(c.render||(c.render={}),c.render.visible=s)});try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}this.refreshObjects()}async deleteSystemBundle(e){let t=this.systemBundles.get(e);if(!t)return;let i=t.label||e,n=Array.from(new Set(t.objectIds||[]));!n.length||!window.confirm(`Delete system "${i}" (${n.length} object${n.length!==1?"s":""})? This removes them from the screen configuration.`)||await this.deleteMultipleObjects(n)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var r,l;let i=window.__HANDLER_SCREEN_INDEX,n=(r=i==null?void 0:i.instanceToScreen)==null?void 0:r[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let a=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${a}`.toLowerCase();return s.includes("loading")?"loading":s.includes("start")?"start":s.includes("tutorial")?"tutorial":s.includes("endgame")||s.includes("end_card")||s.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,s,r,l,c,d,u;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.endsWith(".json")?"animation":((r=(s=e.render)==null?void 0:s.asset)==null?void 0:r.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(d=(c=e.gameplay)==null?void 0:c.tuning)!=null&&d.panel_width||(u=e.effects)!=null&&u.width?"graphics":"container":"container"}renderEntriesList(e){return e.length?e.map(t=>this.renderEntryItem(t)).join(""):""}renderCollapsibleGroup(e){var a;let t=this.isCollapsed(e.key),i=t?"\u25B8":"\u25BE",n=e.actionsHtml?`<div class="scene-object-group-actions">${e.actionsHtml}</div>`:"";return`
581
+ `}escapeHtml(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}toggleObjectVisibility(e){var a;let t=(a=window.__editableConfig)==null?void 0:a.objects;if(!t||typeof t.get!="function")return;let i=t.get(e);if(!i)return;i.render||(i.render={});let n=i.render.visible!==!1;i.render.visible=!n;try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e,action:"update"}}))}catch{}this.refreshObjects()}renderVisibilityButton(e,t){let i=t?"Show object":"Hide object";return`<button class="${t?"scene-object-eye is-hidden":"scene-object-eye"}" type="button" data-object-visibility-toggle="true" data-object-id="${this.escapeHtml(e)}" title="${i}">\u{1F441}\uFE0F</button>`}isBundleAllHidden(e){var i;if(!e.length)return!1;let t=(i=window.__editableConfig)==null?void 0:i.objects;return e.every(n=>{var s,r,l;let a=(r=(s=t==null?void 0:t.get)==null?void 0:s.call(t,n))!=null?r:null;return((l=a==null?void 0:a.render)==null?void 0:l.visible)===!1})}toggleSystemBundleVisibility(e){var r;let t=this.systemBundles.get(e);if(!t)return;let i=t.objectIds||[];if(!i.length)return;let n=(r=window.__editableConfig)==null?void 0:r.objects;if(!n||typeof n.get!="function")return;let s=this.isBundleAllHidden(i);i.forEach(l=>{let c=n.get(l);c&&(c.render||(c.render={}),c.render.visible=s)});try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}this.refreshObjects()}async deleteSystemBundle(e){let t=this.systemBundles.get(e);if(!t)return;let i=t.label||e,n=Array.from(new Set(t.objectIds||[]));!n.length||!window.confirm(`Delete system "${i}" (${n.length} object${n.length!==1?"s":""})? This removes them from the screen configuration.`)||await this.deleteMultipleObjects(n)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var r,l;let i=window.__HANDLER_SCREEN_INDEX,n=(r=i==null?void 0:i.instanceToScreen)==null?void 0:r[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let a=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${a}`.toLowerCase();return s.includes("loading")?"loading":s.includes("start")?"start":s.includes("tutorial")?"tutorial":s.includes("endgame")||s.includes("end_card")||s.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,s,r,l,c,d,p;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.endsWith(".json")?"animation":((r=(s=e.render)==null?void 0:s.asset)==null?void 0:r.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(d=(c=e.gameplay)==null?void 0:c.tuning)!=null&&d.panel_width||(p=e.effects)!=null&&p.width?"graphics":"container":"container"}renderEntriesList(e){return e.length?e.map(t=>this.renderEntryItem(t)).join(""):""}renderCollapsibleGroup(e){var a;let t=this.isCollapsed(e.key),i=t?"\u25B8":"\u25BE",n=e.actionsHtml?`<div class="scene-object-group-actions">${e.actionsHtml}</div>`:"";return`
582
582
  <div class="scene-object-group ${(a=e.className)!=null?a:""}">
583
583
  <div class="scene-object-group-title">
584
584
  <button class="scene-object-group-toggle" type="button" data-collapse-key="${e.key}">${i}</button>
@@ -589,20 +589,20 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
589
589
  ${e.content}
590
590
  </div>
591
591
  </div>
592
- `}renderScreenGroup(e,t,i){let n=this.getCollapseKey(`screen:${e}`),a=[];if(i.templates.length){let r=this.getCollapseKey(`screen:${e}:templates`);a.push(this.renderCollapsibleGroup({key:r,title:"Templates",count:i.templates.length,content:this.renderEntriesList(i.templates),className:"scene-object-group-sub"}))}if(i.bundles.size||i.systems.length){let r=this.getCollapseKey(`screen:${e}:systems`),l=Array.from(i.bundles.values()).sort((u,p)=>u.label.localeCompare(p.label)).map(u=>this.renderSystemBundle(u.key,u.label,u.objectIds,u.entries)).join(""),c=i.systems.length?this.renderEntriesList(i.systems):"",d=i.systems.length?`<button class="scene-object-group-delete" data-delete-system-group="${e}" type="button" title="Delete all system objects">\u{1F5D1}\uFE0F</button>`:"";a.push(this.renderCollapsibleGroup({key:r,title:"Systems",count:i.bundles.size+i.systems.length,content:`${l}${c}`,className:"scene-object-group-system",actionsHtml:d}))}if(i.objects.length){let r=this.getCollapseKey(`screen:${e}:objects`);a.push(this.renderCollapsibleGroup({key:r,title:"Objects",count:i.objects.length,content:this.renderEntriesList(i.objects),className:"scene-object-group"}))}let s=a.join("");return s?this.renderCollapsibleGroup({key:n,title:t,count:i.templates.length+i.systems.length+i.objects.length+i.bundles.size,content:s,className:"scene-object-group-screen"}):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t,i,n;this.selectedId=e,this.selectedIds.has(e)||this.selectedIds.add(e),this.updateLastSelectedIndex(e),this.updateSelectionUI(),(t=this.options)==null||t.onSelect(e),(n=(i=this.options)==null?void 0:i.onMultiSelect)==null||n.call(i,Array.from(this.selectedIds))}toggleBatchSelect(e){var t,i;this.selectedIds.has(e)?this.selectedIds.delete(e):this.selectedIds.add(e),this.updateSelectionUI(),(i=(t=this.options)==null?void 0:t.onMultiSelect)==null||i.call(t,Array.from(this.selectedIds))}toggleSelect(e){this.toggleBatchSelect(e)}selectRange(e,t){var s,r,l;let i=this.objectEntries.findIndex(c=>c.id===t);if(i===-1)return;let n=Math.min(e,i),a=Math.max(e,i);for(let c=n;c<=a;c++)c>=0&&c<this.objectEntries.length&&this.selectedIds.add(this.objectEntries[c].id);this.selectedId=t,this.updateLastSelectedIndex(t),this.updateSelectionUI(),(s=this.options)==null||s.onSelect(this.selectedId),(l=(r=this.options)==null?void 0:r.onMultiSelect)==null||l.call(r,Array.from(this.selectedIds))}updateLastSelectedIndex(e){this.lastSelectedIndex=this.objectEntries.findIndex(t=>t.id===e)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectMenu(e){try{await new ni({onRefresh:()=>this.refreshObjects(),onClose:()=>{}}).open(e)}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectMenu:",t)}}async openAddObjectWizard(e){try{new ii().open({screenId:e})}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectWizard:",t)}}async showContextMenu(e,t,i,n){if(!this.isContextMenuOpen){this.isContextMenuOpen=!0,this.selectedIds.has(e)||this.select(e);try{new dt({objectId:e,screenId:t,onSelect:s=>{s&&this.select(s)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:s=>this.deleteObject(s),onMoveRequest:(s,r)=>this.moveObject(s,r)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var a;let t=this.getSelectedIds(),i=t.length>1&&t.includes(e),n=this.getActiveScreenForSync();if(i){if(!window.confirm(`Delete ${t.length} selected object${t.length!==1?"s":""}? This removes them from the screen configuration.`))return;await this.deleteMultipleObjects(t)}else{if(!window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))return;try{let r=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e,screenId:n,forceSync:!0})}),l=await r.json().catch(()=>null);if(!r.ok||(l==null?void 0:l.success)===!1){let c=((a=l==null?void 0:l.errors)==null?void 0:a.join(`
592
+ `}renderScreenGroup(e,t,i){let n=this.getCollapseKey(`screen:${e}`),a=[];if(i.templates.length){let r=this.getCollapseKey(`screen:${e}:templates`);a.push(this.renderCollapsibleGroup({key:r,title:"Templates",count:i.templates.length,content:this.renderEntriesList(i.templates),className:"scene-object-group-sub"}))}if(i.bundles.size||i.systems.length){let r=this.getCollapseKey(`screen:${e}:systems`),l=Array.from(i.bundles.values()).sort((p,u)=>p.label.localeCompare(u.label)).map(p=>this.renderSystemBundle(p.key,p.label,p.objectIds,p.entries)).join(""),c=i.systems.length?this.renderEntriesList(i.systems):"",d=i.systems.length?`<button class="scene-object-group-delete" data-delete-system-group="${e}" type="button" title="Delete all system objects">\u{1F5D1}\uFE0F</button>`:"";a.push(this.renderCollapsibleGroup({key:r,title:"Systems",count:i.bundles.size+i.systems.length,content:`${l}${c}`,className:"scene-object-group-system",actionsHtml:d}))}if(i.objects.length){let r=this.getCollapseKey(`screen:${e}:objects`);a.push(this.renderCollapsibleGroup({key:r,title:"Objects",count:i.objects.length,content:this.renderEntriesList(i.objects),className:"scene-object-group"}))}let s=a.join("");return s?this.renderCollapsibleGroup({key:n,title:t,count:i.templates.length+i.systems.length+i.objects.length+i.bundles.size,content:s,className:"scene-object-group-screen"}):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t,i,n;this.selectedId=e,this.selectedIds.has(e)||this.selectedIds.add(e),this.updateLastSelectedIndex(e),this.updateSelectionUI(),(t=this.options)==null||t.onSelect(e),(n=(i=this.options)==null?void 0:i.onMultiSelect)==null||n.call(i,Array.from(this.selectedIds))}toggleBatchSelect(e){var t,i;this.selectedIds.has(e)?this.selectedIds.delete(e):this.selectedIds.add(e),this.updateSelectionUI(),(i=(t=this.options)==null?void 0:t.onMultiSelect)==null||i.call(t,Array.from(this.selectedIds))}toggleSelect(e){this.toggleBatchSelect(e)}selectRange(e,t){var s,r,l;let i=this.objectEntries.findIndex(c=>c.id===t);if(i===-1)return;let n=Math.min(e,i),a=Math.max(e,i);for(let c=n;c<=a;c++)c>=0&&c<this.objectEntries.length&&this.selectedIds.add(this.objectEntries[c].id);this.selectedId=t,this.updateLastSelectedIndex(t),this.updateSelectionUI(),(s=this.options)==null||s.onSelect(this.selectedId),(l=(r=this.options)==null?void 0:r.onMultiSelect)==null||l.call(r,Array.from(this.selectedIds))}updateLastSelectedIndex(e){this.lastSelectedIndex=this.objectEntries.findIndex(t=>t.id===e)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectMenu(e){try{await new ai({onRefresh:()=>this.refreshObjects(),onClose:()=>{}}).open(e)}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectMenu:",t)}}async openAddObjectWizard(e){try{new ni().open({screenId:e})}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectWizard:",t)}}async showContextMenu(e,t,i,n){if(!this.isContextMenuOpen){this.isContextMenuOpen=!0,this.selectedIds.has(e)||this.select(e);try{new pt({objectId:e,screenId:t,onSelect:s=>{s&&this.select(s)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:s=>this.deleteObject(s),onMoveRequest:(s,r)=>this.moveObject(s,r)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var a;let t=this.getSelectedIds(),i=t.length>1&&t.includes(e),n=this.getActiveScreenForSync();if(i){if(!window.confirm(`Delete ${t.length} selected object${t.length!==1?"s":""}? This removes them from the screen configuration.`))return;await this.deleteMultipleObjects(t)}else{if(!window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))return;try{let r=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e,screenId:n,forceSync:!0})}),l=await r.json().catch(()=>null);if(!r.ok||(l==null?void 0:l.success)===!1){let c=((a=l==null?void 0:l.errors)==null?void 0:a.join(`
593
593
  `))||(l==null?void 0:l.error)||"Delete failed.";alert(c);return}l!=null&&l.failedDeletions&&l.failedDeletions.length>0&&alert(`Warning: Some files could not be deleted:
594
594
  ${l.failedDeletions.join(`
595
595
  `)}`),l!=null&&l.deletedFiles&&l.deletedFiles.length>0&&console.log(`[SceneObjectsPanel] Successfully deleted files: ${l.deletedFiles.join(", ")}`),await this.syncScreens(),this.selectedIds.delete(e),this.selectedId===e&&(this.selectedId=null),this.refreshObjects()}catch(r){alert(`Delete failed: ${r instanceof Error?r.message:String(r)}`)}}}async deleteMultipleObjects(e){var s;let t=0,i=0,n=[],a=this.getActiveScreenForSync();for(let r of e)try{let l=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:r,skipSync:!0,screenId:a,forceSync:!0})}),c=await l.json().catch(()=>null);if(l.ok&&(c==null?void 0:c.success)!==!1)t++,this.selectedIds.delete(r);else{i++;let d=((s=c==null?void 0:c.errors)==null?void 0:s.join(`
596
596
  `))||(c==null?void 0:c.error)||"Delete failed.";n.push(`${r}: ${d}`)}}catch(l){i++,n.push(`${r}: ${l instanceof Error?l.message:String(l)}`)}if(i>0){let r=n.length>0?n.join(`
597
597
  `):`${i} object(s) failed to delete.`;alert(`Deleted ${t} object(s). Errors:
598
- ${r}`)}t===e.length&&console.log(`[SceneObjectsPanel] Successfully deleted ${t} object(s)`),this.selectedId=this.selectedIds.size>0?Array.from(this.selectedIds)[0]:null,await this.syncScreens(),this.refreshObjects()}async deleteSystemGroup(e){var c;let t=e.length;if(!window.confirm(`Delete all ${t} system object${t!==1?"s":""}? This will remove them from all screens.`))return;let n=e.map(d=>d.id),a=0,s=0,r=[],l=this.getActiveScreenForSync();for(let d of n)try{let u=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:d,screenId:l,forceSync:!0})}),p=await u.json().catch(()=>null);if(u.ok&&(p==null?void 0:p.success)!==!1)a++;else{s++;let g=((c=p==null?void 0:p.errors)==null?void 0:c.join(`
599
- `))||(p==null?void 0:p.error)||"Delete failed.";r.push(`${d}: ${g}`)}}catch(u){s++,r.push(`${d}: ${u instanceof Error?u.message:String(u)}`)}if(s>0){let d=r.length>0?r.join(`
598
+ ${r}`)}t===e.length&&console.log(`[SceneObjectsPanel] Successfully deleted ${t} object(s)`),this.selectedId=this.selectedIds.size>0?Array.from(this.selectedIds)[0]:null,await this.syncScreens(),this.refreshObjects()}async deleteSystemGroup(e){var c;let t=e.length;if(!window.confirm(`Delete all ${t} system object${t!==1?"s":""}? This will remove them from all screens.`))return;let n=e.map(d=>d.id),a=0,s=0,r=[],l=this.getActiveScreenForSync();for(let d of n)try{let p=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:d,screenId:l,forceSync:!0})}),u=await p.json().catch(()=>null);if(p.ok&&(u==null?void 0:u.success)!==!1)a++;else{s++;let g=((c=u==null?void 0:u.errors)==null?void 0:c.join(`
599
+ `))||(u==null?void 0:u.error)||"Delete failed.";r.push(`${d}: ${g}`)}}catch(p){s++,r.push(`${d}: ${p instanceof Error?p.message:String(p)}`)}if(s>0){let d=r.length>0?r.join(`
600
600
  `):`${s} object(s) failed to delete.`;alert(`Deleted ${a} object(s). Errors:
601
601
  ${d}`)}await this.syncScreens(),this.refreshObjects()}async moveObject(e,t){var a;let i=this.getSelectedIds();if(i.length>1&&i.includes(e))await this.moveMultipleObjects(i,t);else{let s=this.inferScreen(e,null);if(t===s)return;try{let r=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e,fromScreenId:s,toScreenId:t})}),l=await r.json().catch(()=>({}));if(!r.ok||(l==null?void 0:l.success)===!1){let c=((a=l==null?void 0:l.errors)==null?void 0:a.join(`
602
- `))||(l==null?void 0:l.error)||"Move failed.";alert(c);return}this.refreshObjects()}catch(r){alert(`Move failed: ${r instanceof Error?r.message:String(r)}`)}}}async moveMultipleObjects(e,t){var s;let i=0,n=0,a=[];for(let r of e){let l=this.inferScreen(r,null);if(t===l){i++;continue}try{let c=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:r,fromScreenId:l,toScreenId:t})}),d=await c.json().catch(()=>({}));if(c.ok&&(d==null?void 0:d.success)!==!1)i++;else{n++;let u=((s=d==null?void 0:d.errors)==null?void 0:s.join(`
603
- `))||(d==null?void 0:d.error)||"Move failed.";a.push(`${r}: ${u}`)}}catch(c){n++,a.push(`${r}: ${c instanceof Error?c.message:String(c)}`)}}if(n>0){let r=a.length>0?a.join(`
602
+ `))||(l==null?void 0:l.error)||"Move failed.";alert(c);return}this.refreshObjects()}catch(r){alert(`Move failed: ${r instanceof Error?r.message:String(r)}`)}}}async moveMultipleObjects(e,t){var s;let i=0,n=0,a=[];for(let r of e){let l=this.inferScreen(r,null);if(t===l){i++;continue}try{let c=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:r,fromScreenId:l,toScreenId:t})}),d=await c.json().catch(()=>({}));if(c.ok&&(d==null?void 0:d.success)!==!1)i++;else{n++;let p=((s=d==null?void 0:d.errors)==null?void 0:s.join(`
603
+ `))||(d==null?void 0:d.error)||"Move failed.";a.push(`${r}: ${p}`)}}catch(c){n++,a.push(`${r}: ${c instanceof Error?c.message:String(c)}`)}}if(n>0){let r=a.length>0?a.join(`
604
604
  `):`${n} object(s) failed to move.`;alert(`Moved ${i} object(s). Errors:
605
- ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenForSync();await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})})}catch(e){console.warn("[SceneObjectsPanel] Failed to sync screens:",e)}}getActiveScreenForSync(){let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:this.screenFilter!=="all"?this.screenFilter:"gameplay"}};var si=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}render(){return`
605
+ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenForSync();await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})})}catch(e){console.warn("[SceneObjectsPanel] Failed to sync screens:",e)}}getActiveScreenForSync(){let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:this.screenFilter!=="all"?this.screenFilter:"gameplay"}};var ri=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}render(){return`
606
606
  <div class="scene-tools-corner-panel ${this.isCollapsed?"collapsed":""}" data-panel="scene-tools-corner">
607
607
  <div class="scene-tools-header" data-tools-header data-panel-handle>
608
608
  <span class="scene-tools-title">Scene Tools</span>
@@ -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 E;this.isCollapsed=!this.isCollapsed,(E=this.root)==null||E.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let a=(E,A)=>{var S;let x=(S=this.root)==null?void 0:S.querySelector(`[data-status="${E}"]`);x&&x.classList.toggle("active",A)},s=this.root.querySelector("#debug-highlight-object");s==null||s.addEventListener("change",()=>{var E;(E=this.options)==null||E.onHighlightObject(!!s.checked),a("bounds",s.checked)});let r=this.root.querySelector("#debug-highlight-anchor");r==null||r.addEventListener("change",()=>{var E;(E=this.options)==null||E.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"),u=this.root.querySelector("#scene-grid-alpha"),p=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(!u)return .25;let E=Number(u.value),A=Number.isFinite(E)?Math.min(1,Math.max(0,E)):.25;return u.value=String(A),p&&(p.textContent=`${Math.round(A*100)}%`),A},w=(E,A,x)=>{var C,R;let S=x!==void 0?x:y();(R=(C=this.options)==null?void 0:C.onGridToggle)==null||R.call(C,E,A,S),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:E,gap:A,alpha:S}}))},v=E=>{var x,S;let A=y();(S=(x=this.options)==null?void 0:x.onGridGapChange)==null||S.call(x,E),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:E,alpha:A}}))},k=E=>{var A,x;(x=(A=this.options)==null?void 0:A.onGridAlphaChange)==null||x.call(A,E),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:j(),alpha:E}}))},M=E=>{var A,x;(x=(A=this.options)==null?void 0:A.onPlayModeChange)==null||x.call(A,E),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:E}}))},_=E=>{var A,x;(x=(A=this.options)==null?void 0:A.onBackgroundCoverChange)==null||x.call(A,E),window.dispatchEvent(new CustomEvent("scene-editor:background-cover",{detail:{enabled:E}}))},T=E=>{var A,x;(x=(A=this.options)==null?void 0:A.onBackgroundLockChange)==null||x.call(A,E),window.dispatchEvent(new CustomEvent("scene-editor:background-lock",{detail:{enabled:E}}))},j=()=>{if(!d)return 50;let E=Number(d.value),A=Number.isFinite(E)?Math.min(200,Math.max(4,E)):50;return d.value=String(A),A},P=E=>{c&&(c.checked=E),d&&(d.disabled=!E),u&&(u.disabled=!E),f==null||f.classList.toggle("active",E)},L=E=>{g&&(g.checked=E),b==null||b.classList.toggle("active",E)};try{let E=localStorage.getItem(this.getSceneStorageKey("grid_enabled")),A=localStorage.getItem(this.getSceneStorageKey("grid_gap")),x=localStorage.getItem(this.getSceneStorageKey("grid_alpha")),S=localStorage.getItem(this.getSceneStorageKey("highlight_anchor")),C=localStorage.getItem(this.getSceneStorageKey("background_cover")),R=localStorage.getItem(this.getSceneStorageKey("background_lock")),I=E?E==="true":!1;P(I),d&&(d.value=A||"50",d.disabled=!I),u&&(u.value=x||"0.25",u.disabled=!I,y()),r&&(r.checked=S==="true",a("anchor",r.checked));let O=!0;L(O),g&&(g.disabled=!0),b&&(b.disabled=!0);try{localStorage.setItem(this.getSceneStorageKey("play_mode"),O?"true":"false")}catch{}w(I,j(),y()),M(O);let z=C?C==="true":!0,$=R?R==="true":!0;h&&(h.checked=z),m&&(m.checked=$),_(z),T($),r&&window.dispatchEvent(new CustomEvent("scene-editor:highlight-anchor",{detail:{enabled:r.checked}}))}catch{}c==null||c.addEventListener("change",()=>{let E=j(),A=y();d&&(d.disabled=!c.checked),u&&(u.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(E)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(A))}catch{}w(c.checked,E,A)}),d==null||d.addEventListener("input",()=>{let E=j(),A=y();try{localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(E)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(A))}catch{}v(E)}),u==null||u.addEventListener("input",()=>{let E=y(),A=j();try{localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(E)),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(A))}catch{}k(E)}),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),M(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{}T(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 ri=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 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`
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>
@@ -742,7 +742,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
742
742
  </div>
743
743
  </div>
744
744
  </div>
745
- `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(a=>{a.addEventListener("click",()=>{var l,c,d,u;let s=a.dataset.nudge,r=this.getNudgeStep();switch(s){case"up":(l=this.options)==null||l.onNudge(0,-r);break;case"down":(c=this.options)==null||c.onNudge(0,r);break;case"left":(d=this.options)==null||d.onNudge(-r,0);break;case"right":(u=this.options)==null||u.onNudge(r,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(a=>{a.addEventListener("click",()=>{var l;let r=a.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(r)})})}show(){var e;(e=this.root)==null||e.classList.remove("hidden")}hide(){var e;(e=this.root)==null||e.classList.add("hidden")}getNudgeStep(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector("#nudge-step-input"),t=Number((n=e==null?void 0:e.value)!=null?n:10);return Number.isFinite(t)&&t>0?t:10}};var Mt=class{constructor(){this.root=null;this.slotsContainer=null;this.assetsContainer=null;this.assetSearchInput=null;this.slotSearchInput=null;this.options=null;this.registry=null;this.selectedSlotId=null;this.cachedAssets={};this.pendingAssetFetches={};this.cacheBust=0;this.missingPreviewPaths=new Set;this.slotSearchDebounce=null;this.assetSearchDebounce=null}mergeRegistries(e,t){let i=e||{},n=t||{},a={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},s=Array.isArray(i.slots)?i.slots:[];if(s.length>0&&a.slots.length>0)for(let c of a.slots){let d=s.find(u=>(u==null?void 0:u.slotId)&&u.slotId===(c==null?void 0:c.slotId));d!=null&&d.currentAsset&&d.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=d.currentAsset)}let r=i.libraryAssets||{};for(let[c,d]of Object.entries(r)){if(!Array.isArray(d))continue;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let u=new Set((a.libraryAssets[c]||[]).map(p=>p==null?void 0:p.filename));for(let p of d){let g=p==null?void 0:p.filename;!g||u.has(g)||(a.libraryAssets[c].unshift(p),u.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
745
+ `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(a=>{a.addEventListener("click",()=>{var l,c,d,p;let s=a.dataset.nudge,r=this.getNudgeStep();switch(s){case"up":(l=this.options)==null||l.onNudge(0,-r);break;case"down":(c=this.options)==null||c.onNudge(0,r);break;case"left":(d=this.options)==null||d.onNudge(-r,0);break;case"right":(p=this.options)==null||p.onNudge(r,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(a=>{a.addEventListener("click",()=>{var l;let r=a.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(r)})})}show(){var e;(e=this.root)==null||e.classList.remove("hidden")}hide(){var e;(e=this.root)==null||e.classList.add("hidden")}getNudgeStep(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector("#nudge-step-input"),t=Number((n=e==null?void 0:e.value)!=null?n:10);return Number.isFinite(t)&&t>0?t:10}};var Mt=class{constructor(){this.root=null;this.slotsContainer=null;this.assetsContainer=null;this.assetSearchInput=null;this.slotSearchInput=null;this.options=null;this.registry=null;this.selectedSlotId=null;this.cachedAssets={};this.pendingAssetFetches={};this.cacheBust=0;this.missingPreviewPaths=new Set;this.slotSearchDebounce=null;this.assetSearchDebounce=null;this.isApplying=!1}mergeRegistries(e,t){let i=e||{},n=t||{},a={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},s=Array.isArray(i.slots)?i.slots:[];if(s.length>0&&a.slots.length>0)for(let c of a.slots){let d=s.find(p=>(p==null?void 0:p.slotId)&&p.slotId===(c==null?void 0:c.slotId));d!=null&&d.currentAsset&&d.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=d.currentAsset)}let r=i.libraryAssets||{};for(let[c,d]of Object.entries(r)){if(!Array.isArray(d))continue;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let p=new Set((a.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of d){let g=u==null?void 0:u.filename;!g||p.has(g)||(a.libraryAssets[c].unshift(u),p.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
746
746
  <div class="scene-panel library-panel panel-accent-purple" data-panel="library">
747
747
  <div class="scene-panel-header" data-panel-handle>
748
748
  <div class="panel-title">
@@ -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,u,p;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)}),(u=this.assetSearchInput)==null||u.addEventListener("input",()=>this.scheduleRenderAssets()),(p=this.slotSearchInput)==null||p.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 u=this.registry.slots.find(p=>p.objectId===d);u?this.selectedSlotId=u.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 u=this.createSlotElement(d,t);c.appendChild(u)}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"),k=this.resolveSlotPreviewPaths(e),M=k.primary,_=(w=k.fallback)!=null?w:null;if(!M)v.style.display="none";else if(this.missingPreviewPaths.has(M.key)&&(!_||this.missingPreviewPaths.has(_.key)))v.style.display="none";else{v.src=M.src(t),v.alt=e.displayName,v.className="slot-thumbnail",v.loading="lazy";let T=!1;v.onerror=()=>{if(T){v.onerror=null,v.style.display="none";return}if(this.missingPreviewPaths.add(M.key),_&&!this.missingPreviewPaths.has(_.key)){T=!0,v.src=_.src(t);return}_&&this.missingPreviewPaths.add(_.key),v.style.display="none"}}c.appendChild(v)}l.appendChild(c);let u=document.createElement("div");u.className="slot-info";let p=document.createElement("div");p.className="slot-name",p.textContent=e.displayName;let g=document.createElement("div");g.className="slot-asset",g.textContent=e.currentAsset,u.appendChild(p),u.appendChild(g),l.appendChild(u);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 u=d.filter(m=>t?`${m.displayName} ${m.filename} ${c}`.toLowerCase().includes(t):!0);if(u.length===0)continue;let p=document.createElement("div");p.className="library-category";let g=document.createElement("div");g.className="library-category-header",g.textContent=this.formatCategoryName(c),p.appendChild(g);let h=document.createElement("div");h.className="slot-library",h.style.borderTop="none",h.style.padding="10px";for(let m of u){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}p.appendChild(h),this.assetsContainer.appendChild(p)}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;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let a=window.__wizardAssetPicker;if(a!=null&&a.onPick){let l=`raw/library/${i||e.libraryFolder||e.category}/${t}`;a.onPick(l),window.__wizardAssetPicker=null;return}let s=i||e.libraryFolder||e.category;await((n=this.options)==null?void 0:n.onApply(e.objectId,t,s)),e.currentAsset=t,e.libraryFolder=s,this.renderSlots(),this.renderAssets()}catch(a){console.error("[LIBRARY] Failed to apply asset:",a)}}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,""),u=((a=i.name.toLowerCase().match(/\.(png|jpg|jpeg|gif|webp)$/))==null?void 0:a[1])||"png",p=u==="jpg"?"jpeg":u,g=`${d}_uploaded_${Date.now()}.${p}`,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,k=10;for(;!w&&v<k;){v++,console.log(`[Library] Refresh attempt ${v}/${k}...`);try{(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok&&console.log("[Library] \u2705 Registry rebuilt from disk")}catch(L){console.warn("[Library] Setup-library not available:",L)}await new Promise(L=>setTimeout(L,300)),await this.refresh();let j=window.reRenderAssetLibrary;typeof j=="function"&&(console.log("[Library] Re-rendering library panel..."),j());let P=window.getEditableAssets;if(typeof P=="function"){let L=P(),E=((s=L==null?void 0:L.libraryAssets)==null?void 0:s[h])||[];E.some(x=>(x==null?void 0:x.filename)===g)?(console.log("[Library] \u2705 Asset found in registry!"),w=!0):(console.log(`[Library] Asset not found yet, retrying... (found ${E.length} assets in ${h})`),await new Promise(x=>setTimeout(x,500)))}else v>=2&&(w=!0)}w||console.warn("[Library] \u26A0\uFE0F Asset not found in registry after retries, proceeding anyway...");let M=!1,_=0,T=5;for(;!M&&_<T;){_++;try{console.log(`[Library] Applying asset attempt ${_}/${T}...`),await this.handleApply(e,g,e.category),await new Promise(P=>setTimeout(P,200));let j=window.getEditableObjectConfig;if(typeof j=="function"){let P=j(e.objectId),L=((l=(r=P==null?void 0:P.render)==null?void 0:r.asset)==null?void 0:l.path)||"";L===f.path||L.includes(g)?(console.log("[Library] \u2705 Asset confirmed applied to object"),M=!0):(console.log(`[Library] Asset not applied yet (attempt ${_}), retrying...`),await new Promise(E=>setTimeout(E,300)))}else M=!0}catch(j){console.error(`[Library] Apply attempt ${_} failed:`,j),_<T&&await new Promise(P=>setTimeout(P,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),M?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 oi=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 li=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(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`
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>
@@ -792,7 +792,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
792
792
  </div>
793
793
  `}
794
794
  </div>
795
- `}getThumbnailUrl(e){if(e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("http"))return e;let t=`t=${Date.now()}`,i=e.replace(/^\.?\//,"");if(i.startsWith("raw/")||i.startsWith("assets/")||i.startsWith("library/")){let n=`/${i}`;return n.includes("?")?`${n}&${t}`:`${n}?${t}`}return`/raw/${i}?${t}`}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ci=class{render(e,t,i,n){let a=i||"#000000";return`
795
+ `}getThumbnailUrl(e){if(e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("http"))return e;let t=`t=${Date.now()}`,i=e.replace(/^\.?\//,"");if(i.startsWith("raw/")||i.startsWith("assets/")||i.startsWith("library/")){let n=`/${i}`;return n.includes("?")?`${n}&${t}`:`${n}?${t}`}return`/raw/${i}?${t}`}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var di=class{render(e,t,i,n){let a=i||"#000000";return`
796
796
  <div class="inspector-property inspector-property-color">
797
797
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
798
798
  <div class="inspector-color-group">
@@ -808,7 +808,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
808
808
  data-object-id="${e}" />
809
809
  </div>
810
810
  </div>
811
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var di=class{render(e,t,i,n){return`
811
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var pi=class{render(e,t,i,n){return`
812
812
  <div class="inspector-property inspector-property-number">
813
813
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
814
814
  <input type="number"
@@ -818,7 +818,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
818
818
  data-object-id="${e}"
819
819
  step="any" />
820
820
  </div>
821
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var pi=class{render(e,t,i,n){let a=String(i||"");return`
821
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ui=class{render(e,t,i,n){let a=String(i||"");return`
822
822
  <div class="inspector-property inspector-property-text">
823
823
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
824
824
  <div class="inspector-input-group">
@@ -829,7 +829,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
829
829
  data-object-id="${e}" />
830
830
  </div>
831
831
  </div>
832
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ui=class{render(e,t,i,n){return`
832
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var gi=class{render(e,t,i,n){return`
833
833
  <div class="inspector-property inspector-property-boolean">
834
834
  <label class="inspector-property-label">
835
835
  <input type="checkbox"
@@ -840,18 +840,18 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
840
840
  <span>${this.formatLabel(t)}</span>
841
841
  </label>
842
842
  </div>
843
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var gi=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let s=this.registry,r=Array.isArray(i)?i:[],l=r.map((d,u)=>{let p=`${n}.${u}`,g=`
843
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var hi=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let s=this.registry,r=Array.isArray(i)?i:[],l=r.map((d,p)=>{let u=`${n}.${p}`,g=`
844
844
  <button class="inspector-button inspector-button-small"
845
845
  data-logic-remove="true"
846
846
  data-object-id="${e}"
847
847
  data-property-path="${n}"
848
- data-index="${u}">
848
+ data-index="${p}">
849
849
  Remove
850
850
  </button>
851
- `;if(d&&typeof d=="object"&&!Array.isArray(d)){let m=s.renderProperty(e,"logic",d,p);return`
851
+ `;if(d&&typeof d=="object"&&!Array.isArray(d)){let m=s.renderProperty(e,"logic",d,u);return`
852
852
  <div class="inspector-array-item inspector-logic-item">
853
853
  <div class="inspector-array-item-header">
854
- <span>Logic ${u+1}</span>
854
+ <span>Logic ${p+1}</span>
855
855
  ${g}
856
856
  </div>
857
857
  <div class="inspector-array-item-body">
@@ -861,13 +861,13 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
861
861
  `}let h=typeof d=="string"?d:JSON.stringify(d);return`
862
862
  <div class="inspector-array-item inspector-logic-item">
863
863
  <div class="inspector-array-item-header">
864
- <span>Logic ${u+1}</span>
864
+ <span>Logic ${p+1}</span>
865
865
  ${g}
866
866
  <button class="inspector-button inspector-button-small"
867
867
  data-logic-convert="true"
868
868
  data-object-id="${e}"
869
869
  data-property-path="${n}"
870
- data-index="${u}">
870
+ data-index="${p}">
871
871
  Convert
872
872
  </button>
873
873
  </div>
@@ -904,7 +904,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
904
904
  ${a}
905
905
  </div>
906
906
  </div>
907
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var hi=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&i&&typeof i=="object"&&!Array.isArray(i))return this.renderLogic(e,t,i,n);let a=[];for(let r in i){let l=i[r],c=`${n}.${r}`,d=this.registry.renderProperty(e,r,l,c);d&&a.push(d)}return a.length===0?"":a.length<=4&&a.every(r=>r.includes("inspector-property"))?`
907
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var mi=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&i&&typeof i=="object"&&!Array.isArray(i))return this.renderLogic(e,t,i,n);let a=[];for(let r in i){let l=i[r],c=`${n}.${r}`,d=this.registry.renderProperty(e,r,l,c);d&&a.push(d)}return a.length===0?"":a.length<=4&&a.every(r=>r.includes("inspector-property"))?`
908
908
  <div class="inspector-subsection">
909
909
  <div class="inspector-subsection-title">${this.formatLabel(t)}</div>
910
910
  <div class="inspector-subsection-content">
@@ -918,7 +918,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
918
918
  ${a.join("")}
919
919
  </div>
920
920
  </div>
921
- `}renderLogic(e,t,i,n){let a=[],s=typeof(i==null?void 0:i.id)=="string"?i.id:"",r={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let p=window,g=Array.isArray(p==null?void 0:p.__HANDLER_LOGIC_OPTIONS)?p.__HANDLER_LOGIC_OPTIONS:[],m=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(f=>String(f)).filter(f=>f.trim().length>0);return Array.from(new Set(m)).sort((f,b)=>f.localeCompare(b))})(),c=s&&!l.includes(s)?[s,...l]:l;a.push(`
921
+ `}renderLogic(e,t,i,n){let a=[],s=typeof(i==null?void 0:i.id)=="string"?i.id:"",r={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let u=window,g=Array.isArray(u==null?void 0:u.__HANDLER_LOGIC_OPTIONS)?u.__HANDLER_LOGIC_OPTIONS:[],m=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(f=>String(f)).filter(f=>f.trim().length>0);return Array.from(new Set(m)).sort((f,b)=>f.localeCompare(b))})(),c=s&&!l.includes(s)?[s,...l]:l;a.push(`
922
922
  <div class="inspector-property inspector-property-text">
923
923
  <label class="inspector-property-label">Id</label>
924
924
  <div class="inspector-input-group">
@@ -927,19 +927,19 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
927
927
  data-object-id="${e}"
928
928
  data-logic-id-selector="true">
929
929
  <option value="" ${s?"":"selected"}>None</option>
930
- ${c.map(p=>`<option value="${p}" ${p===s?"selected":""}>${p}</option>`).join("")}
930
+ ${c.map(u=>`<option value="${u}" ${u===s?"selected":""}>${u}</option>`).join("")}
931
931
  </select>
932
932
  </div>
933
933
  </div>
934
- `);for(let p in i){if(p==="id")continue;let g=i[p],h=`${n}.${p}`;if(p==="props"&&g&&typeof g=="object"){let f=[];for(let b in g){let y=g[b],w=`${h}.${b}`,v=r[b];if(b==="targetId"||b==="inputId"){let k=this.registry.getObjectIds(),M=typeof y=="string"?y:"",_=M&&!k.includes(M)?[M,...k]:k;f.push(`
934
+ `);for(let u in i){if(u==="id")continue;let g=i[u],h=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let f=[];for(let b in g){let y=g[b],w=`${h}.${b}`,v=r[b];if(b==="targetId"||b==="inputId"){let T=this.registry.getObjectIds(),P=typeof y=="string"?y:"",_=P&&!T.includes(P)?[P,...T]:T;f.push(`
935
935
  <div class="inspector-property inspector-property-text">
936
936
  <label class="inspector-property-label">${this.formatLabel(b)}</label>
937
937
  <div class="inspector-input-group">
938
938
  <select class="inspector-component-select inspector-input"
939
939
  data-property-path="${w}"
940
940
  data-object-id="${e}">
941
- <option value="" ${M?"":"selected"}>None</option>
942
- ${_.map(T=>`<option value="${T}" ${T===M?"selected":""}>${T}</option>`).join("")}
941
+ <option value="" ${P?"":"selected"}>None</option>
942
+ ${_.map(I=>`<option value="${I}" ${I===P?"selected":""}>${I}</option>`).join("")}
943
943
  </select>
944
944
  </div>
945
945
  </div>
@@ -950,18 +950,18 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
950
950
  <select class="inspector-component-select inspector-input"
951
951
  data-property-path="${w}"
952
952
  data-object-id="${e}">
953
- ${v.map(k=>`<option value="${String(k)}" ${String(k)===String(y)?"selected":""}>${String(k)}</option>`).join("")}
953
+ ${v.map(T=>`<option value="${String(T)}" ${String(T)===String(y)?"selected":""}>${String(T)}</option>`).join("")}
954
954
  </select>
955
955
  </div>
956
956
  </div>
957
- `);else{let k=this.registry.renderProperty(e,b,y,w);k&&f.push(k)}}f.length&&a.push(`
957
+ `);else{let T=this.registry.renderProperty(e,b,y,w);T&&f.push(T)}}f.length&&a.push(`
958
958
  <div class="inspector-property inspector-property-object">
959
959
  <div class="inspector-object-header">Props</div>
960
960
  <div class="inspector-object-body">
961
961
  ${f.join("")}
962
962
  </div>
963
963
  </div>
964
- `);continue}let m=this.registry.renderProperty(e,p,g,h);m&&a.push(m)}if(a.length===0)return"";let u=/(^|\.)logic\.\d+$/.test(n)?"":`
964
+ `);continue}let m=this.registry.renderProperty(e,u,g,h);m&&a.push(m)}if(a.length===0)return"";let p=/(^|\.)logic\.\d+$/.test(n)?"":`
965
965
  <div class="inspector-array-actions" style="margin-top: 12px;">
966
966
  <button class="inspector-button"
967
967
  data-logic-add="true"
@@ -976,10 +976,10 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
976
976
  <div class="inspector-object-header">${this.formatLabel(t)}</div>
977
977
  <div class="inspector-object-body">
978
978
  ${a.join("")}
979
- ${u}
979
+ ${p}
980
980
  </div>
981
981
  </div>
982
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var mi=class{render(e,t,i,n,a){let s=i==null?"":String(i),r=Array.from(new Set(a.map(c=>String(c)))),l=s&&!r.includes(s)?[s,...r]:r;return`
982
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var fi=class{render(e,t,i,n,a){let s=i==null?"":String(i),r=Array.from(new Set(a.map(c=>String(c)))),l=s&&!r.includes(s)?[s,...r]:r;return`
983
983
  <div class="inspector-property inspector-property-text">
984
984
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
985
985
  <div class="inspector-input-group">
@@ -990,7 +990,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
990
990
  </select>
991
991
  </div>
992
992
  </div>
993
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var fi=class{render(e,t,i,n){let a=this.safeStringify(i);return`
993
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var bi=class{render(e,t,i,n){let a=this.safeStringify(i);return`
994
994
  <div class="inspector-property inspector-property-text">
995
995
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
996
996
  <div class="inspector-input-group">
@@ -1001,7 +1001,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
1001
1001
  rows="6">${a}</textarea>
1002
1002
  </div>
1003
1003
  </div>
1004
- `}safeStringify(e){try{return JSON.stringify(e!=null?e:[],null,2)}catch{return"[]"}}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var bi=class{render(e,t,i,n){let s=(Array.isArray(i)?i:[]).map((r,l)=>{let c=typeof(r==null?void 0:r.x)=="number"?r.x:0,d=typeof(r==null?void 0:r.y)=="number"?r.y:0;return`
1004
+ `}safeStringify(e){try{return JSON.stringify(e!=null?e:[],null,2)}catch{return"[]"}}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var yi=class{render(e,t,i,n){let s=(Array.isArray(i)?i:[]).map((r,l)=>{let c=typeof(r==null?void 0:r.x)=="number"?r.x:0,d=typeof(r==null?void 0:r.y)=="number"?r.y:0;return`
1005
1005
  <div class="inspector-row" style="gap:8px; align-items:center;">
1006
1006
  <input type="number"
1007
1007
  class="inspector-input"
@@ -1034,7 +1034,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
1034
1034
  </div>
1035
1035
  </div>
1036
1036
  </div>
1037
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var yi=class{constructor(e){this.registry=e}render(e,t,i,n){let a=Array.isArray(i)?i:[],r=["",...this.registry.getObjectIds()],l=a.map((c,d)=>{let u=typeof(c==null?void 0:c.templateId)=="string"?c.templateId:"",p=typeof(c==null?void 0:c.weight)=="number"?c.weight:1,g=r.map(h=>`<option value="${h}"${h===u?" selected":""}>${h||"(none)"}</option>`).join("");return`
1037
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var vi=class{constructor(e){this.registry=e}render(e,t,i,n){let a=Array.isArray(i)?i:[],r=["",...this.registry.getObjectIds()],l=a.map((c,d)=>{let p=typeof(c==null?void 0:c.templateId)=="string"?c.templateId:"",u=typeof(c==null?void 0:c.weight)=="number"?c.weight:1,g=r.map(h=>`<option value="${h}"${h===p?" selected":""}>${h||"(none)"}</option>`).join("");return`
1038
1038
  <div class="inspector-row" style="gap:8px; align-items:center;">
1039
1039
  <select class="inspector-select inspector-input"
1040
1040
  data-property-path="${n}.${d}.templateId"
@@ -1044,7 +1044,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
1044
1044
  <input type="number"
1045
1045
  class="inspector-input"
1046
1046
  style="width:72px;"
1047
- value="${p}"
1047
+ value="${u}"
1048
1048
  placeholder="weight"
1049
1049
  data-property-path="${n}.${d}.weight"
1050
1050
  data-object-id="${e}" />
@@ -1069,7 +1069,7 @@ ${r}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
1069
1069
  </div>
1070
1070
  </div>
1071
1071
  </div>
1072
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};import{Graphics as Yr}from"pixi.js";var Oe={width:400,height:600,designWidth:400,scaleFactor:1},wi={scale:1,position:1},xi=[];function Wr(o,e,t,i,n,a,s){xi.push({element:o,originalScale:a,positionHelper:e,heightPercent:n}),e(o,t,i,n,a,s,!1)}function Kr(){xi.forEach(({element:o,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*Oe.scaleFactor;t(o,Oe.width,Oe.height,i,n,!0,!1)})}function Xr(){xi.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function hn(o,e){console.log(`[SCREEN] updateScreenState called: ${o}x${e}`),Oe.width=o,Oe.height=e,Oe.scaleFactor=Math.min(o/Oe.designWidth,1.15),wi.scale=Oe.scaleFactor,wi.position=1,console.log(`[SCREEN] Global multipliers - scale: ${wi.scale.toFixed(3)}`),Kr()}var ee={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 Jr(o,e,t){let i=ee[o];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${o}.${e} = ${t}`))}function Zr(){return ee}var Qr={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 vi(o,e){return typeof o=="number"&&Number.isFinite(o)?o:e}function ze(o,e={x:.5,y:.5}){var t;if(Array.isArray(o))return{x:vi(o[0],e.x),y:vi(o[1],e.y)};if(o&&typeof o=="object"){let i=o;return{x:vi(i.x,e.x),y:vi(i.y,e.y)}}if(typeof o=="string"){let i=o.trim().toLowerCase();return(t=Qr[i])!=null?t:e}return e}function we(o,e,t,i={}){var g,h,m,f,b,y;let n=ze(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,u=Math.max(0,o-r-l),p=Math.max(0,e-c-d);return{x:r+u*n.x,y:c+p*n.y}}function $e(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),u=Math.max(0,e-l-c),p=ze(t,{x:.5,y:.5}),g=Math.min(Math.max(p.x,0),1),h=Math.min(Math.max(p.y,0),1);return{x:s+d*g,y:l+u*h}}function mn(o,e,t,i={}){var d,u,p;if(!o)return;let n=i.positionRatio?$e(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):we(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),xe(o,s,r);let l=(u=i.scale)!=null?u:1,c=(p=i.scaleMultiplier)!=null?p:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&ke(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,hn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),hn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Jr,window.getDebugConfig=Zr,window.copyConfig=po,window.applyConfig=jt,window.applyConfigForRatio=uo,window.positionAtBottom=Ls,window.positionAtTop=io,window.positionAtCenter=no,window.positionAtLeft=ao,window.positionAtRight=so,window.positionAtBottomLeft=ro,window.positionAtBottomRight=oo,window.positionAtTopLeft=lo,window.positionAtTopRight=co,window.applyPositionContract=to,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function Si(o,e,t=0){return o*e+t}function Ei(o,e,t=0){return o*(1-e)+t}function Ai(o,e,t=0){return o*e+t}function Ci(o,e,t=0){return o*(1-e)+t}function ye(o,e=0){return o/2+e}function eo(o,e){return o*e}function to(o,e,t,i){var s,r,l,c,d,u,p,g,h,m,f,b,y,w,v,k,M,_,T,j;let n=0,a=0;switch(i.type){case"top":n=ye(e,(r=(s=i.offset)==null?void 0:s.x)!=null?r:0),a=Si(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ye(e,(u=(d=i.offset)==null?void 0:d.x)!=null?u:0),a=Ei(t,i.percent,(g=(p=i.offset)==null?void 0:p.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=ye(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":n=Ci(e,i.percent,(w=(y=i.offset)==null?void 0:y.x)!=null?w:0),a=ye(t,(k=(v=i.offset)==null?void 0:v.y)!=null?k:0);break;case"center":n=ye(e,(_=(M=i.offset)==null?void 0:M.x)!=null?_:0),a=ye(t,(j=(T=i.offset)==null?void 0:T.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 Ls(o,e,t,i=.2,n=1,a=!0,s=!1){let r=eo(t,i),l=Ei(t,i/2);xe(o,ye(e),l);let c=a?n*Oe.scaleFactor:n;ke(o,c),s&&!xi.find(d=>d.element===o)&&Wr(o,Ls,e,t,i,n,a)}function io(o,e,t,i=.1,n=1){xe(o,ye(e),Si(t,i)),ke(o,n)}function no(o,e,t,i=0,n=0,a=1){xe(o,ye(e,i),ye(t,n)),ke(o,a)}function ao(o,e,t,i=.1,n=1){xe(o,Ai(e,i),ye(t)),ke(o,n)}function so(o,e,t,i=.1,n=1){xe(o,Ci(e,i),ye(t)),ke(o,n)}function ro(o,e,t,i=.05,n=.05,a=1){xe(o,Ai(e,n),Ei(t,i)),ke(o,a)}function oo(o,e,t,i=.05,n=.05,a=1){xe(o,Ci(e,n),Ei(t,i)),ke(o,a)}function lo(o,e,t,i=.05,n=.05,a=1){xe(o,Ai(e,n),Si(t,i)),ke(o,a)}function co(o,e,t,i=.05,n=.05,a=1){xe(o,Ci(e,n),Si(t,i)),ke(o,a)}function xe(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 ke(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 po(o){return o&&Qe[o]?JSON.parse(JSON.stringify(Qe[o])):JSON.parse(JSON.stringify(ee))}function jt(o){Object.keys(o).forEach(e=>{let t=e;ee[t]&&o[t]&&Object.assign(ee[t],o[t])}),console.log("Config applied:",o)}function uo(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||ze,o.resolveScreenAnchorPoint=o.resolveScreenAnchorPoint||we,o.resolveScreenRatioPoint=o.resolveScreenRatioPoint||$e}var me=null,Cs=new Map;function go(o,e,t,i,n,a={}){var $,q,B,F,D,G,W,K,N,te,J,Z,pe,re,Me,je,Y,oe,ie,ue,Ue,Xe,ga,ha,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;let s=($=a.enableDebugLogs)!=null?$:!1;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== STARTING LAYOUT CALCULATION ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Screen dimensions:",{width:i.width,height:i.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Time:",t),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Options:",a));let{mainContainer:r,label:l,background:c,backgroundTexture:d,app:u}=o;if(!u||!u.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:u.renderer.width,height:u.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:u.screen.width,height:u.screen.height}));let p=i.width,g=i.height;s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:p,baseHeight:g});let h=p*ee.layout.screen_scale_x,m=g*ee.layout.screen_scale_y,f=p/2,b=e.engine.runtime||{},y=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:ee.layout.screen_scale_x,screen_scale_y:ee.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,k=(B=y.design_height_portrait)!=null?B:w?600:400,M=Math.min(h/v,m/k);M=Math.min(M,1.15);let _=M*((F=ee.engine.scale)!=null?F:1),T=(D=a.skipMainContainerTransform)!=null?D:!1;!T&&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",P=(W=y.main_container_position_ratio)!=null?W:{x:.5,y:.5},L=(K=y.main_container_offset)!=null?K:{x:0,y:0},E=y.main_container_position_ratio?$e(p,g,P):we(p,g,j),A=E.x+L.x+ee.layout.position_offset.x,x=E.y+L.y+ee.layout.position_offset.y;if(!T&&r&&r.position&&(typeof r.position.set=="function"?r.position.set(A,x):(r.position.x=A,r.position.y=x)),n&&(r!=null&&r.toLocal)){let ce=g>p,he=(N=y.design_width_portrait)!=null?N:ce?320:480,se=(te=y.design_height_portrait)!=null?te:ce?480:320;for(let[Ee,Ae]of e.objects.entries()){let ge=Ae==null?void 0:Ae.transform;if(!ge||((J=ge.position_mode)!=null?J:"static")!=="static")continue;let V=(Z=n.get)==null?void 0:Z.call(n,Ee),Lt=((pe=V==null?void 0:V.getDisplayObject)==null?void 0:pe.call(V))||(V==null?void 0:V.pixiObject)||V;if(!Lt||Lt.parent!==r)continue;let _e=(re=ge.anchor)!=null?re:"bottom-left";_e==="bottom-left"&&ge.anchor==null&&console.log("[DEBUG FALLBACK] LayoutManager transform.anchor \u2192 bottom-left");let nt=ge.position_ratio!=null?$e(he,se,ge.position_ratio):we(he,se,_e),at=(Me=ge.position)!=null?Me:{x:0,y:0},kt=nt.x-he/2+at.x,Je=nt.y-se/2+at.y;typeof(V==null?void 0:V.setPosition)=="function"?V.setPosition(kt,Je):(xe(Lt,kt,Je),(je=V==null?void 0:V.transform)!=null&&je.position&&(V.transform.position.x=kt,V.transform.position.y=Je))}}let S=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,R=((S==null?void 0:S.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(ee.layout.debug_rect_visible&&R){(!me||me.parent!==u.stage)&&(me==null||me.destroy(),me=new Yr,me.zIndex=9999,u.stage.addChild(me)),me.clear();let ce=ee.layout.debug_rect_scale_x,he=ee.layout.debug_rect_scale_y,se=(p-4)*ce,Ee=(g-4)*he,Ae=(p-se)/2,ge=(g-Ee)/2;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:p,baseHeight:g,rectW:se,rectH:Ee,offsetX:Ae,offsetY:ge}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+Ae,y:2+ge,width:se,height:Ee})),me.rect(2+Ae,2+ge,se,Ee).stroke({width:ee.layout.debug_rect_thickness,color:ee.layout.debug_rect_color})}else me&&(me.destroy(),me=null);let I=((Y=o.label)==null?void 0:Y.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&I){let ce=(ie=(oe=I==null?void 0:I.transform)==null?void 0:oe.anchor)!=null?ie:"center",he=(ue=I==null?void 0:I.transform)==null?void 0:ue.position_ratio,se=((Ue=I==null?void 0:I.transform)==null?void 0:Ue.offset)||{x:0,y:0};mn(l,p,g,{anchor:ce,positionRatio:he,offset:{x:se.x*_,y:se.y*_},renderAnchor:ze(ce)})}if(l&&l.alpha>0){let ce=1+Math.sin(t*ee.engine.label_pulse_speed)*ee.engine.label_pulse_intensity,he=(ga=(Xe=I==null?void 0:I.transform)==null?void 0:Xe.scale)!=null?ga:1,se=ce*_*he;l.scale&&(typeof l.scale.set=="function"?l.scale.set(se):(l.scale.x=se,l.scale.y=se))}s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING =====");let O=c?e.objects.get("background_1"):null,z=!!O&&(c==null?void 0:c.parent)===r;if(c&&!z){s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(ha=c.constructor)==null?void 0:ha.name)),c.alpha=((fa=(ma=b.background)==null?void 0:ma.alpha)!=null?fa:.98)*ee.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 ce=(O==null?void 0:O.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ce);let he=ce.offset||{x:0,y:0},se=((ya=(ba=b.background)==null?void 0:ba.offset_y)!=null?ya:0)+ee.engine.background_offset_y,Ee=(va=ce.anchor)!=null?va:"center",Ae=ce.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:he,bgRuntimeOffsetY:se,bgScreenAnchor:Ee,bgPositionRatio:Ae,baseWidth:p,baseHeight:g,finalScale:_}),mn(c,p,g,{anchor:Ee,positionRatio:Ae,offset:{x:he.x*_,y:he.y*_+se},renderAnchor:ze(Ee)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(wa=c.scale)==null?void 0:wa.x,scaleY:(xa=c.scale)==null?void 0:xa.y,anchorX:(Sa=c.anchor)==null?void 0:Sa.x,anchorY:(Ea=c.anchor)==null?void 0:Ea.y,pivotX:(Aa=c.pivot)==null?void 0:Aa.x,pivotY:(Ca=c.pivot)==null?void 0:Ca.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=(ka=(La=b.background)==null?void 0:La.scale_multiplier)!=null?ka:1.05,kt=(Ta=ce.scale)!=null?Ta:1,Je=nt*at*ee.engine.background_scale*kt;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 ge=`${p}x${g}`,X=Cs.get(ge),V={x:Number((Pa=c.x)!=null?Pa:0),y:Number((Ia=c.y)!=null?Ia:0),scaleX:Number((ja=(Ma=c.scale)==null?void 0:Ma.x)!=null?ja:1),scaleY:Number((Ra=(_a=c.scale)==null?void 0:_a.y)!=null?Ra:1),rotation:Number.isFinite(c.rotation)?c.rotation:void 0,anchorX:Number.isFinite((Oa=c.anchor)==null?void 0:Oa.x)?c.anchor.x:void 0,anchorY:Number.isFinite((za=c.anchor)==null?void 0:za.y)?c.anchor.y:void 0,pivotX:Number.isFinite(($a=c.pivot)==null?void 0:$a.x)?c.pivot.x:void 0,pivotY:Number.isFinite((Da=c.pivot)==null?void 0:Da.y)?c.pivot.y:void 0},Lt=Number.isFinite(V.x)&&Number.isFinite(V.y)&&Number.isFinite(V.scaleX)&&Number.isFinite(V.scaleY),_e=V;if(X){let nt=Math.hypot(V.x-X.x,V.y-X.y),at=Math.max(p,g)*.5;(!Lt||nt>at)&&((Ha=c.position)!=null&&Ha.set?c.position.set(X.x,X.y):(c.x=X.x,c.y=X.y),c.scale&&(typeof c.scale.set=="function"?c.scale.set(X.scaleX,X.scaleY):(c.scale.x=X.scaleX,c.scale.y=X.scaleY)),Number.isFinite(X.rotation)&&typeof c.rotation=="number"&&(c.rotation=X.rotation),c.anchor&&Number.isFinite(X.anchorX)&&Number.isFinite(X.anchorY)&&c.anchor.set(X.anchorX,X.anchorY),c.pivot&&Number.isFinite(X.pivotX)&&Number.isFinite(X.pivotY)&&c.pivot.set(X.pivotX,X.pivotY),_e=X)}Number.isFinite(_e.x)&&Number.isFinite(_e.y)&&Number.isFinite(_e.scaleX)&&Number.isFinite(_e.scaleY)&&Cs.set(ge,_e)}}var Li=class{constructor(){this.typeDetector=new oi,this.imageRenderer=new li,this.colorRenderer=new ci,this.numberRenderer=new di,this.textRenderer=new pi,this.booleanRenderer=new ui,this.arrayRenderer=new gi(this),this.objectRenderer=new hi(this),this.selectRenderer=new mi,this.jsonRenderer=new fi,this.spawnPointsRenderer=new bi,this.spawnTemplatesRenderer=new yi(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 p=d.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return p.length?p: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"],...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?`
1072
+ `}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"],...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?`
1073
1073
  ${m}
1074
1074
  <div class="inspector-array-actions">
1075
1075
  <button class="inspector-button"
@@ -1079,7 +1079,7 @@ ${m}
1079
1079
  Add Logic
1080
1080
  </button>
1081
1081
  </div>
1082
- `:m}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","left-center","right-center","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let u=c[t];if(u&&(n.includes("transform")||n.includes("render"))){let h;if(typeof i=="string")h=i;else if(i==null)h="center";else{let f=ze(i);h=u.find(y=>{let w=ze(y);return Math.abs(w.x-f.x)<.001&&Math.abs(w.y-f.y)<.001})||"custom"}let m=[...u];return h==="custom"&&!m.includes("custom")&&m.push("custom"),this.selectRenderer.render(e,t,h,n,m)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),m=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?m+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':m}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let m=["1","-1"],f=i==null?"1":String(i);return this.selectRenderer.render(e,t,f,n,m)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let m=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,m,n)}}let p=this.getEnumOptionsFromSchemas(n);if(p)return this.selectRenderer.render(e,t,i,n,p);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function ho(o,e){let t;return function(...n){let a=()=>{clearTimeout(t),o(...n)};clearTimeout(t),t=setTimeout(a,e)}}var ki=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new Li,this.updateManager=new Le,this.quickActions=new ti;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
1082
+ `:m}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","left-center","right-center","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let p=c[t];if(p&&(n.includes("transform")||n.includes("render"))){let h;if(typeof i=="string")h=i;else if(i==null)h="center";else{let f=$e(i);h=p.find(y=>{let w=$e(y);return Math.abs(w.x-f.x)<.001&&Math.abs(w.y-f.y)<.001})||"custom"}let m=[...p];return h==="custom"&&!m.includes("custom")&&m.push("custom"),this.selectRenderer.render(e,t,h,n,m)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),m=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?m+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':m}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let m=["1","-1"],f=i==null?"1":String(i);return this.selectRenderer.render(e,t,f,n,m)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let m=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,m,n)}}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function mo(o,e){let t;return function(...n){let a=()=>{clearTimeout(t),o(...n)};clearTimeout(t),t=setTimeout(a,e)}}var Ti=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new ki,this.updateManager=new Pe,this.quickActions=new ii;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
1083
1083
  <div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
1084
1084
  <div class="scene-panel-header" data-panel-handle>
1085
1085
  <div class="panel-title">
@@ -1129,7 +1129,7 @@ ${m}
1129
1129
  <button class="debug-btn debug-btn-sm primary" data-inspector-add-component-btn>Add</button>
1130
1130
  </div>
1131
1131
  </div>
1132
- `}renderSection(e,t,i,n){if(t==="motion")return this.renderMotionSection(e,i,n);if(t==="logic")return this.renderLogicSection(e,i,n);let a=[],s=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let c in i){if(!this.showAdvanced&&s.includes(c))continue;let d=i[c],u=`${n}.${c}`,p=this.rendererRegistry.renderProperty(e,c,d,u);p&&a.push(p)}return a.length===0?"":`
1132
+ `}renderSection(e,t,i,n){if(t==="motion")return this.renderMotionSection(e,i,n);if(t==="logic")return this.renderLogicSection(e,i,n);let a=[],s=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let c in i){if(!this.showAdvanced&&s.includes(c))continue;let d=i[c],p=`${n}.${c}`,u=this.rendererRegistry.renderProperty(e,c,d,p);u&&a.push(u)}return a.length===0?"":`
1133
1133
  <div class="inspector-section ${t==="transform"?"":"collapsed"}" data-section="${t}">
1134
1134
  <div class="inspector-section-header" data-section-toggle="${t}">
1135
1135
  <span class="inspector-section-arrow">\u25BC</span>
@@ -1168,24 +1168,24 @@ ${m}
1168
1168
  <button class="debug-btn debug-btn-sm ${this.motionSimpleMode?"primary":""}" data-motion-simple-toggle>
1169
1169
  ${this.motionSimpleMode?"Simple":"Advanced"}
1170
1170
  </button>
1171
- `,u='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',p=m=>{let f=m.split(".").filter(Boolean),b=s;for(let v of f)b=b==null?void 0:b[v];let y=f[f.length-1],w=`${i}.${m}`;return this.rendererRegistry.renderProperty(e,y,b,w)};if(this.motionSimpleMode){let m=p("enabled");m&&n.push(m);let f=[],b=p("intro.enabled"),y=p("intro.type"),w=p("intro.duration"),v=p("intro.easing");b&&f.push(b),y&&f.push(y),w&&f.push(w),v&&f.push(v),f.length&&n.push(`
1171
+ `,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',u=m=>{let f=m.split(".").filter(Boolean),b=s;for(let v of f)b=b==null?void 0:b[v];let y=f[f.length-1],w=`${i}.${m}`;return this.rendererRegistry.renderProperty(e,y,b,w)};if(this.motionSimpleMode){let m=u("enabled");m&&n.push(m);let f=[],b=u("intro.enabled"),y=u("intro.type"),w=u("intro.duration"),v=u("intro.easing");b&&f.push(b),y&&f.push(y),w&&f.push(w),v&&f.push(v),f.length&&n.push(`
1172
1172
  <div class="inspector-subsection">
1173
1173
  <div class="inspector-subsection-title">Intro</div>
1174
1174
  <div class="inspector-subsection-content">
1175
1175
  ${l}
1176
- ${u}
1176
+ ${p}
1177
1177
  ${f.join("")}
1178
1178
  </div>
1179
1179
  </div>
1180
- `);let k=[p("pulse.enabled"),p("pulse.speed"),p("pulse.intensity")].filter(Boolean),M=[p("swing.enabled"),p("swing.amplitude"),p("swing.speed"),p("swing.axis")].filter(Boolean),_=[p("continuousMove.enabled"),p("continuousMove.axis"),p("continuousMove.speed"),p("continuousMove.direction"),p("continuousMove.lifetime")].filter(Boolean),T=[p("continuousRotate.enabled"),p("continuousRotate.speed"),p("continuousRotate.direction")].filter(Boolean),j=[p("orbit.enabled"),p("orbit.radius"),p("orbit.speed"),p("orbit.direction"),p("orbit.pivotOffsetX"),p("orbit.pivotOffsetY")].filter(Boolean);if(k.length||M.length||_.length||T.length||j.length){let L=(A,x)=>x.length?`
1180
+ `);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?`
1181
1181
  <div class="inspector-motion-continuous-group">
1182
- <div class="inspector-subsection-title">${A}</div>
1183
- <div class="inspector-subsection-content">${x.join("")}</div>
1184
- </div>`:"",E=[L("Pulse",k),L("Swing",M),L("Move forever",_),L("Rotate (pivoting itself)",T),L("Rotate around",j)].filter(Boolean).join("");n.push(`
1182
+ <div class="inspector-subsection-title">${E}</div>
1183
+ <div class="inspector-subsection-content">${A.join("")}</div>
1184
+ </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(`
1185
1185
  <div class="inspector-subsection inspector-subsection-continuous">
1186
1186
  <div class="inspector-subsection-title">Continuous</div>
1187
1187
  <div class="inspector-subsection-content inspector-motion-continuous-groups">
1188
- ${E}
1188
+ ${x}
1189
1189
  </div>
1190
1190
  </div>
1191
1191
  `)}}else for(let m in s){let f=s[m],b=`${i}.${m}`,y=this.rendererRegistry.renderProperty(e,m,f,b);y&&n.push(y)}return n.length===0?"":`
@@ -1201,7 +1201,7 @@ ${m}
1201
1201
  ${n.join("")}
1202
1202
  </div>
1203
1203
  </div>
1204
- `}attachEventListeners(){var v,k,M,_;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=ho((T,j,P)=>{var L,E;this.updateManager.updateProperty(T,j,P),(E=(L=this.options)==null?void 0:L.onPropertyChange)==null||E.call(L,T,j,P)},300),i=T=>T?/(^|\.)logic(\.\d+)?\.id$/.test(T):!1;e.forEach(T=>{let j=E=>{var C,R;let A=E.target,x=A.dataset.propertyPath,S=A.dataset.objectId;if(x&&S){let I=A.value;if(A.type==="checkbox")I=A.checked;else if(A.type==="number"){if(I=parseFloat(A.value),isNaN(I))return}else if(A.dataset.json==="true")try{I=JSON.parse(A.value)}catch{return}A.type==="text"||A.type==="range"||A.tagName==="TEXTAREA"?t(S,x,I):(this.updateManager.updateProperty(S,x,I),(R=(C=this.options)==null?void 0:C.onPropertyChange)==null||R.call(C,S,x,I))}},P=T.dataset.propertyPath;P&&(P.includes("transform.anchor")||P.includes("render.anchor"))&&T.tagName==="SELECT"?T.addEventListener("change",async E=>{var R,I,O,z,$;let A=E.target,x=A.dataset.propertyPath,S=A.dataset.objectId,C=A.value;if(!(!x||!S)&&C!=="custom")if(x.includes("transform.anchor")){let q=window.getEditableObjectConfig,B=typeof q=="function"?q(S):null,F=(R=B==null?void 0:B.transform)==null?void 0:R.anchor,D=F!=null&&F!==""?F:"top-left",G=C;await this.updateManager.updateProperty(S,x,C),(O=(I=this.options)==null?void 0:I.onPropertyChange)==null||O.call(I,S,x,C),D!==G&&window.dispatchEvent(new CustomEvent("scene-editor:anchor-changed",{detail:{objectId:S,previousAnchor:D,nextAnchor:G}}))}else await this.updateManager.updateProperty(S,x,C),($=(z=this.options)==null?void 0:z.onPropertyChange)==null||$.call(z,S,x,C)}):i(P)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",P),T.addEventListener("change",async E=>{var $;let A=E.target,x=A.dataset.propertyPath,S=A.dataset.objectId,C=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",C),!x||!S)return;await this.updateManager.updateProperty(S,x,C),console.log("[Inspector v1.0.0] Logic ID updated");let R=window,I=($=R==null?void 0:R.__HANDLER_LOGIC_META)==null?void 0:$[C],O=this.getDefaultPropsForLogic(C,I);console.log("[Inspector v1.0.0] New logic default props:",O);let z=x.replace(/\.id$/,".props");await this.updateManager.updateProperty(S,z,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(S)})):(T.addEventListener("change",j),(T.tagName==="INPUT"||T.tagName==="TEXTAREA")&&T.addEventListener("input",j))}),this.contentContainer.querySelectorAll("[data-action]").forEach(T=>{T.addEventListener("click",j=>{let P=j.target,L=P.dataset.action,E=P.dataset.path,A=P.dataset.object;L&&E&&A&&this.quickActions.handleAction(L,A,E)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(T=>{T.addEventListener("click",j=>{var E,A;let P=j.target,L=P.dataset.sectionToggle||((E=P.closest("[data-section-toggle]"))==null?void 0:E.getAttribute("data-section-toggle"));if(L){let x=(A=this.contentContainer)==null?void 0:A.querySelector(`[data-section="${L}"]`);x==null||x.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(T=>{T.addEventListener("click",async j=>{let L=j.currentTarget.dataset.motionPreset;!L||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,L)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(T=>{T.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(T=>{T.addEventListener("click",async j=>{let P=j.target,L=P.dataset.objectId,E=P.dataset.propertyPath;if(!L||!E)return;let A=window.getEditableObjectConfig,x=A==null?void 0:A(L);if(!x)return;let S=this.updateManager.getNestedProperty(x,E),C=Array.isArray(S)?[...S]:[];C.push({x:0,y:0}),await this.updateManager.updateProperty(L,E,C),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(T=>{T.addEventListener("click",async j=>{let P=j.target,L=P.dataset.objectId,E=P.dataset.propertyPath,A=Number(P.dataset.index||"-1");if(!L||!E||A<0)return;let x=window.getEditableObjectConfig,S=x==null?void 0:x(L);if(!S)return;let C=this.updateManager.getNestedProperty(S,E);if(!Array.isArray(C))return;let R=C.filter((I,O)=>O!==A);await this.updateManager.updateProperty(L,E,R),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(T=>{T.addEventListener("click",async j=>{let P=j.target,L=P.dataset.objectId,E=P.dataset.propertyPath;if(!L||!E)return;let A=window.getEditableObjectConfig,x=A==null?void 0:A(L);if(!x)return;let S=this.updateManager.getNestedProperty(x,E),C=Array.isArray(S)?[...S]:[];C.push({templateId:"",weight:1}),await this.updateManager.updateProperty(L,E,C),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(T=>{T.addEventListener("click",async j=>{var I;let P=j.target,L=P.dataset.objectId,E=P.dataset.propertyPath,A=Number((I=P.dataset.index)!=null?I:-1);if(!L||!E||A<0)return;let x=window.getEditableObjectConfig,S=x==null?void 0:x(L);if(!S)return;let C=this.updateManager.getNestedProperty(S,E);if(!Array.isArray(C))return;let R=C.filter((O,z)=>z!==A);await this.updateManager.updateProperty(L,E,R),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(T=>{T.addEventListener("click",async j=>{var $;let P=j.target,L=P.dataset.objectId,E=P.dataset.propertyPath;if(!L||!E)return;let A=window.getEditableObjectConfig,x=A==null?void 0:A(L);if(!x)return;let S=this.updateManager.getNestedProperty(x,E),C;Array.isArray(S)?C=[...S]:S!=null?typeof S=="string"?C=[{id:S,props:{}}]:typeof S=="object"?C=[S]:C=[]:C=[];let R=this.getDefaultLogicId(),I=window,O=($=I==null?void 0:I.__HANDLER_LOGIC_META)==null?void 0:$[R],z=this.getDefaultPropsForLogic(R,O);C.push({id:R,props:z}),console.log("[InspectorPanel] Adding logic to array:",{objectId:L,path:E,current:S,next:C}),await this.updateManager.updateProperty(L,E,C),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(T=>{T.addEventListener("click",async j=>{var I;let P=j.target,L=P.dataset.objectId,E=P.dataset.propertyPath,A=Number((I=P.dataset.index)!=null?I:-1);if(!L||!E||A<0)return;let x=window.getEditableObjectConfig,S=x==null?void 0:x(L);if(!S)return;let C=this.updateManager.getNestedProperty(S,E);if(!Array.isArray(C))return;let R=C.filter((O,z)=>z!==A);await this.updateManager.updateProperty(L,E,R),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(T=>{T.addEventListener("click",async j=>{var q,B;let P=j.target,L=P.dataset.objectId,E=P.dataset.propertyPath,A=Number((q=P.dataset.index)!=null?q:-1);if(!L||!E||A<0)return;let x=window.getEditableObjectConfig,S=x==null?void 0:x(L);if(!S)return;let C=this.updateManager.getNestedProperty(S,E);if(!Array.isArray(C))return;let R=C[A];if(typeof R!="string")return;let I=window,O=(B=I==null?void 0:I.__HANDLER_LOGIC_META)==null?void 0:B[R],z=this.getDefaultPropsForLogic(R,O),$=[...C];$[A]={id:R,props:z},await this.updateManager.updateProperty(L,E,$),this.loadObject(L)})});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=(k=this.root)==null?void 0:k.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var j;let T=(j=this.root)==null?void 0:j.querySelector("[data-convert-menu]");T==null||T.classList.toggle("hidden")});let y=(M=this.contentContainer)==null?void 0:M.querySelector("[data-inspector-add-component-btn]"),w=(_=this.contentContainer)==null?void 0:_.querySelector("[data-inspector-component-select]");y==null||y.addEventListener("click",async()=>{let T=w.value;T&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,T)})}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=`
1204
+ `}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=`
1205
1205
  <div class="inspector-empty">
1206
1206
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
1207
1207
  <span class="inspector-empty-text">${e}</span>
@@ -1211,7 +1211,7 @@ ${m}
1211
1211
  <span class="inspector-empty-icon">\u{1F3AF}</span>
1212
1212
  <span class="inspector-empty-text">Select an object to inspect</span>
1213
1213
  </div>
1214
- `)}};function fn(o){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(o)})}function ks(o){var n;let[e,t]=o.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Ts(o){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=o})}async function Ti(o){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",o);let i=await fetch(o);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,o),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await fn(n),s=await Ts(a),r=ks(a);return console.log("[ImageUtils] Success resolution:",s==null?void 0:s.width,"x",s==null?void 0:s.height,"mime:",r.mimeType),{base64:r.base64,mimeType:r.mimeType,dataUrl:a,width:(e=s==null?void 0:s.width)!=null?e:0,height:(t=s==null?void 0:s.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Ve(o){var e,t;try{let i=await fn(o),n=await Ts(i),a=ks(i);return{base64:a.base64,mimeType:a.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function bn(o){return fn(o).then(e=>e).catch(()=>null)}function yn(o,e){var t;try{let[i,n]=o.split(","),a=i.match(/data:(.*?);base64/),s=(t=a==null?void 0:a[1])!=null?t:"image/png",r=atob(n),l=new Uint8Array(r.length);for(let c=0;c<r.length;c++)l[c]=r.charCodeAt(c);return new File([l],e,{type:s})}catch{return null}}async function pt(o,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((u,p)=>{let g=new Image;g.onload=()=>u(g),g.onerror=()=>p(new Error("Failed to load image")),g.src=o}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),o;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),s=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(u=>({r:s[u.offset],g:s[u.offset+1],b:s[u.offset+2]})),c=0;for(let u=0;u<s.length;u+=4){let p=s[u],g=s[u+1],h=s[u+2],m=!1;for(let f of l)if(Math.sqrt(Math.pow(p-f.r,2)+Math.pow(g-f.g,2)+Math.pow(h-f.b,2))<e){m=!0;break}m&&(s[u+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),o}}function vn(o,e){if(!o||!e)return"1:1";let t=o/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function De(o){return typeof o=="object"&&o!==null&&!Array.isArray(o)}function le(o){return typeof o=="string"?o:void 0}function Ps(o){return o.toLowerCase().endsWith(".png")?o.slice(0,-4):o}function mo(o){var i,n,a;let e=(i=le(o.id))!=null?i:le(o.name);if(e)return e;let t=(n=le(o.file))!=null?n:le(o.asset);return t?Ps((a=t.split("/").pop())!=null?a:t):void 0}function fo(o,e,t){var i,n,a;if(typeof e=="string")return{id:o,file:e,role:t};if(De(e)){let s=(i=le(e.file))!=null?i:le(e.asset);return s?{id:(n=le(e.id))!=null?n:o,file:s,role:(a=le(e.role))!=null?a:t,dataUrl:le(e.dataUrl),layout:e.layout}:null}return null}function wn(o,e){var t,i,n;if(!o)return[];if(Array.isArray(o)){let a=[];for(let s of o){if(typeof s=="string"){let r=Ps((t=s.split("/").pop())!=null?t:s);a.push({id:r,file:s,role:e});continue}if(De(s)){let r=mo(s),l=(i=le(s.file))!=null?i:le(s.asset);if(!r||!l)continue;a.push({id:r,file:l,role:(n=le(s.role))!=null?n:e,dataUrl:le(s.dataUrl),layout:s.layout})}}return a}if(De(o)){let a=[];for(let[s,r]of Object.entries(o)){let l=fo(s,r,e);l&&a.push(l)}return a}return[]}function bo(o){var e,t;return(t=(e=le(o.brand_name))!=null?e:le(o.brandName))!=null?t:le(o.name)}function yo(o){if(De(o.brand_dna)&&De(o.brand_dna.colors))return o.brand_dna;if(De(o.colors)){let e={colors:o.colors};return typeof o.style=="string"&&(e.style=o.style),De(o.fonts)&&(e.fonts=o.fonts),e}}function vo(o){var t;let e=new Map;for(let i of o){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Is(o,e={}){var s,r,l;let t=o.filter(De),i=(r=(s=t.map(bo).find(Boolean))!=null?s:e.defaultBrandName)!=null?r:"Imported Brand",n=(l=t.map(yo).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...wn(c.layers,"visual element")),"assets"in c&&a.push(...wn(c.assets,"visual element")),De(c.endgame)&&"assets"in c.endgame&&a.push(...wn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:vo(a)}}import{GoogleGenAI as wo}from"@google/genai";async function Pi(o,e,t=[],i={}){var n,a,s,r,l,c,d;try{if(!(o!=null&&o.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let y=t[b];if(!y.base64||!y.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(y.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!y.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${y.mimeType}`)}let u=new wo({apiKey:o}),p="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await u.models.generateContent({model:p,contents:g}),m="",f=(s=(a=(n=h.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:s.parts;if(f)for(let b of f)b.text&&(m+=b.text);if(!m.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${m.length}`),m}catch(u){throw console.error("[Gemini] API error:",u),(r=u.message)!=null&&r.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=u.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=u.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=u.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):u}}import{GoogleGenAI as xo}from"@google/genai";async function ut(o,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new xo({apiKey:o}),a=[{text:e}];t.length>0&&t.forEach((r,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:r.mimeType,data:r.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let s=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!s.candidates||!s.candidates[0]||!s.candidates[0].content||!s.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let r of s.candidates[0].content.parts)if(r.text)console.log(r.text);else if(r.inlineData){let l=r.inlineData.data,c=r.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function Ms(o){let e=o.brandAssets.map(a=>{let s=`- ${a.id}: ${a.role}`;return a.layout&&(s+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),s}).join(`
1214
+ `)}};function yn(o){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(o)})}function Ts(o){var n;let[e,t]=o.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Ps(o){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=o})}async function Pi(o){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",o);let i=await fetch(o);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,o),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await yn(n),s=await Ps(a),r=Ts(a);return console.log("[ImageUtils] Success resolution:",s==null?void 0:s.width,"x",s==null?void 0:s.height,"mime:",r.mimeType),{base64:r.base64,mimeType:r.mimeType,dataUrl:a,width:(e=s==null?void 0:s.width)!=null?e:0,height:(t=s==null?void 0:s.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Ye(o){var e,t;try{let i=await yn(o),n=await Ps(i),a=Ts(i);return{base64:a.base64,mimeType:a.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function vn(o){return yn(o).then(e=>e).catch(()=>null)}function wn(o,e){var t;try{let[i,n]=o.split(","),a=i.match(/data:(.*?);base64/),s=(t=a==null?void 0:a[1])!=null?t:"image/png",r=atob(n),l=new Uint8Array(r.length);for(let c=0;c<r.length;c++)l[c]=r.charCodeAt(c);return new File([l],e,{type:s})}catch{return null}}async function ut(o,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((p,u)=>{let g=new Image;g.onload=()=>p(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=o}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),o;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),s=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(p=>({r:s[p.offset],g:s[p.offset+1],b:s[p.offset+2]})),c=0;for(let p=0;p<s.length;p+=4){let u=s[p],g=s[p+1],h=s[p+2],m=!1;for(let f of l)if(Math.sqrt(Math.pow(u-f.r,2)+Math.pow(g-f.g,2)+Math.pow(h-f.b,2))<e){m=!0;break}m&&(s[p+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),o}}function xn(o,e){if(!o||!e)return"1:1";let t=o/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function He(o){return typeof o=="object"&&o!==null&&!Array.isArray(o)}function pe(o){return typeof o=="string"?o:void 0}function Is(o){return o.toLowerCase().endsWith(".png")?o.slice(0,-4):o}function fo(o){var i,n,a;let e=(i=pe(o.id))!=null?i:pe(o.name);if(e)return e;let t=(n=pe(o.file))!=null?n:pe(o.asset);return t?Is((a=t.split("/").pop())!=null?a:t):void 0}function bo(o,e,t){var i,n,a;if(typeof e=="string")return{id:o,file:e,role:t};if(He(e)){let s=(i=pe(e.file))!=null?i:pe(e.asset);return s?{id:(n=pe(e.id))!=null?n:o,file:s,role:(a=pe(e.role))!=null?a:t,dataUrl:pe(e.dataUrl),layout:e.layout}:null}return null}function Sn(o,e){var t,i,n;if(!o)return[];if(Array.isArray(o)){let a=[];for(let s of o){if(typeof s=="string"){let r=Is((t=s.split("/").pop())!=null?t:s);a.push({id:r,file:s,role:e});continue}if(He(s)){let r=fo(s),l=(i=pe(s.file))!=null?i:pe(s.asset);if(!r||!l)continue;a.push({id:r,file:l,role:(n=pe(s.role))!=null?n:e,dataUrl:pe(s.dataUrl),layout:s.layout})}}return a}if(He(o)){let a=[];for(let[s,r]of Object.entries(o)){let l=bo(s,r,e);l&&a.push(l)}return a}return[]}function yo(o){var e,t;return(t=(e=pe(o.brand_name))!=null?e:pe(o.brandName))!=null?t:pe(o.name)}function vo(o){if(He(o.brand_dna)&&He(o.brand_dna.colors))return o.brand_dna;if(He(o.colors)){let e={colors:o.colors};return typeof o.style=="string"&&(e.style=o.style),He(o.fonts)&&(e.fonts=o.fonts),e}}function wo(o){var t;let e=new Map;for(let i of o){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Ms(o,e={}){var s,r,l;let t=o.filter(He),i=(r=(s=t.map(yo).find(Boolean))!=null?s:e.defaultBrandName)!=null?r:"Imported Brand",n=(l=t.map(vo).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...Sn(c.layers,"visual element")),"assets"in c&&a.push(...Sn(c.assets,"visual element")),He(c.endgame)&&"assets"in c.endgame&&a.push(...Sn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:wo(a)}}import{GoogleGenAI as xo}from"@google/genai";async function Ii(o,e,t=[],i={}){var n,a,s,r,l,c,d;try{if(!(o!=null&&o.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let y=t[b];if(!y.base64||!y.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(y.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!y.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${y.mimeType}`)}let p=new xo({apiKey:o}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await p.models.generateContent({model:u,contents:g}),m="",f=(s=(a=(n=h.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:s.parts;if(f)for(let b of f)b.text&&(m+=b.text);if(!m.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${m.length}`),m}catch(p){throw console.error("[Gemini] API error:",p),(r=p.message)!=null&&r.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=p.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=p.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=p.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):p}}import{GoogleGenAI as So}from"@google/genai";async function gt(o,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new So({apiKey:o}),a=[{text:e}];t.length>0&&t.forEach((r,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:r.mimeType,data:r.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let s=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!s.candidates||!s.candidates[0]||!s.candidates[0].content||!s.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let r of s.candidates[0].content.parts)if(r.text)console.log(r.text);else if(r.inlineData){let l=r.inlineData.data,c=r.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function js(o){let e=o.brandAssets.map(a=>{let s=`- ${a.id}: ${a.role}`;return a.layout&&(s+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),s}).join(`
1215
1215
  `)||"None",t=o.brandDna?`Colors: ${JSON.stringify(o.brandDna.colors)}, Style: ${o.brandDna.style||"not specified"}`:"Not provided",i=o.gameObjects.map(a=>typeof a=="string"?`- id: ${a}`:`- id: ${a.id}${a.category?`, category: ${a.category}`:""}${a.type?`, type: ${a.type}`:""}`).join(`
1216
1216
  `),n="";if(o.brandConfig){let a=o.brandConfig,s=[];a.splash&&s.push(`SPLASH: title="${a.splash.title||""}", subtitle="${a.splash.subtitle||""}", button="${a.splash.button_label||""}"`),a.endgame&&s.push(`ENDGAME: title="${a.endgame.title||""}", subtitle="${a.endgame.subtitle||""}", cta="${a.endgame.cta_label||""}"`),a.tutorial&&s.push(`TUTORIAL: text="${a.tutorial.label_text||""}", helper="${a.tutorial.helper_text||""}"`),s.length>0&&(n=`
1217
1217
  BRAND CONTENT:
@@ -1275,7 +1275,7 @@ OUTPUT ONLY VALID JSON (no markdown, no explanation):
1275
1275
  }
1276
1276
  ]
1277
1277
  }
1278
- `.trim()}function js(o){var n,a;let e=(n=o.brandDna)!=null&&n.colors?`Primary: ${o.brandDna.colors.primary}, Secondary: ${o.brandDna.colors.secondary||"N/A"}, Accent: ${o.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((a=o.brandDna)==null?void 0:a.style)||"modern gaming style",i=o.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
1278
+ `.trim()}function _s(o){var n,a;let e=(n=o.brandDna)!=null&&n.colors?`Primary: ${o.brandDna.colors.primary}, Secondary: ${o.brandDna.colors.secondary||"N/A"}, Accent: ${o.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((a=o.brandDna)==null?void 0:a.style)||"modern gaming style",i=o.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
1279
1279
  TASK: ${o.prompt}
1280
1280
 
1281
1281
  BRAND STYLE:
@@ -1296,7 +1296,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
1296
1296
 
1297
1297
  OUTPUT:
1298
1298
  Generate the requested asset matching the brand style.${o.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
1299
- `.trim()}function _s(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 Rs(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 Os(o){var s,r;let e=_s(o.gameObjects),t={gamePrompt:o.gamePrompt,gameObjects:e,brandAssets:o.manifest.assets,brandDna:o.manifest.brand_dna,brandName:o.manifest.brand_name},i=Ms(t),n=[];if(o.flatDesignDataUrl)try{let l=zs(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 Pi(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 So(a,o.gameObjects)}function So(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 xn(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 Eo(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 Eo(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 Ve(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(o.flatDesignDataUrl){let r=zs(o.flatDesignDataUrl);r&&t.push(r)}let i=Rs(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:o.manifest.brand_dna,needsTransparency:i},a=js(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await ut(o.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await pt(s)||s}function zs(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 $s(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 Ve(a);s&&(n.dataUrl=s.dataUrl)}}}function Ds(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 u=typeof s.rotation=="number"?s.rotation:0;e.set(a,{position:r,scale:d,rotation:u}),console.log(`[CanvaZip] Parsed position for ${a}:`,{position:r,scale:d,rotation:u})}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,u=(i=s.scaleY)!=null?i:1;l=(d+u)/2}typeof s.rotation=="number"&&(c=s.rotation),e.set(n,{position:r,scale:l,rotation:c})}}return e}function Hs(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 Ns(){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 Bs(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(p=>{let g=e.replace(/s$/,"");return p.startsWith(g)||p.includes(g)});for(let p of d)Ce[p]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+p),(i=c[p])!=null&&i.texture&&(c[p].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+p+".texture"));let u=window.gameObjectManager;if(u)for(let p of d){let g=u.get(p);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:",p))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function Gs(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 u=await _t.load(d);if(!u){console.error("[LIBRARY] Failed to load default texture:",d);return}let p=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(p||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)Ce[f]=u,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=p[f])!=null&&i.texture&&(p[f].texture=u,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=u,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function Ii(o,e,t,i){var n,a,s,r,l,c,d,u,p,g,h,m,f,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let w=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",w);let v=qs(w),k=Date.now(),M=`/raw/library/${i}/${t}?t=${k}`;console.log("[LIBRARY] Loading texture from:",M);try{let x=await fetch(M,{method:"HEAD"});if(x.ok){let S=x.headers.get("content-type");console.log("[LIBRARY] File accessible, Content-Type:",S)}else{console.error("[LIBRARY] \u274C File not accessible:",M,"Status:",x.status);let S=await fetch(M),C=S.headers.get("content-type");if(console.error("[LIBRARY] Content-Type:",C,"Status:",S.status),!S.ok)throw new Error(`File not accessible: ${S.status} ${S.statusText}`)}}catch(x){console.error("[LIBRARY] \u274C Failed to verify file accessibility:",x)}let _;try{if(_=await _t.load(M),!_){console.error("[LIBRARY] \u274C Assets.load returned null/undefined for:",M);return}console.log("[LIBRARY] \u2705 Texture loaded successfully"),console.log("[LIBRARY] Texture dimensions:",_.width,"x",_.height)}catch(x){console.error("[LIBRARY] \u274C Assets.load failed for:",M),console.error("[LIBRARY] Error details:",x),console.error("[LIBRARY] Error message:",x instanceof Error?x.message:String(x)),console.error("[LIBRARY] Error stack:",x instanceof Error?x.stack:"No stack");try{let C=await(await fetch(M)).blob();console.log("[LIBRARY] Direct fetch successful, blob size:",C.size,"bytes, type:",C.type);let R=new Image,I=URL.createObjectURL(C);await new Promise((O,z)=>{R.onload=()=>{console.log("[LIBRARY] \u2705 Image decoded successfully via Image API, dimensions:",R.width,"x",R.height),URL.revokeObjectURL(I),O(null)},R.onerror=$=>{console.error("[LIBRARY] \u274C Image API also failed to decode:",$),URL.revokeObjectURL(I),z($)},R.src=I}),console.log("[LIBRARY] \u26A0\uFE0F Image is valid via Image API but PixiJS Assets.load failed. This might be a PixiJS-specific issue.")}catch(S){console.error("[LIBRARY] \u274C Image verification also failed:",S)}throw x}Ce[w]=_,console.log("[LIBRARY] \u2705 Updated AssetTextures."+w);let T=window.CustomAssets;T!=null&&T[w]&&(T[w].texture=_,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+w));let j=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!j),j){let x=Array.from(((n=j.keys)==null?void 0:n.call(j))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",x);let S=j.get(w);if(console.log("[LIBRARY] gameObject for "+w+"?",!!S),S){let C=((a=S.getDisplayObject)==null?void 0:a.call(S))||S.pixiObject||S.pixi||S,R=(s=C==null?void 0:C.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",C),console.log("[LIBRARY] displayObject type:",R),console.log("[LIBRARY] has texture?",!!(C!=null&&C.texture)),C!=null&&C.texture)C.texture=_,console.log("[LIBRARY] \u2705 Applied to display object:",w);else if(R==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:I}=await import("pixi.js"),O=C.parent,z=(l=(r=O==null?void 0:O.getChildIndex)==null?void 0:r.call(O,C))!=null?l:0,$={x:C.x,y:C.y},q={x:(d=(c=C.anchor)==null?void 0:c.x)!=null?d:.5,y:(p=(u=C.anchor)==null?void 0:u.y)!=null?p:.5},B={x:(h=(g=C.scale)==null?void 0:g.x)!=null?h:1,y:(f=(m=C.scale)==null?void 0:m.y)!=null?f:1},F=(b=C.alpha)!=null?b:1,D=(y=C.visible)!=null?y:!0,G=new I(_);G.anchor.set(q.x,q.y),G.position.set($.x,$.y),G.scale.set(B.x,B.y),G.alpha=F,G.visible=D,O&&(O.removeChild(C),O.addChildAt(G,z),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),S.pixiObject&&(S.pixiObject=G),S.pixi&&(S.pixi=G),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(C!=null&&C.children){let I=C.children.find(O=>O.texture);I?(I.texture=_,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let P=`raw/library/${i}/${t}`;Vs(w,P,_,v),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:w,texture:_,assetPath:P}})),console.log("[LIBRARY] \u{1F4DD} Applying config override:",{objectId:w,path:"render.asset.path",value:P,persist:!0,emitEvent:!0});let L=Co(v);console.log("[LIBRARY] Objects using the same asset path:",{previousPath:v,count:L.length,objectIds:L}),Re({objectId:w,path:"render.asset.path",value:P},{persist:!0,emitEvent:!0});for(let x of L)x!==w&&(console.log(`[LIBRARY] \u{1F504} Also applying override to shared object: ${x}`),Re({objectId:x,path:"render.asset.path",value:P},{persist:!0,emitEvent:!0}));let E=window.__configOverrides||[],A=E.find(x=>x.objectId===w&&x.path==="render.asset.path");A?console.log("[LIBRARY] \u2705 Override confirmed in localStorage:",{objectId:A.objectId,path:A.path,value:A.value,totalOverrides:E.length,sharedObjectsUpdated:L.length-1}):console.error("[LIBRARY] \u274C Override NOT found in localStorage after save!"),console.log("[LIBRARY] \u2705 Staged config override for:",w,"path:",P)}catch(w){console.error("[LIBRARY] Error applying slot asset:",w)}}async function Us(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=qs(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}Ce[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 u=window.gameObjectManager;if(u){let p=u.get(a);if(p){let g=((n=p.getDisplayObject)==null?void 0:n.call(p))||p.pixiObject||p;g!=null&&g.texture&&(g.texture=c,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Vs(a,t,c,s),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:a,texture:c,assetPath:t}})),Re({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 qs(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 Co(o){var t,i;if(!o)return[];let e=[];try{let n=window.getEditableObjectList,a=typeof n=="function"?n():[];if(!Array.isArray(a)||a.length===0){let r=window.__editableConfig;r!=null&&r.objects&&(r.objects instanceof Map?a.push(...Array.from(r.objects.keys())):typeof r.objects=="object"&&a.push(...Object.keys(r.objects)))}let s=window.getEditableObjectConfig;for(let r of a)try{let l=typeof s=="function"?s(r):null,c=(i=(t=l==null?void 0:l.render)==null?void 0:t.asset)==null?void 0:i.path,d=o.replace(/^\/+/,"").replace(/\\/g,"/");(c==null?void 0:c.replace(/^\/+/,"").replace(/\\/g,"/"))===d&&e.push(r)}catch(l){console.warn(`[LIBRARY] Failed to check asset path for object ${r}:`,l)}console.log(`[LIBRARY] Found ${e.length} objects using asset path: ${o}`,e)}catch(n){console.error("[LIBRARY] Error finding objects using asset path:",n)}return e}function Vs(o,e,t,i){if(e){try{let n=`${o}:${e}`;Kt.set(n,t)}catch{}if(i&&i!==e)try{let n=Kt.store;n!=null&&n.delete&&n.delete(`${o}:${i}`)}catch{}Fs(e,t),i&&i!==e&&Fs(i,null)}}function Fs(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 Mi=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`
1299
+ `.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`
1300
1300
  <div class="canva-wizard-overlay" data-canva-wizard>
1301
1301
  <div class="canva-wizard-modal">
1302
1302
  <div class="canva-wizard-header">
@@ -1402,8 +1402,8 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1402
1402
  ${this.replaceableObjects.map(i=>`<option value="${i.id}" ${e.targetObjectId===i.id?"selected":""}>${i.name}</option>`).join("")}
1403
1403
  </select>
1404
1404
  </div>
1405
- `}initialize(e,t,i,n){this.options=n,this.positionMap=Ds(i),this.replaceableObjects=Ns(),this.assets=t.map(a=>{let s=Hs(a.filename,this.positionMap);return{filename:a.filename,dataUrl:a.dataUrl,category:this.inferCategory(a.filename),position:s==null?void 0:s.position,scale:s==null?void 0:s.scale,rotation:s==null?void 0:s.rotation,action:void 0,targetObjectId:void 0}}),e.innerHTML=this.render(),this.root=e.querySelector("[data-canva-wizard]"),this.attachEventListeners()}attachEventListeners(){var e,t,i;this.root&&((e=this.root.querySelector("[data-canva-wizard-close]"))==null||e.addEventListener("click",()=>{this.close()}),(t=this.root.querySelector("[data-canva-wizard-cancel]"))==null||t.addEventListener("click",()=>{this.close()}),(i=this.root.querySelector("[data-canva-wizard-apply-all]"))==null||i.addEventListener("click",()=>{this.applyAll()}),this.root.querySelectorAll("[data-asset-action]").forEach(n=>{n.addEventListener("click",a=>{let s=a.target,r=parseInt(s.getAttribute("data-asset-action")||"0"),l=s.getAttribute("data-action");this.handleAction(r,l)})}),this.root.querySelectorAll("[data-asset-category]").forEach(n=>{n.addEventListener("change",a=>{let s=a.target,r=parseInt(s.getAttribute("data-asset-category")||"0"),l=s.value;this.assets[r]&&(this.assets[r].category=l)})}),this.root.querySelectorAll("[data-asset-target]").forEach(n=>{n.addEventListener("change",a=>{let s=a.target,r=parseInt(s.getAttribute("data-asset-target")||"0"),l=s.value;this.assets[r]&&(this.assets[r].targetObjectId=l)})}),this.root.querySelectorAll("[data-asset-screen]").forEach(n=>{n.addEventListener("change",a=>{let s=a.target,r=parseInt(s.getAttribute("data-asset-screen")||"0"),l=s.value;this.assets[r]&&(this.assets[r].screen=l)})}),this.root.querySelectorAll("[data-asset-type]").forEach(n=>{n.addEventListener("change",a=>{let s=a.target,r=parseInt(s.getAttribute("data-asset-type")||"0"),l=s.value;this.assets[r]&&(this.assets[r].objectType=l)})}),this.root.addEventListener("click",n=>{n.target===this.root&&this.close()}))}handleAction(e,t){this.assets[e]&&(this.assets[e].action=t,t==="add"&&(this.assets[e].screen||(this.assets[e].screen="gameplay"),this.assets[e].objectType||(this.assets[e].objectType="sprite")),t==="replace"?this.updateAssetCard(e):(this.assets[e].targetObjectId=void 0,this.updateAssetCard(e)))}updateAssetCard(e){var i,n,a,s;if(!this.root)return;let t=this.root.querySelector(`[data-asset-index="${e}"]`);if(t&&this.assets[e]){let r=this.assets[e],l=this.renderAssetCard(r,e);t.outerHTML=l;let c=this.root.querySelector(`[data-asset-index="${e}"]`);c&&(c.querySelectorAll("[data-asset-action]").forEach(d=>{d.addEventListener("click",u=>{let p=u.target,g=parseInt(p.getAttribute("data-asset-action")||"0"),h=p.getAttribute("data-action");this.handleAction(g,h)})}),(i=c.querySelector("[data-asset-category]"))==null||i.addEventListener("change",d=>{let p=d.target.value;this.assets[e]&&(this.assets[e].category=p)}),(n=c.querySelector("[data-asset-target]"))==null||n.addEventListener("change",d=>{let p=d.target.value;this.assets[e]&&(this.assets[e].targetObjectId=p)}),(a=c.querySelector("[data-asset-screen]"))==null||a.addEventListener("change",d=>{let p=d.target.value;this.assets[e]&&(this.assets[e].screen=p)}),(s=c.querySelector("[data-asset-type]"))==null||s.addEventListener("change",d=>{let p=d.target.value;this.assets[e]&&(this.assets[e].objectType=p)}))}}async applyAll(){if(!this.options)return;for(let i of this.assets)i.action||(i.action="skip");this.processedCount=0,this.updateProgress();let e=[],t=[];for(let i=0;i<this.assets.length;i++){let n=this.assets[i];try{let a=await this.saveAssetToLibrary(n);n.libraryPath=a,n.action==="add"?e.push(n):n.action==="replace"&&n.targetObjectId&&t.push({asset:n,targetId:n.targetObjectId}),this.processedCount++,this.updateProgress()}catch(a){console.error(`[CanvaZip] Failed to save ${n.filename} to library:`,a)}}if(e.length>0)try{await this.batchAddToScene(e)}catch(i){console.error("[CanvaZip] Batch add to scene failed:",i)}if(t.length>0)for(let{asset:i,targetId:n}of t)try{await this.replaceObject(i,n)}catch(a){console.error(`[CanvaZip] Replace failed for ${n}:`,a)}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),this.options.onComplete&&this.options.onComplete(this.assets),this.close()}async batchAddToScene(e){var a;let t=e.map(s=>{let r=s.filename.replace(/\.(png|jpg|jpeg)$/i,"").replace(/[^a-zA-Z0-9._-]/g,"_").toLowerCase(),l=`json.${r}`,c={identity:{id:l,category:s.category||"environment"},transform:{position:s.position||{x:0,y:0},offset:{x:0,y:0},scale:.3,rotation:s.rotation||0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0,asset:{type:"image",path:s.libraryPath}},instance_id:r,object_config:l};return{screenId:s.screen,instanceId:r,objectConfigId:l,layer:s.objectType==="ui-image"?"ui":"world",config:c}}),i=await fetch("/api/objects/batch-create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objects:t})}),n=await i.json().catch(()=>({}));if(!i.ok||(n==null?void 0:n.success)===!1){let s=((a=n==null?void 0:n.errors)==null?void 0:a.join(`
1406
- `))||(n==null?void 0:n.error)||"Batch create failed.";throw new Error(s)}try{let{trackObjectCreation:s}=await import("./ConfigOverride-2HOZGV6G.js");for(let r of t)s(r.instanceId,r.screenId,r.config)}catch(s){console.warn("[CanvaZip] Failed to track batch creation in history:",s)}console.log(`[CanvaZip] \u2705 Batch added ${e.length} objects to scene`)}async saveAssetToLibrary(e){try{let i=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:e.category,filename:e.filename,data:e.dataUrl,overwrite:!0})})).json();if(i.success&&i.path)return console.log(`[CanvaZip] \u2705 Saved ${e.filename} to library: ${i.path}`),i.path;throw new Error(i.error||"Failed to save to library")}catch(t){throw console.error(`[CanvaZip] Failed to save ${e.filename} to library:`,t),t}}async syncScreens(){try{let e=window.__HANDLER_ACTIVE_SCREEN,t=await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})});if(!t.ok){let i=await t.json().catch(()=>({}));throw new Error((i==null?void 0:i.error)||"Failed to sync screens")}}catch(e){console.warn("[CanvaZip] Screen sync failed:",e)}}async replaceObject(e,t){let i=window.__debugContext;if(!i){console.warn("[CanvaZip] No debug context available for replace");return}try{await Ii(i,t,e.filename,e.category),console.log(`[CanvaZip] \u2705 Replaced ${t} with ${e.filename}`)}catch(n){throw console.error(`[CanvaZip] Failed to replace ${t}:`,n),n}}updateProgress(){if(!this.root)return;let e=this.root.querySelector(".canva-wizard-progress-fill"),t=this.root.querySelector(".canva-wizard-progress-text");if(e){let i=this.processedCount/this.assets.length*100;e.style.width=`${i}%`}t&&(t.textContent=`${this.processedCount} of ${this.assets.length} assets processed`)}inferCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"environment"}close(){var e;(e=this.options)!=null&&e.onCancel&&this.options.onCancel(),this.root&&this.root.remove()}};var ji=class{constructor(){this.root=null;this.currentTab="upload";this.uploadMethod="individual";this.uploadedJsons=new Map;this.normalizedManifest=null;this.flatDesignDataUrl=null;this.assetFiles=new Map;this.zipFile=null;this.wizardProcessedAssets=new Set;this.mappingResult=null;this.analysisRawResponse=null;this.analysisParsedOk=null;this.analysisParseError=null;this.isAnalyzing=!1;this.isGenerating=!1}get manifest(){return this.normalizedManifest}render(){return`
1405
+ `}initialize(e,t,i,n){this.options=n,this.positionMap=Hs(i),this.replaceableObjects=Fs(),this.assets=t.map(a=>{let s=Ns(a.filename,this.positionMap);return{filename:a.filename,dataUrl:a.dataUrl,category:this.inferCategory(a.filename),position:s==null?void 0:s.position,scale:s==null?void 0:s.scale,rotation:s==null?void 0:s.rotation,action:void 0,targetObjectId:void 0}}),e.innerHTML=this.render(),this.root=e.querySelector("[data-canva-wizard]"),this.attachEventListeners()}attachEventListeners(){var e,t,i;this.root&&((e=this.root.querySelector("[data-canva-wizard-close]"))==null||e.addEventListener("click",()=>{this.close()}),(t=this.root.querySelector("[data-canva-wizard-cancel]"))==null||t.addEventListener("click",()=>{this.close()}),(i=this.root.querySelector("[data-canva-wizard-apply-all]"))==null||i.addEventListener("click",()=>{this.applyAll()}),this.root.querySelectorAll("[data-asset-action]").forEach(n=>{n.addEventListener("click",a=>{let s=a.target,r=parseInt(s.getAttribute("data-asset-action")||"0"),l=s.getAttribute("data-action");this.handleAction(r,l)})}),this.root.querySelectorAll("[data-asset-category]").forEach(n=>{n.addEventListener("change",a=>{let s=a.target,r=parseInt(s.getAttribute("data-asset-category")||"0"),l=s.value;this.assets[r]&&(this.assets[r].category=l)})}),this.root.querySelectorAll("[data-asset-target]").forEach(n=>{n.addEventListener("change",a=>{let s=a.target,r=parseInt(s.getAttribute("data-asset-target")||"0"),l=s.value;this.assets[r]&&(this.assets[r].targetObjectId=l)})}),this.root.querySelectorAll("[data-asset-screen]").forEach(n=>{n.addEventListener("change",a=>{let s=a.target,r=parseInt(s.getAttribute("data-asset-screen")||"0"),l=s.value;this.assets[r]&&(this.assets[r].screen=l)})}),this.root.querySelectorAll("[data-asset-type]").forEach(n=>{n.addEventListener("change",a=>{let s=a.target,r=parseInt(s.getAttribute("data-asset-type")||"0"),l=s.value;this.assets[r]&&(this.assets[r].objectType=l)})}),this.root.addEventListener("click",n=>{n.target===this.root&&this.close()}))}handleAction(e,t){this.assets[e]&&(this.assets[e].action=t,t==="add"&&(this.assets[e].screen||(this.assets[e].screen="gameplay"),this.assets[e].objectType||(this.assets[e].objectType="sprite")),t==="replace"?this.updateAssetCard(e):(this.assets[e].targetObjectId=void 0,this.updateAssetCard(e)))}updateAssetCard(e){var i,n,a,s;if(!this.root)return;let t=this.root.querySelector(`[data-asset-index="${e}"]`);if(t&&this.assets[e]){let r=this.assets[e],l=this.renderAssetCard(r,e);t.outerHTML=l;let c=this.root.querySelector(`[data-asset-index="${e}"]`);c&&(c.querySelectorAll("[data-asset-action]").forEach(d=>{d.addEventListener("click",p=>{let u=p.target,g=parseInt(u.getAttribute("data-asset-action")||"0"),h=u.getAttribute("data-action");this.handleAction(g,h)})}),(i=c.querySelector("[data-asset-category]"))==null||i.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].category=u)}),(n=c.querySelector("[data-asset-target]"))==null||n.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].targetObjectId=u)}),(a=c.querySelector("[data-asset-screen]"))==null||a.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].screen=u)}),(s=c.querySelector("[data-asset-type]"))==null||s.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].objectType=u)}))}}async applyAll(){if(!this.options)return;for(let i of this.assets)i.action||(i.action="skip");this.processedCount=0,this.updateProgress();let e=[],t=[];for(let i=0;i<this.assets.length;i++){let n=this.assets[i];try{let a=await this.saveAssetToLibrary(n);n.libraryPath=a,n.action==="add"?e.push(n):n.action==="replace"&&n.targetObjectId&&t.push({asset:n,targetId:n.targetObjectId}),this.processedCount++,this.updateProgress()}catch(a){console.error(`[CanvaZip] Failed to save ${n.filename} to library:`,a)}}if(e.length>0)try{await this.batchAddToScene(e)}catch(i){console.error("[CanvaZip] Batch add to scene failed:",i)}if(t.length>0)for(let{asset:i,targetId:n}of t)try{await this.replaceObject(i,n)}catch(a){console.error(`[CanvaZip] Replace failed for ${n}:`,a)}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),this.options.onComplete&&this.options.onComplete(this.assets),this.close()}async batchAddToScene(e){var a;let t=e.map(s=>{let r=s.filename.replace(/\.(png|jpg|jpeg)$/i,"").replace(/[^a-zA-Z0-9._-]/g,"_").toLowerCase(),l=`json.${r}`,c={identity:{id:l,category:s.category||"environment"},transform:{position:s.position||{x:0,y:0},offset:{x:0,y:0},scale:.3,rotation:s.rotation||0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0,asset:{type:"image",path:s.libraryPath}},instance_id:r,object_config:l};return{screenId:s.screen,instanceId:r,objectConfigId:l,layer:s.objectType==="ui-image"?"ui":"world",config:c}}),i=await fetch("/api/objects/batch-create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objects:t})}),n=await i.json().catch(()=>({}));if(!i.ok||(n==null?void 0:n.success)===!1){let s=((a=n==null?void 0:n.errors)==null?void 0:a.join(`
1406
+ `))||(n==null?void 0:n.error)||"Batch create failed.";throw new Error(s)}try{let{trackObjectCreation:s}=await import("./ConfigOverride-SLXAGR2M.js");for(let r of t)s(r.instanceId,r.screenId,r.config)}catch(s){console.warn("[CanvaZip] Failed to track batch creation in history:",s)}console.log(`[CanvaZip] \u2705 Batch added ${e.length} objects to scene`)}async saveAssetToLibrary(e){try{let i=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:e.category,filename:e.filename,data:e.dataUrl,overwrite:!0})})).json();if(i.success&&i.path)return console.log(`[CanvaZip] \u2705 Saved ${e.filename} to library: ${i.path}`),i.path;throw new Error(i.error||"Failed to save to library")}catch(t){throw console.error(`[CanvaZip] Failed to save ${e.filename} to library:`,t),t}}async syncScreens(){try{let e=window.__HANDLER_ACTIVE_SCREEN,t=await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})});if(!t.ok){let i=await t.json().catch(()=>({}));throw new Error((i==null?void 0:i.error)||"Failed to sync screens")}}catch(e){console.warn("[CanvaZip] Screen sync failed:",e)}}async replaceObject(e,t){let i=window.__debugContext;if(!i){console.warn("[CanvaZip] No debug context available for replace");return}try{await ji(i,t,e.filename,e.category),console.log(`[CanvaZip] \u2705 Replaced ${t} with ${e.filename}`)}catch(n){throw console.error(`[CanvaZip] Failed to replace ${t}:`,n),n}}updateProgress(){if(!this.root)return;let e=this.root.querySelector(".canva-wizard-progress-fill"),t=this.root.querySelector(".canva-wizard-progress-text");if(e){let i=this.processedCount/this.assets.length*100;e.style.width=`${i}%`}t&&(t.textContent=`${this.processedCount} of ${this.assets.length} assets processed`)}inferCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"environment"}close(){var e;(e=this.options)!=null&&e.onCancel&&this.options.onCancel(),this.root&&this.root.remove()}};var Ri=class{constructor(){this.root=null;this.currentTab="upload";this.uploadMethod="individual";this.uploadedJsons=new Map;this.normalizedManifest=null;this.flatDesignDataUrl=null;this.assetFiles=new Map;this.zipFile=null;this.wizardProcessedAssets=new Set;this.mappingResult=null;this.analysisRawResponse=null;this.analysisParsedOk=null;this.analysisParseError=null;this.isAnalyzing=!1;this.isGenerating=!1}get manifest(){return this.normalizedManifest}render(){return`
1407
1407
  <div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
1408
1408
  <div class="scene-panel-header" data-panel-handle>
1409
1409
  <div class="panel-title">
@@ -1533,15 +1533,15 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1533
1533
  </div>
1534
1534
  <div class="panel-resize-handle" data-panel-resize></div>
1535
1535
  </div>
1536
- `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,s,r,l,c,d,u,p,g,h,m;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let f="/dashboard";window.location.pathname!==f&&(window.location.href=f)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(f=>{f.addEventListener("click",()=>{let b=f.dataset.visionTab;this.switchTab(b)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",f=>{let b=f.target.value;this.switchUploadMethod(b)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var f,b;(b=(f=this.root)==null?void 0:f.querySelector("[data-vision-manifest-input]"))==null||b.click()}),(a=this.root.querySelector("[data-vision-upload-batch-png]"))==null||a.addEventListener("click",()=>{var f,b;(b=(f=this.root)==null?void 0:f.querySelector("[data-vision-batch-png-input]"))==null||b.click()}),(s=this.root.querySelector("[data-vision-batch-png-input]"))==null||s.addEventListener("change",f=>{this.handleBatchPNGUpload(f)}),(r=this.root.querySelector("[data-vision-upload-zip]"))==null||r.addEventListener("click",()=>{var f,b;(b=(f=this.root)==null?void 0:f.querySelector("[data-vision-zip-input]"))==null||b.click()}),(l=this.root.querySelector("[data-vision-zip-input]"))==null||l.addEventListener("change",f=>{this.handleZipUpload(f)}),(c=this.root.querySelector("[data-vision-manifest-input]"))==null||c.addEventListener("change",f=>{this.handleManifestUpload(f)}),(d=this.root.querySelector("[data-vision-upload-assets]"))==null||d.addEventListener("click",()=>{var f,b;(b=(f=this.root)==null?void 0:f.querySelector("[data-vision-assets-input]"))==null||b.click()}),(u=this.root.querySelector("[data-vision-assets-input]"))==null||u.addEventListener("change",f=>{this.handleAssetsUpload(f)}),(p=this.root.querySelector("[data-vision-upload-flat]"))==null||p.addEventListener("click",()=>{var f,b;(b=(f=this.root)==null?void 0:f.querySelector("[data-vision-flat-input]"))==null||b.click()}),(g=this.root.querySelector("[data-vision-flat-input]"))==null||g.addEventListener("change",f=>{this.handleFlatDesignUpload(f)}),(h=this.root.querySelector("[data-vision-generate-all]"))==null||h.addEventListener("click",()=>{this.generateAllMissing()}),(m=this.root.querySelector("[data-vision-apply-all]"))==null||m.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",f=>{let b=f.target;if(!b)return;let y=b.closest("[data-mapping-item]"),w=y==null?void 0:y.dataset.mappingItem;w&&(b.closest("[data-mapping-apply-one]")&&this.applyOne(w),b.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(w),b.closest("[data-mapping-edit-one]")&&this.openEditorForOne(w),b.closest("[data-mapping-generate-one]")&&this.generateOne(w),b.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",f=>{let b=f.target;if(!b||!this.mappingResult)return;let y=b.closest("[data-mapping-item]"),w=y==null?void 0:y.dataset.mappingItem;if(!w)return;let v=this.mappingResult.mappings.find(k=>k.game_object===w);v&&(b.matches("[data-mapping-action]")&&(v.action=String(b.value||"KEEP"),v.status="Edited",this.renderMappings()),b.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(b.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",f=>{let b=f.target;if(!b||!this.mappingResult||!b.matches("[data-mapping-prompt]"))return;let y=b.closest("[data-mapping-item]"),w=y==null?void 0:y.dataset.mappingItem;if(!w)return;let v=this.mappingResult.mappings.find(k=>k.game_object===w);v&&(v.generation_prompt=String(b.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleBatchPNGUpload(e){var s;let t=e.target,i=Array.from(t.files||[]);if(i.length===0)return;let n=i.filter(r=>r.type.startsWith("image/"));if(n.length===0){this.setStatus("upload","\u26A0\uFE0F No image files selected");return}let a=(s=this.root)==null?void 0:s.querySelector("[data-vision-batch-png-status]");a&&(a.textContent=`Processing ${n.length} PNG${n.length>1?"s":""}...`);try{let r=window.__HANDLER_ACTIVE_SCREEN,l=r==="loading"||r==="start"||r==="gameplay"||r==="tutorial"||r==="endgame"?r:"gameplay",c=[];for(let g=0;g<n.length;g++){let h=n[g];try{let m=await this.fileToDataUrl(h);if(!m){c.push({success:!1,filename:h.name,error:"Failed to read file"});continue}let f=h.name.replace(/\.[^/.]+$/,""),b=this.inferCategoryFromFilename(f),y=f.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"").toLowerCase(),w=`${y}_${Date.now()}${g>0?`_${g}`:""}`,v=`json.${w}`,k=`${y}.png`,_=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:b,filename:k,data:m,overwrite:!1})})).json();if(!_.success){c.push({success:!1,filename:h.name,error:_.error});continue}let T={identity:{id:v,category:b},transform:{anchor:"center",position:{x:0,y:0},scale:1,rotation:0},render:{z_index:0,alpha:1,visible:!0,anchor:{x:.5,y:.5},asset:{type:"image",path:_.path||`raw/library/${b}/${k}`}}},j=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:l,instanceId:w,objectConfigId:v,config:T,layer:b==="ui"?"ui":"world"})}),P=await j.json();j.ok&&P.success?c.push({success:!0,filename:h.name}):c.push({success:!1,filename:h.name,error:P.error})}catch(m){c.push({success:!1,filename:h.name,error:m instanceof Error?m.message:String(m)})}}let d=c.filter(g=>g.success).length,u=c.length-d;a&&(u===0?a.textContent=`\u2705 Added ${d} PNG${d>1?"s":""} to scene`:a.textContent=`\u26A0\uFE0F Added ${d}, failed ${u}`),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh"));let p=window.refreshAssetLibrary;typeof p=="function"&&p(),t.value=""}catch(r){a&&(a.textContent=`\u274C Error: ${r instanceof Error?r.message:String(r)}`),console.error("[BrandVision] Batch PNG upload failed:",r)}}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)})}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var l;let t=null;if(typeof window!="undefined"&&window.JSZip)t=window.JSZip,console.log("[BrandVision] \u2705 Found window.JSZip");else try{let c=await import("jszip");t=c.default||c,console.log("[BrandVision] \u2705 Loaded JSZip via dynamic import")}catch(c){throw new Error(`JSZip is not properly imported. Make sure jszip is loaded globally (window.JSZip) or available as a module: ${(c==null?void 0:c.message)||"Unknown error"}`)}if(!t||typeof t.loadAsync!="function")throw new Error("JSZip is not properly imported - loadAsync method not found");let i=await t.loadAsync(e),n=[],a=[];i.forEach((c,d)=>{let u=c.toLowerCase();u.endsWith(".json")?n.push({name:c,content:null}):u.startsWith("assets/")&&u.endsWith(".png")&&a.push({name:c,file:d})});for(let c of n)try{let d=await((l=i.file(c.name))==null?void 0:l.async("text"));d&&(c.content=JSON.parse(d))}catch(d){console.warn(`Failed to parse ${c.name}:`,d)}let s=[];for(let c of a)try{let d=await c.file.async("uint8array"),u=new Blob([d],{type:"image/png"}),p=c.name.split("/").pop()||c.name;console.log(`Processing ${p}, uint8array length: ${d.length}, blob size: ${u.size}`);let g;try{g=await this.blobToDataUrl(u)}catch(h){console.warn(`FileReader failed for ${p}, using fallback:`,h),g=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(d)))}`}if(!g.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${p}:`,g.substring(0,100));continue}s.push({filename:p,dataUrl:g})}catch(d){console.warn(`Failed to extract ${c.name}:`,d)}let r=null;for(let c of n){let d=c.name.toLowerCase();if(d.includes("positionnormalizedpack")||d.includes("positionnormalized")){r=c.content,console.log(`[BrandVision] Found position data file: ${c.name}`,{hasContent:!!r,isString:typeof r=="string",isObject:typeof r=="object",hasLayers:r!=null&&r.layers?r.layers.length:0});break}}if(r||console.warn("[BrandVision] No positionnormalizedpack.json found in ZIP. Available JSON files:",n.map(c=>c.name)),s.length>0){await this.showCanvaZipWizard(s,r),this.setStatus("zip",`\u2705 Wizard completed - ${s.length} assets processed`);return}else{this.setStatus("zip","\u26A0\uFE0F No PNG files found in ZIP");return}}async showCanvaZipWizard(e,t){return new Promise(i=>{let n=e.filter(r=>!this.wizardProcessedAssets.has(r.filename));if(n.length===0){console.log("[BrandVision] All assets already processed by wizard"),i();return}let a=document.createElement("div");document.body.appendChild(a),new Mi().initialize(a,n,t,{onComplete:r=>{console.log("[BrandVision] Wizard completed, processed assets:",r),r.forEach(l=>{this.wizardProcessedAssets.add(l.filename)}),a.remove(),i()},onCancel:()=>{console.log("[BrandVision] Wizard cancelled"),a.remove(),i()}})})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let s=a.category||"misc";n[s]||(n[s]=[]),i.libraryAssets[s]||(i.libraryAssets[s]=[]),i.libraryAssets[s].some(l=>l.filename===a.filename)||(i.libraryAssets[s].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${s}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var s;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let r of Array.from(i))try{let l=await r.text(),c=JSON.parse(l);this.uploadedJsons.set(r.name,c),c.layers?n+=`\u2705 Layers: ${r.name}
1536
+ `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,s,r,l,c,d,p,u,g,h,m;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let f="/dashboard";window.location.pathname!==f&&(window.location.href=f)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(f=>{f.addEventListener("click",()=>{let b=f.dataset.visionTab;this.switchTab(b)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",f=>{let b=f.target.value;this.switchUploadMethod(b)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var f,b;(b=(f=this.root)==null?void 0:f.querySelector("[data-vision-manifest-input]"))==null||b.click()}),(a=this.root.querySelector("[data-vision-upload-batch-png]"))==null||a.addEventListener("click",()=>{var f,b;(b=(f=this.root)==null?void 0:f.querySelector("[data-vision-batch-png-input]"))==null||b.click()}),(s=this.root.querySelector("[data-vision-batch-png-input]"))==null||s.addEventListener("change",f=>{this.handleBatchPNGUpload(f)}),(r=this.root.querySelector("[data-vision-upload-zip]"))==null||r.addEventListener("click",()=>{var f,b;(b=(f=this.root)==null?void 0:f.querySelector("[data-vision-zip-input]"))==null||b.click()}),(l=this.root.querySelector("[data-vision-zip-input]"))==null||l.addEventListener("change",f=>{this.handleZipUpload(f)}),(c=this.root.querySelector("[data-vision-manifest-input]"))==null||c.addEventListener("change",f=>{this.handleManifestUpload(f)}),(d=this.root.querySelector("[data-vision-upload-assets]"))==null||d.addEventListener("click",()=>{var f,b;(b=(f=this.root)==null?void 0:f.querySelector("[data-vision-assets-input]"))==null||b.click()}),(p=this.root.querySelector("[data-vision-assets-input]"))==null||p.addEventListener("change",f=>{this.handleAssetsUpload(f)}),(u=this.root.querySelector("[data-vision-upload-flat]"))==null||u.addEventListener("click",()=>{var f,b;(b=(f=this.root)==null?void 0:f.querySelector("[data-vision-flat-input]"))==null||b.click()}),(g=this.root.querySelector("[data-vision-flat-input]"))==null||g.addEventListener("change",f=>{this.handleFlatDesignUpload(f)}),(h=this.root.querySelector("[data-vision-generate-all]"))==null||h.addEventListener("click",()=>{this.generateAllMissing()}),(m=this.root.querySelector("[data-vision-apply-all]"))==null||m.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",f=>{let b=f.target;if(!b)return;let y=b.closest("[data-mapping-item]"),w=y==null?void 0:y.dataset.mappingItem;w&&(b.closest("[data-mapping-apply-one]")&&this.applyOne(w),b.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(w),b.closest("[data-mapping-edit-one]")&&this.openEditorForOne(w),b.closest("[data-mapping-generate-one]")&&this.generateOne(w),b.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",f=>{let b=f.target;if(!b||!this.mappingResult)return;let y=b.closest("[data-mapping-item]"),w=y==null?void 0:y.dataset.mappingItem;if(!w)return;let v=this.mappingResult.mappings.find(T=>T.game_object===w);v&&(b.matches("[data-mapping-action]")&&(v.action=String(b.value||"KEEP"),v.status="Edited",this.renderMappings()),b.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(b.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",f=>{let b=f.target;if(!b||!this.mappingResult||!b.matches("[data-mapping-prompt]"))return;let y=b.closest("[data-mapping-item]"),w=y==null?void 0:y.dataset.mappingItem;if(!w)return;let v=this.mappingResult.mappings.find(T=>T.game_object===w);v&&(v.generation_prompt=String(b.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleBatchPNGUpload(e){var s;let t=e.target,i=Array.from(t.files||[]);if(i.length===0)return;let n=i.filter(r=>r.type.startsWith("image/"));if(n.length===0){this.setStatus("upload","\u26A0\uFE0F No image files selected");return}let a=(s=this.root)==null?void 0:s.querySelector("[data-vision-batch-png-status]");a&&(a.textContent=`Processing ${n.length} PNG${n.length>1?"s":""}...`);try{let r=window.__HANDLER_ACTIVE_SCREEN,l=r==="loading"||r==="start"||r==="gameplay"||r==="tutorial"||r==="endgame"?r:"gameplay",c=[];for(let g=0;g<n.length;g++){let h=n[g];try{let m=await this.fileToDataUrl(h);if(!m){c.push({success:!1,filename:h.name,error:"Failed to read file"});continue}let f=h.name.replace(/\.[^/.]+$/,""),b=this.inferCategoryFromFilename(f),y=f.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"").toLowerCase(),w=`${y}_${Date.now()}${g>0?`_${g}`:""}`,v=`json.${w}`,T=`${y}.png`,_=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:b,filename:T,data:m,overwrite:!1})})).json();if(!_.success){c.push({success:!1,filename:h.name,error:_.error});continue}let I={identity:{id:v,category:b},transform:{anchor:"center",position:{x:0,y:0},scale:1,rotation:0},render:{z_index:0,alpha:1,visible:!0,anchor:{x:.5,y:.5},asset:{type:"image",path:_.path||`raw/library/${b}/${T}`}}},j=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:l,instanceId:w,objectConfigId:v,config:I,layer:b==="ui"?"ui":"world"})}),L=await j.json();j.ok&&L.success?c.push({success:!0,filename:h.name}):c.push({success:!1,filename:h.name,error:L.error})}catch(m){c.push({success:!1,filename:h.name,error:m instanceof Error?m.message:String(m)})}}let d=c.filter(g=>g.success).length,p=c.length-d;a&&(p===0?a.textContent=`\u2705 Added ${d} PNG${d>1?"s":""} to scene`:a.textContent=`\u26A0\uFE0F Added ${d}, failed ${p}`),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh"));let u=window.refreshAssetLibrary;typeof u=="function"&&u(),t.value=""}catch(r){a&&(a.textContent=`\u274C Error: ${r instanceof Error?r.message:String(r)}`),console.error("[BrandVision] Batch PNG upload failed:",r)}}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)})}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var l;let t=null;if(typeof window!="undefined"&&window.JSZip)t=window.JSZip,console.log("[BrandVision] \u2705 Found window.JSZip");else try{let c=await import("jszip");t=c.default||c,console.log("[BrandVision] \u2705 Loaded JSZip via dynamic import")}catch(c){throw new Error(`JSZip is not properly imported. Make sure jszip is loaded globally (window.JSZip) or available as a module: ${(c==null?void 0:c.message)||"Unknown error"}`)}if(!t||typeof t.loadAsync!="function")throw new Error("JSZip is not properly imported - loadAsync method not found");let i=await t.loadAsync(e),n=[],a=[];i.forEach((c,d)=>{let p=c.toLowerCase();p.endsWith(".json")?n.push({name:c,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&a.push({name:c,file:d})});for(let c of n)try{let d=await((l=i.file(c.name))==null?void 0:l.async("text"));d&&(c.content=JSON.parse(d))}catch(d){console.warn(`Failed to parse ${c.name}:`,d)}let s=[];for(let c of a)try{let d=await c.file.async("uint8array"),p=new Blob([d],{type:"image/png"}),u=c.name.split("/").pop()||c.name;console.log(`Processing ${u}, uint8array length: ${d.length}, blob size: ${p.size}`);let g;try{g=await this.blobToDataUrl(p)}catch(h){console.warn(`FileReader failed for ${u}, using fallback:`,h),g=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(d)))}`}if(!g.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${u}:`,g.substring(0,100));continue}s.push({filename:u,dataUrl:g})}catch(d){console.warn(`Failed to extract ${c.name}:`,d)}let r=null;for(let c of n){let d=c.name.toLowerCase();if(d.includes("positionnormalizedpack")||d.includes("positionnormalized")){r=c.content,console.log(`[BrandVision] Found position data file: ${c.name}`,{hasContent:!!r,isString:typeof r=="string",isObject:typeof r=="object",hasLayers:r!=null&&r.layers?r.layers.length:0});break}}if(r||console.warn("[BrandVision] No positionnormalizedpack.json found in ZIP. Available JSON files:",n.map(c=>c.name)),s.length>0){await this.showCanvaZipWizard(s,r),this.setStatus("zip",`\u2705 Wizard completed - ${s.length} assets processed`);return}else{this.setStatus("zip","\u26A0\uFE0F No PNG files found in ZIP");return}}async showCanvaZipWizard(e,t){return new Promise(i=>{let n=e.filter(r=>!this.wizardProcessedAssets.has(r.filename));if(n.length===0){console.log("[BrandVision] All assets already processed by wizard"),i();return}let a=document.createElement("div");document.body.appendChild(a),new _i().initialize(a,n,t,{onComplete:r=>{console.log("[BrandVision] Wizard completed, processed assets:",r),r.forEach(l=>{this.wizardProcessedAssets.add(l.filename)}),a.remove(),i()},onCancel:()=>{console.log("[BrandVision] Wizard cancelled"),a.remove(),i()}})})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let s=a.category||"misc";n[s]||(n[s]=[]),i.libraryAssets[s]||(i.libraryAssets[s]=[]),i.libraryAssets[s].some(l=>l.filename===a.filename)||(i.libraryAssets[s].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${s}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var s;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let r of Array.from(i))try{let l=await r.text(),c=JSON.parse(l);this.uploadedJsons.set(r.name,c),c.layers?n+=`\u2705 Layers: ${r.name}
1537
1537
  `:c.brand_dna||c.colors?n+=`\u2705 Brand: ${r.name}
1538
1538
  `:n+=`\u2705 Loaded: ${r.name}
1539
1539
  `}catch{n+=`\u274C Error in ${r.name}
1540
- `}try{this.normalizedManifest=Is(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let r=Array.isArray((s=this.normalizedManifest)==null?void 0:s.assets)?this.normalizedManifest.assets.length:0;n+=`
1540
+ `}try{this.normalizedManifest=Ms(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let r=Array.isArray((s=this.normalizedManifest)==null?void 0:s.assets)?this.normalizedManifest.assets.length:0;n+=`
1541
1541
  \u{1F4E6} Normalized manifest: ${r} assets`,n+=`
1542
1542
  \u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:r,brandName:this.normalizedManifest.brand_name})}catch(r){console.error("[BrandVision] Failed to normalize manifest:",r),this.normalizedManifest=null,n+=`
1543
1543
  \u274C Failed to normalize manifest`}t.value="";let a=n.trim();this.uploadedJsons.size>0?this.setStatus("manifest",`${a}
1544
- \u2705 JSONs ready - now upload PNGs to open wizard`):this.setStatus("manifest",a)}async handleAssetsUpload(e){console.log("[BrandVision] handleAssetsUpload called",e);let t=e.target,i=t.files;if(console.log("[BrandVision] Files object:",i),!i||i.length===0){console.log("[BrandVision] No files selected");return}console.log(`[BrandVision] handleAssetsUpload: ${i.length} files selected`);for(let r=0;r<i.length;r++)console.log(`[BrandVision] File ${r}: ${i[r].name}, type: ${i[r].type}, size: ${i[r].size}`);let n=[];for(let r of Array.from(i)){if(console.log(`[BrandVision] Processing file: ${r.name}, type: ${r.type}`),!r.type.startsWith("image/")){console.log(`[BrandVision] Skipping non-image file: ${r.name}`),this.assetFiles.set(r.name,r);continue}try{let l=await this.fileToDataUrl(r);l?(n.push({filename:r.name,dataUrl:l}),console.log(`[BrandVision] \u2705 Converted ${r.name} to data URL (length: ${l.length})`)):(console.error(`[BrandVision] Failed to convert ${r.name} to data URL`),this.assetFiles.set(r.name,r))}catch(l){console.error(`[BrandVision] Failed to process ${r.name}:`,l),this.assetFiles.set(r.name,r)}}console.log(`[BrandVision] Extracted ${n.length} image assets`);let a=this.uploadedJsons.size>0,s=n.length>0;if(console.log(`[BrandVision] Individual upload check: JSONs=${a}, Images=${s}`),a&&s){console.log("[BrandVision] Both JSONs and images present - showing wizard"),this.setStatus("assets",`Processing ${n.length} images...`);let r=null;console.log("[BrandVision] Checking uploaded JSONs for position data:",Array.from(this.uploadedJsons.keys()));for(let[l,c]of this.uploadedJsons.entries()){let d=l.toLowerCase();if(console.log(`[BrandVision] Checking JSON: ${l} (lowercase: ${d})`),d.includes("positionnormalizedpack")||d.includes("positionnormalized")){r=c,console.log("[BrandVision] \u2705 Found position data in:",l,{hasContent:!!r,isString:typeof r=="string",isObject:typeof r=="object",hasLayers:r!=null&&r.layers?r.layers.length:0,contentPreview:typeof r=="object"?JSON.stringify(r).substring(0,200):String(r).substring(0,200)});break}}r||console.warn("[BrandVision] \u26A0\uFE0F No position data found. Uploaded JSON files:",Array.from(this.uploadedJsons.keys())),console.log("[BrandVision] Opening wizard with assets:",n.map(l=>l.filename)),await this.showCanvaZipWizard(n,r),console.log("[BrandVision] Wizard completed successfully"),this.setStatus("assets",`\u2705 Wizard completed - ${n.length} assets processed`)}else console.log("[BrandVision] Waiting for both JSONs and images. Current state:",{jsons:this.uploadedJsons.size,images:n.length}),a?this.setStatus("assets",`Uploaded ${n.length} images. JSONs ready - wizard should open now.`):this.setStatus("assets","\u26A0\uFE0F Upload JSONs first, then PNGs to open wizard");t.value=""}async handleFlatDesignUpload(e){var a,s;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await Ve(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",`\u{1F3A8} ${i.name}`);let r=(s=this.root)==null?void 0:s.querySelector("[data-vision-flat-preview]");r&&(r.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,a,s,r,l,c;if(this.isAnalyzing)return;let e=(a=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await $s(t,this.assetFiles);let d={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},u=await Os(d);this.mappingResult=u.mappingResult,this.analysisRawResponse=u.rawResponse,this.analysisParsedOk=u.parsed,this.analysisParseError=(s=u.parseError)!=null?s:null,this.renderMappings(),u.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(r=this.mappingResult)==null?void 0:r.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${u.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(d){console.error("[BrandVision] Analysis failed:",d),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await xn(a,this.mappingResult,{onProgress:(s,r,l)=>{this.setStatus("apply",`Generating ${s}/${r}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(a){console.error("[BrandVision] Generation failed:",a),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var r;let e=(r=this.root)==null?void 0:r.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,a=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),s=n?`
1544
+ \u2705 JSONs ready - now upload PNGs to open wizard`):this.setStatus("manifest",a)}async handleAssetsUpload(e){console.log("[BrandVision] handleAssetsUpload called",e);let t=e.target,i=t.files;if(console.log("[BrandVision] Files object:",i),!i||i.length===0){console.log("[BrandVision] No files selected");return}console.log(`[BrandVision] handleAssetsUpload: ${i.length} files selected`);for(let r=0;r<i.length;r++)console.log(`[BrandVision] File ${r}: ${i[r].name}, type: ${i[r].type}, size: ${i[r].size}`);let n=[];for(let r of Array.from(i)){if(console.log(`[BrandVision] Processing file: ${r.name}, type: ${r.type}`),!r.type.startsWith("image/")){console.log(`[BrandVision] Skipping non-image file: ${r.name}`),this.assetFiles.set(r.name,r);continue}try{let l=await this.fileToDataUrl(r);l?(n.push({filename:r.name,dataUrl:l}),console.log(`[BrandVision] \u2705 Converted ${r.name} to data URL (length: ${l.length})`)):(console.error(`[BrandVision] Failed to convert ${r.name} to data URL`),this.assetFiles.set(r.name,r))}catch(l){console.error(`[BrandVision] Failed to process ${r.name}:`,l),this.assetFiles.set(r.name,r)}}console.log(`[BrandVision] Extracted ${n.length} image assets`);let a=this.uploadedJsons.size>0,s=n.length>0;if(console.log(`[BrandVision] Individual upload check: JSONs=${a}, Images=${s}`),a&&s){console.log("[BrandVision] Both JSONs and images present - showing wizard"),this.setStatus("assets",`Processing ${n.length} images...`);let r=null;console.log("[BrandVision] Checking uploaded JSONs for position data:",Array.from(this.uploadedJsons.keys()));for(let[l,c]of this.uploadedJsons.entries()){let d=l.toLowerCase();if(console.log(`[BrandVision] Checking JSON: ${l} (lowercase: ${d})`),d.includes("positionnormalizedpack")||d.includes("positionnormalized")){r=c,console.log("[BrandVision] \u2705 Found position data in:",l,{hasContent:!!r,isString:typeof r=="string",isObject:typeof r=="object",hasLayers:r!=null&&r.layers?r.layers.length:0,contentPreview:typeof r=="object"?JSON.stringify(r).substring(0,200):String(r).substring(0,200)});break}}r||console.warn("[BrandVision] \u26A0\uFE0F No position data found. Uploaded JSON files:",Array.from(this.uploadedJsons.keys())),console.log("[BrandVision] Opening wizard with assets:",n.map(l=>l.filename)),await this.showCanvaZipWizard(n,r),console.log("[BrandVision] Wizard completed successfully"),this.setStatus("assets",`\u2705 Wizard completed - ${n.length} assets processed`)}else console.log("[BrandVision] Waiting for both JSONs and images. Current state:",{jsons:this.uploadedJsons.size,images:n.length}),a?this.setStatus("assets",`Uploaded ${n.length} images. JSONs ready - wizard should open now.`):this.setStatus("assets","\u26A0\uFE0F Upload JSONs first, then PNGs to open wizard");t.value=""}async handleFlatDesignUpload(e){var a,s;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await Ye(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",`\u{1F3A8} ${i.name}`);let r=(s=this.root)==null?void 0:s.querySelector("[data-vision-flat-preview]");r&&(r.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,a,s,r,l,c;if(this.isAnalyzing)return;let e=(a=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await Ds(t,this.assetFiles);let d={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},p=await zs(d);this.mappingResult=p.mappingResult,this.analysisRawResponse=p.rawResponse,this.analysisParsedOk=p.parsed,this.analysisParseError=(s=p.parseError)!=null?s:null,this.renderMappings(),p.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(r=this.mappingResult)==null?void 0:r.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${p.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(d){console.error("[BrandVision] Analysis failed:",d),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await En(a,this.mappingResult,{onProgress:(s,r,l)=>{this.setStatus("apply",`Generating ${s}/${r}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(a){console.error("[BrandVision] Generation failed:",a),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var r;let e=(r=this.root)==null?void 0:r.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,a=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),s=n?`
1545
1545
  <div class="vision-raw-block">
1546
1546
  <div class="inspector-text-sm" style="white-space: pre-wrap;">
1547
1547
  \u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
@@ -1551,7 +1551,7 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1551
1551
  </div>
1552
1552
  `:"";e.innerHTML=`
1553
1553
  ${s}
1554
- ${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",d=l.brand_asset||"",u=(b=t==null?void 0:t.assets)==null?void 0:b.find(y=>y.id===d),p=(u==null?void 0:u.dataUrl)||"",g=l.output_dataUrl||"",h=l.action==="GENERATE"?g:l.action==="APPLY"?p:"",m=!!h,f=`
1554
+ ${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",d=l.brand_asset||"",p=(b=t==null?void 0:t.assets)==null?void 0:b.find(y=>y.id===d),u=(p==null?void 0:p.dataUrl)||"",g=l.output_dataUrl||"",h=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",m=!!h,f=`
1555
1555
  <select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
1556
1556
  <option value="">Select brand asset\u2026</option>
1557
1557
  ${a.replace(`value="${d}"`,`value="${d}" selected`)}
@@ -1603,8 +1603,8 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1603
1603
  </div>
1604
1604
  </div>
1605
1605
  `}).join("")}
1606
- `}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let s=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;s&&(await this.stageEngineAssetOverride(n,s),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(s=>s.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(s=>s.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,s;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(r=>r.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(s=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:s.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let r={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await xn(r,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(r){console.error("[BrandVision] generateOne failed:",r),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-2HOZGV6G.js");i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let s=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(s!=null&&s.success)||!(s!=null&&s.path))return console.error("[BrandVision] Save to library failed:",(s==null?void 0:s.error)||s),null;let r=window.addAssetToRegistry;typeof r=="function"&&r(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(s.path)}catch(a){return console.error("[BrandVision] Save to library error:",a),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let s=n.slots.find(r=>r.slotId===e||r.currentAsset===e);if(s!=null&&s.category)return String(s.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let s=e.toLowerCase(),r=l=>a.find(c=>c.toLowerCase().includes(l));return s.includes("bg")||s.includes("background")?r("background")||a[0]:(s.includes("cta")||s.includes("button")||s.includes("ui")||s.includes("logo"))&&r("ui")||a[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var a;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(a=this.root)==null?void 0:a.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,a=r=>{let l=Math.max(300,n+(r.clientX-i));this.root.style.width=`${l}px`},s=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",s)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",s)})}refresh(){}};function Ys(o,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${o}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
1607
- `)}var Lo=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],ko=["cta_hint","cta_label_end"],Ws=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],To=["brand.primary","brand.heading","brand.body","brand.warning"],_i=class{constructor(){this.root=null;this.assetsContainer=null;this.colorsContainer=null;this.fontsContainer=null;this.textsContainer=null;this.audioContainer=null;this.options=null;this.previewModal=null;this.autoApplyTimer=null;this.activePreviewKey=null;this.activePreviewValue=null;this.activePreviewFileInput=null;this.retryTimer=null;this.aiModal=null;this.aiTargetKey=null;this.aiKeyInput=null;this.aiPromptInput=null;this.aiStrengthInput=null;this.aiStrengthValue=null;this.aiModelSelect=null;this.aiModalSubtitle=null;this.aiGalleryToggle=null;this.aiGalleryEl=null;this.aiGalleryGrid=null;this.aiReferenceInput=null;this.aiReferenceName=null;this.aiReferenceFile=null;this.aiRemoveBgToggle=null;this.aiUseOutputToggle=null;this.aiGenerateBtn=null;this.aiApplyBtn=null;this.aiSaveLibraryBtn=null;this.aiCropBtn=null;this.aiDownloadBtn=null;this.aiPreviewImg=null;this.aiStatusEl=null;this.aiOutputDataUrl=null;this.aiBaseDataUrl=null;this.aiBaseValue=null;this.aiOutputKey=null;this.aiContext=null;this.aiBgToleranceInput=null;this.aiBgToleranceValue=null;this.aiRawOutputDataUrl=null;this.aiLoadingEl=null}render(){return`
1606
+ `}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let s=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;s&&(await this.stageEngineAssetOverride(n,s),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(s=>s.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(s=>s.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,s;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(r=>r.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(s=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:s.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let r={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await En(r,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(r){console.error("[BrandVision] generateOne failed:",r),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-SLXAGR2M.js");i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let s=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(s!=null&&s.success)||!(s!=null&&s.path))return console.error("[BrandVision] Save to library failed:",(s==null?void 0:s.error)||s),null;let r=window.addAssetToRegistry;typeof r=="function"&&r(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(s.path)}catch(a){return console.error("[BrandVision] Save to library error:",a),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let s=n.slots.find(r=>r.slotId===e||r.currentAsset===e);if(s!=null&&s.category)return String(s.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let s=e.toLowerCase(),r=l=>a.find(c=>c.toLowerCase().includes(l));return s.includes("bg")||s.includes("background")?r("background")||a[0]:(s.includes("cta")||s.includes("button")||s.includes("ui")||s.includes("logo"))&&r("ui")||a[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var a;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(a=this.root)==null?void 0:a.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,a=r=>{let l=Math.max(300,n+(r.clientX-i));this.root.style.width=`${l}px`},s=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",s)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",s)})}refresh(){}};function Ws(o,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${o}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
1607
+ `)}var Lo=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],ko=["cta_hint","cta_label_end"],Ks=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],To=["brand.primary","brand.heading","brand.body","brand.warning"],Oi=class{constructor(){this.root=null;this.assetsContainer=null;this.colorsContainer=null;this.fontsContainer=null;this.textsContainer=null;this.audioContainer=null;this.options=null;this.previewModal=null;this.autoApplyTimer=null;this.activePreviewKey=null;this.activePreviewValue=null;this.activePreviewFileInput=null;this.retryTimer=null;this.aiModal=null;this.aiTargetKey=null;this.aiKeyInput=null;this.aiPromptInput=null;this.aiStrengthInput=null;this.aiStrengthValue=null;this.aiModelSelect=null;this.aiModalSubtitle=null;this.aiGalleryToggle=null;this.aiGalleryEl=null;this.aiGalleryGrid=null;this.aiReferenceInput=null;this.aiReferenceName=null;this.aiReferenceFile=null;this.aiRemoveBgToggle=null;this.aiUseOutputToggle=null;this.aiGenerateBtn=null;this.aiApplyBtn=null;this.aiSaveLibraryBtn=null;this.aiCropBtn=null;this.aiDownloadBtn=null;this.aiPreviewImg=null;this.aiStatusEl=null;this.aiOutputDataUrl=null;this.aiBaseDataUrl=null;this.aiBaseValue=null;this.aiOutputKey=null;this.aiContext=null;this.aiBgToleranceInput=null;this.aiBgToleranceValue=null;this.aiRawOutputDataUrl=null;this.aiLoadingEl=null}render(){return`
1608
1608
  <div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
1609
1609
  <div class="scene-panel-header" data-panel-handle>
1610
1610
  <div class="panel-title">
@@ -1662,17 +1662,17 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1662
1662
  </div>
1663
1663
  <div class="panel-resize-handle" data-panel-resize></div>
1664
1664
  </div>
1665
- `}initialize(e,t){var n,a,s,r,l,c;this.options=t,this.root=e.querySelector('[data-panel="customize-settings"]'),this.assetsContainer=(n=this.root)==null?void 0:n.querySelector("[data-customize-assets]"),this.colorsContainer=(a=this.root)==null?void 0:a.querySelector("[data-customize-colors]"),this.fontsContainer=(s=this.root)==null?void 0:s.querySelector("[data-customize-fonts]"),this.textsContainer=(r=this.root)==null?void 0:r.querySelector("[data-customize-texts]"),this.audioContainer=(l=this.root)==null?void 0:l.querySelector("[data-customize-audio]");let i=(c=this.root)==null?void 0:c.querySelector("[data-customize-apply]");i==null||i.addEventListener("click",()=>this.handleApply()),this.setupRenderModeHandlers(),this.setupResizeHandle(),this.refresh()}setupRenderModeHandlers(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector('[data-render-mode="endgame-png"]'),t=(n=this.root)==null?void 0:n.querySelector('[data-render-mode="splash-png"]');e==null||e.addEventListener("change",()=>{this.applyEndgamePngMode(e.checked)}),t==null||t.addEventListener("change",()=>{this.applySplashPngMode(t.checked)})}applyEndgamePngMode(e){let t=window.getEditableObjectConfig,i=window.applyEditableObjectConfig;if(typeof t!="function"||typeof i!="function")return;let n=["ui_endgame_title_1","ui_endgame_subtitle_1","ui_endgame_logo_1","ui_endgame_cta_1"];for(let a of n){let s=t(a);s&&(s.ui||(s.ui={}),s.ui.renderMode=e?"png":"text",e&&(s.render||(s.render={}),s.render.asset||(s.render.asset={type:"image",path:""}),s.render.asset.type="image"),i(a,s))}console.log("[CustomizePanel] EndGame PNG mode:",e?"enabled":"disabled")}applySplashPngMode(e){let t=window.applyEditableEngineConfig;typeof t=="function"&&(t({splash:{type:e?"image":"text",image_path:e?"library/splash/splash.png":""}}),console.log("[CustomizePanel] Splash PNG mode:",e?"enabled":"disabled"))}openAiEditor(e,t,i,n){this.openAiModal(e,i,n),t&&this.aiPromptInput&&(this.aiPromptInput.value=t,this.setAiStatus("Prompt loaded."))}refresh(){var t,i,n,a,s,r,l,c;let e=this.getEngineSnapshot();if(!e){this.scheduleRetry();return}console.log("[CustomizePanel] Snapshot assets count:",Object.keys(e.assets||{}).length),this.renderAssets(e.assets),this.renderColors((i=(t=e.runtime)==null?void 0:t.theme)!=null?i:{}),this.renderFonts((a=(n=e.runtime)==null?void 0:n.fonts)!=null?a:{}),this.renderTexts((r=(s=e.runtime)==null?void 0:s.ui)!=null?r:{}),this.renderAudio((c=(l=e.runtime)==null?void 0:l.audio)!=null?c:{})}getEngineSnapshot(){let e=window.getEditableEngineConfig;return typeof e!="function"?null:e()}renderAssets(e){if(!this.assetsContainer)return;this.assetsContainer.innerHTML="";let t=Object.entries(e!=null?e:{});if(!t.length){this.assetsContainer.innerHTML='<div class="customize-empty">No assets found.</div>',this.scheduleRetry();return}this.clearRetry(),t.forEach(([i,n])=>{var p;let a=document.createElement("div");a.className="customize-row";let s=document.createElement("span");s.className="customize-key",s.textContent=i;let r=document.createElement("input");r.type="text",r.value=n!=null?n:"",r.className="customize-input",r.dataset.assetKey=i,r.addEventListener("input",()=>{this.handleAssetValueChange(i,r)});let l=document.createElement("div");l.className="customize-actions";let c=document.createElement("button");c.type="button",c.className="customize-icon-btn",c.title="Preview asset",c.innerHTML=`
1665
+ `}initialize(e,t){var n,a,s,r,l,c;this.options=t,this.root=e.querySelector('[data-panel="customize-settings"]'),this.assetsContainer=(n=this.root)==null?void 0:n.querySelector("[data-customize-assets]"),this.colorsContainer=(a=this.root)==null?void 0:a.querySelector("[data-customize-colors]"),this.fontsContainer=(s=this.root)==null?void 0:s.querySelector("[data-customize-fonts]"),this.textsContainer=(r=this.root)==null?void 0:r.querySelector("[data-customize-texts]"),this.audioContainer=(l=this.root)==null?void 0:l.querySelector("[data-customize-audio]");let i=(c=this.root)==null?void 0:c.querySelector("[data-customize-apply]");i==null||i.addEventListener("click",()=>this.handleApply()),this.setupRenderModeHandlers(),this.setupResizeHandle(),this.refresh()}setupRenderModeHandlers(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector('[data-render-mode="endgame-png"]'),t=(n=this.root)==null?void 0:n.querySelector('[data-render-mode="splash-png"]');e==null||e.addEventListener("change",()=>{this.applyEndgamePngMode(e.checked)}),t==null||t.addEventListener("change",()=>{this.applySplashPngMode(t.checked)})}applyEndgamePngMode(e){let t=window.getEditableObjectConfig,i=window.applyEditableObjectConfig;if(typeof t!="function"||typeof i!="function")return;let n=["ui_endgame_title_1","ui_endgame_subtitle_1","ui_endgame_logo_1","ui_endgame_cta_1"];for(let a of n){let s=t(a);s&&(s.ui||(s.ui={}),s.ui.renderMode=e?"png":"text",e&&(s.render||(s.render={}),s.render.asset||(s.render.asset={type:"image",path:""}),s.render.asset.type="image"),i(a,s))}console.log("[CustomizePanel] EndGame PNG mode:",e?"enabled":"disabled")}applySplashPngMode(e){let t=window.applyEditableEngineConfig;typeof t=="function"&&(t({splash:{type:e?"image":"text",image_path:e?"library/splash/splash.png":""}}),console.log("[CustomizePanel] Splash PNG mode:",e?"enabled":"disabled"))}openAiEditor(e,t,i,n){this.openAiModal(e,i,n),t&&this.aiPromptInput&&(this.aiPromptInput.value=t,this.setAiStatus("Prompt loaded."))}refresh(){var t,i,n,a,s,r,l,c;let e=this.getEngineSnapshot();if(!e){this.scheduleRetry();return}console.log("[CustomizePanel] Snapshot assets count:",Object.keys(e.assets||{}).length),this.renderAssets(e.assets),this.renderColors((i=(t=e.runtime)==null?void 0:t.theme)!=null?i:{}),this.renderFonts((a=(n=e.runtime)==null?void 0:n.fonts)!=null?a:{}),this.renderTexts((r=(s=e.runtime)==null?void 0:s.ui)!=null?r:{}),this.renderAudio((c=(l=e.runtime)==null?void 0:l.audio)!=null?c:{})}getEngineSnapshot(){let e=window.getEditableEngineConfig;return typeof e!="function"?null:e()}renderAssets(e){if(!this.assetsContainer)return;this.assetsContainer.innerHTML="";let t=Object.entries(e!=null?e:{});if(!t.length){this.assetsContainer.innerHTML='<div class="customize-empty">No assets found.</div>',this.scheduleRetry();return}this.clearRetry(),t.forEach(([i,n])=>{var u;let a=document.createElement("div");a.className="customize-row";let s=document.createElement("span");s.className="customize-key",s.textContent=i;let r=document.createElement("input");r.type="text",r.value=n!=null?n:"",r.className="customize-input",r.dataset.assetKey=i,r.addEventListener("input",()=>{this.handleAssetValueChange(i,r)});let l=document.createElement("div");l.className="customize-actions";let c=document.createElement("button");c.type="button",c.className="customize-icon-btn",c.title="Preview asset",c.innerHTML=`
1666
1666
  <svg viewBox="0 0 24 24" aria-hidden="true">
1667
1667
  <path d="M12 5c5.2 0 9.2 3.7 10 6.8-.8 3.1-4.8 6.8-10 6.8S2.8 14.9 2 11.8C2.8 8.7 6.8 5 12 5z" />
1668
1668
  <circle cx="12" cy="12" r="3.2" />
1669
1669
  </svg>
1670
- `,c.addEventListener("click",()=>{this.previewAsset(i,r.value,r.dataset.assetType,u)});let d=document.createElement("button");d.type="button",d.className="customize-icon-btn",d.title="Upload asset",d.innerHTML=`
1670
+ `,c.addEventListener("click",()=>{this.previewAsset(i,r.value,r.dataset.assetType,p)});let d=document.createElement("button");d.type="button",d.className="customize-icon-btn",d.title="Upload asset",d.innerHTML=`
1671
1671
  <svg viewBox="0 0 24 24" aria-hidden="true">
1672
1672
  <path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
1673
1673
  <path d="M5 14v4h14v-4h2v6H3v-6h2z" />
1674
1674
  </svg>
1675
- `;let u=document.createElement("input");u.type="file",u.accept="image/*,audio/*,application/json",u.className="customize-file",u.addEventListener("change",()=>{var h;let g=(h=u.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,r,i)}),d.addEventListener("click",()=>u.click()),l.appendChild(c),l.appendChild(d),l.appendChild(u),a.appendChild(s),a.appendChild(r),a.appendChild(l),(p=this.assetsContainer)==null||p.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Lo.forEach(t=>{var l,c,d;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let p={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];p&&(i=(c=this.getObjectPropertyValue(p.objectId,p.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let s=document.createElement("input");s.type="color",s.value=i,s.dataset.colorKey=t;let r=document.createElement("input");r.type="text",r.value=i,r.className="customize-color-text",r.dataset.colorTextKey=t,s.addEventListener("input",()=>{r.value=s.value}),r.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(r.value)&&(s.value=r.value)}),n.appendChild(a),n.appendChild(s),n.appendChild(r),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",To.forEach(t=>{var s,r;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(s=e==null?void 0:e[t])!=null?s:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(r=this.fontsContainer)==null||r.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",ko.forEach(t=>{var s,r;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(s=this.readUiValue(e,t))!=null?s:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(r=this.textsContainer)==null||r.appendChild(i)}),Ws.forEach(({key:t,objectId:i})=>{var r,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let s=document.createElement("input");s.type="text",s.value=(r=this.getObjectTextValue(i))!=null?r:"",s.className="customize-input",s.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(s),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var r,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let s=document.createElement("input");s.type=i.includes("volume")?"number":"text",s.min="0",s.max="1",s.step="0.1",s.value=String((r=e==null?void 0:e[i])!=null?r:""),s.className="customize-input",s.dataset.audioKey=i,i.includes("file")&&(s.placeholder="audio file path"),n.appendChild(a),n.appendChild(s),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let s of n){if(a==null)return null;a=a[s]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),s=n;for(let r of a){if(s==null)return null;s=s[r]}return typeof s=="string"?s:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(r=>{let l=r;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(r=>{let l=r,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(r=>{let l=r,c=l.dataset.fontKey;c&&(n[c]=l.value)});let a={};this.root.querySelectorAll("[data-text-key]").forEach(r=>{let l=r,c=l.dataset.textKey;c&&(a[c]=l.value)});let s={};this.root.querySelectorAll("[data-audio-key]").forEach(r=>{let l=r,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let d=parseFloat(l.value);s[c]=isNaN(d)?0:d}else s[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(r=>{let l=r,c=l.dataset.objectTextKey;if(!c)return;let d=Ws.find(u=>u.key===c);d&&this.applyObjectPropertyValue(d.objectId,d.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:s}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await Ti(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,s;let t=(e==null?void 0:e.trim())||"";if(!t){let r=this.getSelectedAssetInput();t=(a=(n=r==null?void 0:r.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(s=i==null?void 0:i.dataUrl)!=null?s:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let s=this.resolveAssetUrls(i);s[0]&&(a.src=s[0]);let r=document.createElement("span");r.className="ai-gallery-label",r.textContent=t,n.appendChild(a),n.appendChild(r),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var s,r;let i=t,n=i.dataset.assetKey,a=(r=(s=i.value)==null?void 0:s.trim())!=null?r:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var r,l,c,d,u,p,g,h,m,f;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
1675
+ `;let p=document.createElement("input");p.type="file",p.accept="image/*,audio/*,application/json",p.className="customize-file",p.addEventListener("change",()=>{var h;let g=(h=p.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,r,i)}),d.addEventListener("click",()=>p.click()),l.appendChild(c),l.appendChild(d),l.appendChild(p),a.appendChild(s),a.appendChild(r),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Lo.forEach(t=>{var l,c,d;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let s=document.createElement("input");s.type="color",s.value=i,s.dataset.colorKey=t;let r=document.createElement("input");r.type="text",r.value=i,r.className="customize-color-text",r.dataset.colorTextKey=t,s.addEventListener("input",()=>{r.value=s.value}),r.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(r.value)&&(s.value=r.value)}),n.appendChild(a),n.appendChild(s),n.appendChild(r),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",To.forEach(t=>{var s,r;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(s=e==null?void 0:e[t])!=null?s:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(r=this.fontsContainer)==null||r.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",ko.forEach(t=>{var s,r;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(s=this.readUiValue(e,t))!=null?s:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(r=this.textsContainer)==null||r.appendChild(i)}),Ks.forEach(({key:t,objectId:i})=>{var r,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let s=document.createElement("input");s.type="text",s.value=(r=this.getObjectTextValue(i))!=null?r:"",s.className="customize-input",s.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(s),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var r,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let s=document.createElement("input");s.type=i.includes("volume")?"number":"text",s.min="0",s.max="1",s.step="0.1",s.value=String((r=e==null?void 0:e[i])!=null?r:""),s.className="customize-input",s.dataset.audioKey=i,i.includes("file")&&(s.placeholder="audio file path"),n.appendChild(a),n.appendChild(s),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let s of n){if(a==null)return null;a=a[s]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),s=n;for(let r of a){if(s==null)return null;s=s[r]}return typeof s=="string"?s:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(r=>{let l=r;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(r=>{let l=r,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(r=>{let l=r,c=l.dataset.fontKey;c&&(n[c]=l.value)});let a={};this.root.querySelectorAll("[data-text-key]").forEach(r=>{let l=r,c=l.dataset.textKey;c&&(a[c]=l.value)});let s={};this.root.querySelectorAll("[data-audio-key]").forEach(r=>{let l=r,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let d=parseFloat(l.value);s[c]=isNaN(d)?0:d}else s[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(r=>{let l=r,c=l.dataset.objectTextKey;if(!c)return;let d=Ks.find(p=>p.key===c);d&&this.applyObjectPropertyValue(d.objectId,d.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:s}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await Pi(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,s;let t=(e==null?void 0:e.trim())||"";if(!t){let r=this.getSelectedAssetInput();t=(a=(n=r==null?void 0:r.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(s=i==null?void 0:i.dataUrl)!=null?s:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let s=this.resolveAssetUrls(i);s[0]&&(a.src=s[0]);let r=document.createElement("span");r.className="ai-gallery-label",r.textContent=t,n.appendChild(a),n.appendChild(r),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var s,r;let i=t,n=i.dataset.assetKey,a=(r=(s=i.value)==null?void 0:s.trim())!=null?r:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var r,l,c,d,p,u,g,h,m,f;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
1676
1676
  <div class="ai-modal-card">
1677
1677
  <div class="ai-modal-header">
1678
1678
  <div>
@@ -1743,7 +1743,7 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1743
1743
  </div>
1744
1744
  </div>
1745
1745
  </div>
1746
- `;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()}),(u=this.aiReferenceInput)==null||u.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}`)}),(p=this.aiGenerateBtn)==null||p.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,u,p,g,h,m,f,b,y,w,v,k,M,_,T,j,P,L,E,A;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(p=(u=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:u.trim())!=null?p:"",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((k=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?k:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((M=l==null?void 0:l.value)==null?void 0:M.trim())||((_=this.aiBaseValue)==null?void 0:_.trim())||"";this.setAiLoading(!0),this.setAiStatus(c?"Generating...":"Generating from scratch...");try{let x=null,S=null,C=(T=this.getSelectedAssetKey())!=null?T:"unknown",R=(j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((P=this.aiUseOutputToggle)!=null&&P.checked&&this.aiOutputDataUrl){let F=yn(this.aiOutputDataUrl,"ai-output.png");if(F){let D=await Ve(F);D&&(x={input:{base64:D.base64,mimeType:D.mimeType},dataUrl:D.dataUrl,width:D.width,height:D.height})}}!x&&c&&(x=await this.getImageDataFromAsset(c));let I=[];x&&I.push(x.input);let O=!1;if(this.aiReferenceFile){let F=await Ve(this.aiReferenceFile);F?(S={input:{base64:F.base64,mimeType:F.mimeType},dataUrl:F.dataUrl,width:F.width,height:F.height},I.push(S.input),O=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let z=Ys(i,{includeReference:O,includeMagenta:a,changeLevel:r}),$=(E=(L=this.aiReferenceFile)==null?void 0:L.name)!=null?E:"none";console.info("[AI] Final prompt:",z),console.info("[AI] Image sources:",{assetKey:C,base:R,reference:$});let q=x?vn(x.width,x.height):S?vn(S.width,S.height):"1:1";console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let B=await ut(e,z,I,{aspectRatio:q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",B==null?void 0:B.length),this.aiRawOutputDataUrl=B,await this.refreshAiOutputFromRaw()}catch(x){console.error("[CustomizePanel] AI Generate Error:",x),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((A=this.aiStatusEl)==null?void 0:A.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 pt(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 u=window.refreshAssetLibrary;typeof u=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await u());let p=window.__wizardAssetPicker;if(p!=null&&p.onPick){p.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=yn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let s=await bn(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 p,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 bn(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=((p=e.name.toLowerCase().match(/\.(png|jpg|jpeg|gif|webp)$/))==null?void 0:p[1])||"png",c=l==="jpg"?"jpeg":l,d=`${r}_uploaded_${Date.now()}.${c}`,u=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",d,"category:",u);try{let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:u,filename:d,data:s,overwrite:!0})})).json();if(y.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",y.path),await new Promise(P=>setTimeout(P,100));let w=window.addAssetToRegistry;typeof w=="function"&&(w(u,d),console.log("[CustomizePanel] \u2705 Added to registry:",u,d));let v=window.getEditableAssets;if(typeof v=="function"){let P=v();P&&!P.categories&&(P.categories=[]),P!=null&&P.categories&&!P.categories.includes(u)&&(P.categories.push(u),console.log(`[CustomizePanel] Added category ${u} to registry`))}let k=!1,M=0,_=10;for(;!k&&M<_;){M++,console.log(`[CustomizePanel] Refresh attempt ${M}/${_}...`);try{(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok&&console.log("[CustomizePanel] \u2705 Registry rebuilt from disk")}catch(A){console.warn("[CustomizePanel] Setup-library not available:",A)}await new Promise(A=>setTimeout(A,300));let P=window.refreshAssetLibrary;typeof P=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await P());let L=window.reRenderAssetLibrary;typeof L=="function"&&(console.log("[CustomizePanel] Re-rendering library panel..."),L());let E=window.getEditableAssets;if(typeof E=="function"){let A=E(),x=((g=A==null?void 0:A.libraryAssets)==null?void 0:g[u])||[];x.some(C=>(C==null?void 0:C.filename)===d)?(console.log("[CustomizePanel] \u2705 Asset found in registry!"),k=!0):(console.log(`[CustomizePanel] Asset not found yet, retrying... (found ${x.length} assets in ${u})`),await new Promise(C=>setTimeout(C,500)))}else M>=2&&(k=!0)}k||console.warn("[CustomizePanel] \u26A0\uFE0F Asset not found in registry after retries, proceeding anyway..."),t.value=y.path,this.handleAssetValueChange(i,t);let T=this.inferObjectIdFromAssetKey(i),j=this.inferPathFromAssetKey(i);if(T&&j){let P=!1,L=0,E=5;for(;!P&&L<E;){L++;try{console.log(`[CustomizePanel] Applying asset attempt ${L}/${E}...`);let x=window.applyAssetToSlot,S=/texture|image|sprite|asset\\.path/i.test(j)||/\\.(png|jpg|jpeg)$/i.test(String(y.path||""));if(typeof x=="function"&&S){let R=this.getFilenameFromPath(y.path);await x(T,R,u)}else this.applyObjectPropertyValue(T,j,y.path);await new Promise(R=>setTimeout(R,200));let C=window.getEditableObjectConfig;if(typeof C=="function"){let R=C(T),I=((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)||"";I===y.path||I.includes(d)?(console.log("[CustomizePanel] \u2705 Asset confirmed applied to object"),P=!0):(console.log(`[CustomizePanel] Asset not applied yet (attempt ${L}), retrying...`),await new Promise(O=>setTimeout(O,300)))}else P=!0}catch(x){console.error(`[CustomizePanel] Apply attempt ${L} failed:`,x),L<E&&await new Promise(S=>setTimeout(S,500))}}window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:T,action:"update",path:j}})),setTimeout(()=>{try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),console.log("[CustomizePanel] Dispatched config:changed event")}catch(x){console.warn("[CustomizePanel] Failed to refresh textures:",x)}},300);let A=window.__highlightLibrarySlot;typeof A=="function"&&T&&setTimeout(()=>{A(T,u)},1e3),P?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=`
1746
+ `;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=`
1747
1747
  <div class="asset-preview-card">
1748
1748
  <div class="asset-preview-header">
1749
1749
  <div class="asset-preview-title">${e}</div>
@@ -1759,7 +1759,7 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1759
1759
  <img class="asset-preview-ai-image" alt="AI output preview">
1760
1760
  </div>
1761
1761
  </div>
1762
- `;let s=a.querySelector(".asset-preview-body"),r=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),d=a.querySelector("[data-asset-ai-preview]");if(r==null||r.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),a.addEventListener("click",u=>{u.target===a&&this.closePreviewModal()}),s)if(n==="image"){let u=document.createElement("img");this.loadWithFallback(u,i),s.appendChild(u)}else if(n==="audio"){let u=document.createElement("audio");u.controls=!0,this.loadWithFallback(u,i),s.appendChild(u)}else if(n==="json"){let u=document.createElement("pre");this.fetchWithFallback(i).then(p=>{u.textContent=p!=null?p:"Unable to load JSON."}),s.appendChild(u)}else{let u=document.createElement("a");u.href=i[0],u.target="_blank",u.rel="noreferrer",u.textContent="Open asset",s.appendChild(u)}document.body.appendChild(a),this.previewModal=a,this.updateAiModalPreview(d,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="function")return;let s=n(e);if(!s)return;let r=JSON.parse(JSON.stringify(s)),l=t.split("."),c=r;for(let d=0;d<l.length-1;d++){let u=l[d];c[u]=c[u]||{},c=c[u]}c[l[l.length-1]]=i,a(e,r)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var a;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(a=this.activePreviewFileInput)!=null?a:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=a=>{var p,g;a.preventDefault();let s=a.clientX,r=(g=(p=this.root)==null?void 0:p.getBoundingClientRect().width)!=null?g:0,l=260,c=620,d=h=>{let m=h.clientX-s,f=Math.min(c,Math.max(l,r+m));this.root&&(this.root.style.width=`${f}px`)},u=()=>{var m,f;window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u);let h=(f=(m=this.root)==null?void 0:m.getBoundingClientRect().width)!=null?f:0;h>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(h)))};window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,a=URL.createObjectURL(e),s=null;try{if(s=await this.loadImage(a),!(s!=null&&s.naturalWidth)||!(s!=null&&s.naturalHeight))return console.error("[CustomizePanel] Failed to load image for crop:",e.name),URL.revokeObjectURL(a),null;console.log("[CustomizePanel] Image loaded for crop:",s.naturalWidth,"x",s.naturalHeight)}catch(l){return console.error("[CustomizePanel] Error loading image:",l),URL.revokeObjectURL(a),null}let r=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let d=Math.min(860,window.innerWidth-60),h=Math.max(220,Math.floor((d-32-16)/2)),m=Math.min(520,window.innerHeight-240),f=h,b=f/n;b>m&&(b=m,f=b*n),c.innerHTML=`
1762
+ `;let s=a.querySelector(".asset-preview-body"),r=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),d=a.querySelector("[data-asset-ai-preview]");if(r==null||r.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),a.addEventListener("click",p=>{p.target===a&&this.closePreviewModal()}),s)if(n==="image"){let p=document.createElement("img");this.loadWithFallback(p,i),s.appendChild(p)}else if(n==="audio"){let p=document.createElement("audio");p.controls=!0,this.loadWithFallback(p,i),s.appendChild(p)}else if(n==="json"){let p=document.createElement("pre");this.fetchWithFallback(i).then(u=>{p.textContent=u!=null?u:"Unable to load JSON."}),s.appendChild(p)}else{let p=document.createElement("a");p.href=i[0],p.target="_blank",p.rel="noreferrer",p.textContent="Open asset",s.appendChild(p)}document.body.appendChild(a),this.previewModal=a,this.updateAiModalPreview(d,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="function")return;let s=n(e);if(!s)return;let r=JSON.parse(JSON.stringify(s)),l=t.split("."),c=r;for(let d=0;d<l.length-1;d++){let p=l[d];c[p]=c[p]||{},c=c[p]}c[l[l.length-1]]=i,a(e,r)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var a;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(a=this.activePreviewFileInput)!=null?a:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=a=>{var u,g;a.preventDefault();let s=a.clientX,r=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,d=h=>{let m=h.clientX-s,f=Math.min(c,Math.max(l,r+m));this.root&&(this.root.style.width=`${f}px`)},p=()=>{var m,f;window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p);let h=(f=(m=this.root)==null?void 0:m.getBoundingClientRect().width)!=null?f:0;h>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(h)))};window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,a=URL.createObjectURL(e),s=null;try{if(s=await this.loadImage(a),!(s!=null&&s.naturalWidth)||!(s!=null&&s.naturalHeight))return console.error("[CustomizePanel] Failed to load image for crop:",e.name),URL.revokeObjectURL(a),null;console.log("[CustomizePanel] Image loaded for crop:",s.naturalWidth,"x",s.naturalHeight)}catch(l){return console.error("[CustomizePanel] Error loading image:",l),URL.revokeObjectURL(a),null}let r=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let d=Math.min(860,window.innerWidth-60),h=Math.max(220,Math.floor((d-32-16)/2)),m=Math.min(520,window.innerHeight-240),f=h,b=f/n;b>m&&(b=m,f=b*n),c.innerHTML=`
1763
1763
  <div class="asset-crop-card" style="width:${d}px;">
1764
1764
  <div class="asset-crop-header">
1765
1765
  <div>
@@ -1789,7 +1789,7 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1789
1789
  <button class="asset-crop-apply" type="button">Apply Crop</button>
1790
1790
  </div>
1791
1791
  </div>
1792
- `;let y=c.querySelector(".asset-crop-canvas"),w=c.querySelector(".asset-crop-preview"),v=c.querySelector(".asset-crop-zoom"),k=c.querySelector(".asset-crop-zoom-value"),M=c.querySelector(".asset-crop-close"),_=c.querySelector(".asset-crop-cancel"),T=c.querySelector(".asset-crop-apply"),j=c.querySelector(".asset-crop-reset");if(!y||!w||!v||!k){l(null);return}let P=y.getContext("2d"),L=w.getContext("2d");if(!P||!L){l(null);return}let E=s.naturalWidth,A=s.naturalHeight,x=Math.max(y.width/E,y.height/A),S=1,C=0,R=0,I=!1,O=0,z=0,$=0,q=0,B=()=>{let N=x*S,te=Math.max(0,(E*N-y.width)/2),J=Math.max(0,(A*N-y.height)/2);C=Math.min(te,Math.max(-te,C)),R=Math.min(J,Math.max(-J,R))},F=()=>{if(!s||!s.complete||s.naturalWidth===0||s.naturalHeight===0){console.warn("[CustomizePanel] Image not ready for drawing"),P.fillStyle="rgba(128, 128, 128, 0.3)",P.fillRect(0,0,y.width,y.height),P.fillStyle="rgba(255, 255, 255, 0.5)",P.font="14px sans-serif",P.textAlign="center",P.fillText("Loading image...",y.width/2,y.height/2);return}let N=x*S;P.clearRect(0,0,y.width,y.height);let te=y.width/2-E*N/2+C,J=y.height/2-A*N/2+R;try{P.drawImage(s,te,J,E*N,A*N)}catch(Y){console.error("[CustomizePanel] Error drawing image:",Y),P.fillStyle="rgba(255, 0, 0, 0.3)",P.fillRect(0,0,y.width,y.height),P.fillStyle="#ff0000",P.font="14px sans-serif",P.textAlign="center",P.fillText("Error drawing image",y.width/2,y.height/2)}if(L.clearRect(0,0,w.width,w.height),r!=null&&r.naturalWidth&&(r!=null&&r.naturalHeight)){let Y=Math.max(w.width/r.naturalWidth,w.height/r.naturalHeight),oe=w.width/2-r.naturalWidth*Y/2,ie=w.height/2-r.naturalHeight*Y/2;L.drawImage(r,oe,ie,r.naturalWidth*Y,r.naturalHeight*Y)}else L.fillStyle="rgba(255, 255, 255, 0.04)",L.fillRect(0,0,w.width,w.height),L.strokeStyle="rgba(255, 255, 255, 0.08)",L.strokeRect(4,4,w.width-8,w.height-8);let Z=w.width/y.width*(x*S),pe=C*(w.width/y.width),re=R*(w.height/y.height),Me=w.width/2-E*Z/2+pe,je=w.height/2-A*Z/2+re;L.save(),L.globalAlpha=.7,L.drawImage(s,Me,je,E*Z,A*Z),L.restore()},D=()=>{C=0,R=0,B(),F()};v.addEventListener("input",()=>{S=Number(v.value),k.textContent=`${S.toFixed(2)}\xD7`,B(),F()}),y.addEventListener("pointerdown",N=>{I=!0,O=N.clientX,z=N.clientY,$=C,q=R,y.setPointerCapture(N.pointerId)}),y.addEventListener("pointermove",N=>{I&&(C=$+(N.clientX-O),R=q+(N.clientY-z),B(),F())}),y.addEventListener("pointerup",N=>{I=!1,y.releasePointerCapture(N.pointerId)}),y.addEventListener("pointerleave",()=>{I=!1});let G=()=>{c.remove();try{URL.revokeObjectURL(a)}catch{}},W=()=>{G(),l(null)},K=async()=>{let N=document.createElement("canvas");N.width=t.width,N.height=t.height;let te=N.getContext("2d");if(!te){G(),l(null);return}let J=S,pe=Math.max(N.width/E,N.height/A)*J,re=N.width/y.width,Me=C*re,je=R*re,Y=N.width/2-E*pe/2+Me,oe=N.height/2-A*pe/2+je;te.drawImage(s,Y,oe,E*pe,A*pe);let ie=await new Promise(ue=>{N.toBlob(Ue=>ue(Ue),e.type||"image/png")});if(G(),!ie){l(null);return}l(new File([ie],e.name,{type:ie.type}))};M==null||M.addEventListener("click",W),_==null||_.addEventListener("click",W),j==null||j.addEventListener("click",D),T==null||T.addEventListener("click",()=>{K()}),c.addEventListener("click",N=>{N.target===c&&W()}),document.body.appendChild(c),s.complete&&s.naturalWidth>0&&s.naturalHeight>0?D():(s.onload=()=>{console.log("[CustomizePanel] Image fully loaded, drawing crop modal"),D()},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 Ri=class{constructor(){this.root=null;this.options=null}render(){return`
1792
+ `;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`
1793
1793
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
1794
1794
  <div class="scene-panel-header" data-panel-handle>
1795
1795
  <div class="panel-title">
@@ -1855,10 +1855,10 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1855
1855
  </div>
1856
1856
  </div>
1857
1857
  </div>
1858
- `}initialize(e,t){var y,w,v,k,M,_,T,j,P,L,E,A,x,S,C,R;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var O;let I=window.getEditableEngineConfig;if(typeof I=="function"){let z=I();return(O=z==null?void 0:z.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 I,O;(O=(I=this.options)==null?void 0:I.onUpdateLoading)==null||O.call(I,{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 I,O;(O=(I=this.options)==null?void 0:I.onUpdateLoading)==null||O.call(I,{background_color:s.value})}));let r=(v=this.root)==null?void 0:v.querySelector("#loading-overlay-alpha"),l=(k=this.root)==null?void 0:k.querySelector("#loading-overlay-alpha-value");r&&(r.value=String((M=n.overlay_alpha)!=null?M:1),l&&(l.textContent=Number(r.value).toFixed(2)),r.addEventListener("input",()=>{var O,z;let I=Number(r.value);l&&(l.textContent=I.toFixed(2)),(z=(O=this.options)==null?void 0:O.onUpdateLoading)==null||z.call(O,{overlay_alpha:I})}));let c=(_=this.root)==null?void 0:_.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var I,O;(O=(I=this.options)==null?void 0:I.onUpdateLoading)==null||O.call(I,{text:c.value})}));let d=(T=this.root)==null?void 0:T.querySelector("#loading-text-scale"),u=(j=this.root)==null?void 0:j.querySelector("#loading-text-scale-value");d&&(d.value=String((P=n.text_scale)!=null?P:.6),u&&(u.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var O,z;let I=Number(d.value);u&&(u.textContent=I.toFixed(2)),(z=(O=this.options)==null?void 0:O.onUpdateLoading)==null||z.call(O,{text_scale:I})}));let p=(L=this.root)==null?void 0:L.querySelector("#loading-enabled");p&&(p.checked=n.enabled!==!1,p.addEventListener("change",()=>{var I,O;(O=(I=this.options)==null?void 0:I.onUpdateLoading)==null||O.call(I,{enabled:p.checked})}));let g=(E=this.root)==null?void 0:E.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var I,O;(O=(I=this.options)==null?void 0:I.onUpdateLoading)==null||O.call(I,{blur_enabled:g.checked})}));let h=(A=this.root)==null?void 0:A.querySelector("#loading-blur-strength"),m=(x=this.root)==null?void 0:x.querySelector("#loading-blur-strength-value");h&&(h.value=String((S=n.blur_strength)!=null?S:8),m&&(m.textContent=h.value),h.addEventListener("input",()=>{var I,O;m&&(m.textContent=h.value),(O=(I=this.options)==null?void 0:I.onUpdateLoading)==null||O.call(I,{blur_strength:Number(h.value)})}));let f=(C=this.root)==null?void 0:C.querySelector("#loading-show-btn"),b=(R=this.root)==null?void 0:R.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var I,O;(O=(I=this.options)==null?void 0:I.onShowLoadingScreen)==null||O.call(I)}),b==null||b.addEventListener("click",()=>{var I,O;(O=(I=this.options)==null?void 0:I.onHideLoadingScreen)==null||O.call(I)}),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 Qs,Point as Po}from"pixi.js";import{Point as Ks}from"pixi.js";var Ye=()=>window.debugConfig||{},Xs=()=>window.resolveAnchorVec2||(o=>({x:.5,y:.5})),Js=()=>window.resolveScreenAnchorPoint||(()=>new Ks),Zs=()=>window.resolveScreenRatioPoint||(()=>new Ks);function er(o){Oi(o)&&(o.objectDebugRaf||(o.objectDebugRaf=window.requestAnimationFrame(()=>zi(o))))}function tr(o){o.objectDebugRaf&&(window.cancelAnimationFrame(o.objectDebugRaf),o.objectDebugRaf=null),Ot(o)}function Oi(o){return o.isDebugOpen}function zi(o){var a,s,r;if(!Oi(o)){o.objectDebugRaf=null;return}o.objectDebugRaf=window.requestAnimationFrame(()=>zi(o));let e=Sn(o);if(!e){Rt(o,null),Ot(o);return}let t=En(o,e);if(!t){Rt(o,null),Ot(o);return}let i=new Po;(a=t.getGlobalPosition)==null||a.call(t,i);let n=An(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?Tn(o,t):In(o),o.highlightAnchor&&n?Pn(o,n):Mn(o)}function Sn(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 En(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 An(o,e){var s,r;let t=zt(o);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=Cn(o);if(!n)return null;if(i.position_ratio!=null)return Zs()(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"),Js()(n.width,n.height,a)}function Cn(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 Ln(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 Qs,o.objectBoundsGfx.zIndex=999999,e.stage.addChild(o.objectBoundsGfx)),o.objectBoundsGfx):null}function kn(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 Qs,o.objectAnchorGfx.zIndex=1e6,e.stage.addChild(o.objectAnchorGfx)),o.objectAnchorGfx):null}function Tn(o,e){var n;let t=Ln(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 Pn(o,e){let t=kn(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 In(o){o.objectBoundsGfx&&o.objectBoundsGfx.clear()}function Mn(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 ir(o,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,o)}function nr(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 jn(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 Di(o){let e=Ye();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 ar(o){window.location.reload()}function Hi(o){let e=JSON.stringify(Ye(),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 sr(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-VJNOXXCC.js"),u=(((t=(await r("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!u)return;let p=await l(u.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,p),$i(o,p),(i=o.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),$i(o,s),(n=o.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function $i(o,e){var p,g,h,m,f,b,y,w,v,k;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=jn(e)?(p=e.transform)==null?void 0:p.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=(k=(v=(y=e.transform)==null?void 0:y.anchor)!=null?v:(w=e.render)==null?void 0:w.anchor)!=null?k:"center";if(a){typeof d=="string"?a.value=d:a.value="custom";let M=o.container.querySelectorAll(".anchor-custom-field"),_=a.value==="custom";M.forEach(T=>T.style.display=_?"block":"none")}let u=Xs()(d);s&&(s.value=String(u.x)),r&&(r.value=String(u.y))}function rr(o){var l,c,d,u,p,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=(u=(d=o.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?u:"0",n=(g=(p=o.container.querySelector("#config-scale"))==null?void 0:p.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}:
1858
+ `}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-HQX4AQNX.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}:
1859
1859
  position: (${t}, ${i})
1860
1860
  scale: ${n}
1861
- 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 _n(o,e){var p,g,h,m,f,b,y,w,v,k,M,_;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=(p=o.container.querySelector("#config-pos-x"))==null?void 0:p.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((k=(v=o.container.querySelector("#config-anchor-x"))==null?void 0:v.value)!=null?k:.5),l=Number((_=(M=o.container.querySelector("#config-anchor-y"))==null?void 0:M.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-2HOZGV6G.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 u=zt(o);jn(u)&&d({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0})}async function or(o,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-2HOZGV6G.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,u])=>{var p;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]=(p=h[f])!=null?p:{},h=h[f]}h[g[g.length-1]]=u}else c[d]=u}),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 lr(o){o.selectedObjectId&&(o.objectAutoApplyTimer&&window.clearTimeout(o.objectAutoApplyTimer),o.objectAutoApplyTimer=window.setTimeout(()=>{o.objectAutoApplyTimer=null,_n(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,u=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`},p=()=>{n&&(n=!1,o.classList.remove("dragging"),window.removeEventListener("pointermove",u),window.removeEventListener("pointerup",p))};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",u),window.addEventListener("pointerup",p)})}function Ni(o,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,s=0,r=0,l=0,c=!1,d=p=>{var y;if(!c)return;let g=p.clientX-r,h=p.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)},u=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",p=>{if(p.button!==0)return;p.preventDefault(),p.stopPropagation();let g=o.getBoundingClientRect();a=g.width,s=g.height,r=p.clientX,l=p.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function Rn(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,u=Math.max(a,i.width-l.width-a),p=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),u),h=Math.min(Math.max(d,a),p);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function gt(o){var i,n;if(!o.container)return;let e=o.container.querySelector("#debug-workbench");if(!e)return;if(Rn(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 Fi(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"),Rn(o,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function On(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",Rn(o,e),gt(o))}function cr(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",()=>Di(o)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>Hi(o)),e.querySelectorAll(".workbench-tab").forEach(r=>{r.addEventListener("click",()=>{let l=r.dataset.tab;o.activeTab=l,zn(o),gt(o)})}),Dn(o,e),$n(o,e)}function zn(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 $n(o,e){Se(o,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),Se(o,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),Se(o,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),Se(o,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),Se(o,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),Se(o,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),Se(o,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),Se(o,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),Se(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=Ye();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=Ye();s.layout&&(s.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function dr(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(()=>{gt(o),On(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(()=>{On(o,i)},10)})),i&&a&&Ni(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),Fi(o)}function Dn(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 Se(o,e,t,i,n){let a=e.querySelector(`#${t}`),s=e.querySelector(n);if(!a||!s)return;let r=ir(Ye(),i);typeof r=="number"&&(a.value=String(r),s.textContent=String(r)),a.addEventListener("input",()=>{let l=Number(a.value);s.textContent=String(l),nr(Ye(),i,l)})}var Bi=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=st(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let u=d.objectId||"Engine";a[u]||(a[u]=[]),a[u].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`
1861
+ 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`
1862
1862
  <div class="config-persistence-panel">
1863
1863
  <!-- Status Footer (Always Visible) -->
1864
1864
  <div class="persistence-status-footer">
@@ -1969,20 +1969,20 @@ Generate the requested asset matching the brand style.${o.needsTransparency?" Ba
1969
1969
  <button class="staging-clear-all" id="clear-all-overrides">Discard All</button>
1970
1970
  </div>
1971
1971
  <div class="staging-list">
1972
- ${Object.entries(a).map(([d,u])=>`
1972
+ ${Object.entries(a).map(([d,p])=>`
1973
1973
  <div class="staging-group">
1974
1974
  <div class="staging-group-title">
1975
1975
  <span class="group-icon">${d==="Engine"?"\u2699\uFE0F":"\u{1F4E6}"}</span>
1976
1976
  <span class="group-id">${d}</span>
1977
1977
  </div>
1978
1978
  <div class="staging-items">
1979
- ${u.map(p=>`
1979
+ ${p.map(u=>`
1980
1980
  <div class="staging-item">
1981
- <div class="item-path">${p.path}</div>
1982
- <div class="item-value" title="${JSON.stringify(p.value)}">
1983
- ${this.formatValue(p.value)}
1981
+ <div class="item-path">${u.path}</div>
1982
+ <div class="item-value" title="${JSON.stringify(u.value)}">
1983
+ ${this.formatValue(u.value)}
1984
1984
  </div>
1985
- <button class="item-remove" data-remove-path="${p.path}" data-remove-id="${p.objectId||""}" title="Discard this change">\xD7</button>
1985
+ <button class="item-remove" data-remove-path="${u.path}" data-remove-id="${u.objectId||""}" title="Discard this change">\xD7</button>
1986
1986
  </div>
1987
1987
  `).join("")}
1988
1988
  </div>
@@ -2022,17 +2022,17 @@ This will delete generated config JSON files in configs/objects that are not ref
2022
2022
 
2023
2023
  It will NOT touch library/base configs.
2024
2024
 
2025
- Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let m=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,f=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${m} configs, ${f} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!st().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
2025
+ Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let m=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,f=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${m} configs, ${f} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!rt().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
2026
2026
 
2027
2027
  This will:
2028
2028
  \u2022 Create a new version snapshot
2029
2029
  \u2022 Include all current changes
2030
2030
  \u2022 Clear staged overrides after save
2031
- \u2022 Set the new version as active`))try{let m=localStorage.getItem("handler_last_version_name")||"",b=((h=prompt("Version name (e.g. v1.2.0, test_2024):",m))!=null?h:"").trim();if(!b){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",b),t.textContent="\u23F3 Creating version...",t.setAttribute("disabled","true"),await Ga(b),Ze(),await this.forceResyncAfterApply(),this.showSuccessNotification("Version created and set as active"),await this.loadVersionsList(),this.refreshPanel()}catch(m){console.error("[ConfigPersistence] Create version failed:",m),alert(`\u274C Failed to create version: ${m.message}`),t.textContent="\u{1F4DD} SAVE AS NEW VERSION",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-current-btn");i==null||i.addEventListener("click",async()=>{if(i.getAttribute("disabled")!==null||window.__handlerApplyCurrentInFlight)return;let p=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
2031
+ \u2022 Set the new version as active`))try{let m=localStorage.getItem("handler_last_version_name")||"",b=((h=prompt("Version name (e.g. v1.2.0, test_2024):",m))!=null?h:"").trim();if(!b){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",b),t.textContent="\u23F3 Creating version...",t.setAttribute("disabled","true"),await Ua(b),Ze(),await this.forceResyncAfterApply(),this.showSuccessNotification("Version created and set as active"),await this.loadVersionsList(),this.refreshPanel()}catch(m){console.error("[ConfigPersistence] Create version failed:",m),alert(`\u274C Failed to create version: ${m.message}`),t.textContent="\u{1F4DD} SAVE AS NEW VERSION",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-current-btn");i==null||i.addEventListener("click",async()=>{if(i.getAttribute("disabled")!==null||window.__handlerApplyCurrentInFlight)return;let u=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
2032
2032
 
2033
- This will write all staged changes to ${p}.
2033
+ This will write all staged changes to ${u}.
2034
2034
 
2035
- After applying, staged overrides will be cleared.`))try{window.__handlerApplyCurrentInFlight=!0,i.textContent="\u23F3 Applying...",i.setAttribute("disabled","true");let h=Jt(),m={};for(let[y,w]of Object.entries(h.objects)){let v=w,k=y;/^(json\.|ui\.|effects\.|engine\.)/.test(k)||(k=`json.${y}`),v&&typeof v=="object"&&(v.identity||(v.identity={}),v.identity.id=k),m[`objects/${k}.json`]=v}h.engine&&(h.engine.runtime&&(m["engine/engine.runtime.json"]=h.engine.runtime),h.engine.assets&&(m["engine/engine.assets.json"]=h.engine.assets),h.engine.splash&&(m["engine/engine.splash.json"]=h.engine.splash),h.engine.loading&&(m["engine/engine.loading.json"]=h.engine.loading),h.engine.start&&(m["engine/engine.start.json"]=h.engine.start),h.engine.tutorial&&(m["engine/engine.tutorial.json"]=h.engine.tutorial),h.engine.endgame&&(m["engine/engine.endgame.json"]=h.engine.endgame),!h.engine.runtime&&!h.engine.assets&&(m["engine/engine.json"]=h.engine));for(let[y,w]of Object.entries(h.scenes)){let v=y.startsWith("scene.")?y:`scene.${y}`;m[`scenes/${v}.json`]=w}let f=this.currentVersion?"/api/apply-current":"/api/apply-direct",b=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:m,assets:{},hadCacheAtApply:!0})});if(!b.ok){let y=await b.json();throw new Error(y.error||"Apply to current source failed")}Ze();try{let y=window.__editableConfig;y&&(window.__editableConfigBaseline=Tt(y))}catch{}this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(h){console.error("[ConfigPersistence] Apply current failed:",h),alert(`\u274C Apply to current source failed: ${h.message}`),i.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",i.removeAttribute("disabled")}finally{window.__handlerApplyCurrentInFlight=!1}});let n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
2035
+ After applying, staged overrides will be cleared.`))try{window.__handlerApplyCurrentInFlight=!0,i.textContent="\u23F3 Applying...",i.setAttribute("disabled","true");let h=Zt(),m={};for(let[y,w]of Object.entries(h.objects)){let v=w,T=y;/^(json\.|ui\.|effects\.|engine\.)/.test(T)||(T=`json.${y}`),v&&typeof v=="object"&&(v.identity||(v.identity={}),v.identity.id=T),m[`objects/${T}.json`]=v}h.engine&&(h.engine.runtime&&(m["engine/engine.runtime.json"]=h.engine.runtime),h.engine.assets&&(m["engine/engine.assets.json"]=h.engine.assets),h.engine.splash&&(m["engine/engine.splash.json"]=h.engine.splash),h.engine.loading&&(m["engine/engine.loading.json"]=h.engine.loading),h.engine.start&&(m["engine/engine.start.json"]=h.engine.start),h.engine.tutorial&&(m["engine/engine.tutorial.json"]=h.engine.tutorial),h.engine.endgame&&(m["engine/engine.endgame.json"]=h.engine.endgame),!h.engine.runtime&&!h.engine.assets&&(m["engine/engine.json"]=h.engine));for(let[y,w]of Object.entries(h.scenes)){let v=y.startsWith("scene.")?y:`scene.${y}`;m[`scenes/${v}.json`]=w}let f=this.currentVersion?"/api/apply-current":"/api/apply-direct",b=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:m,assets:{},hadCacheAtApply:!0})});if(!b.ok){let y=await b.json();throw new Error(y.error||"Apply to current source failed")}Ze();try{let y=window.__editableConfig;y&&(window.__editableConfigBaseline=st(y))}catch{}this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(h){console.error("[ConfigPersistence] Apply current failed:",h),alert(`\u274C Apply to current source failed: ${h.message}`),i.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",i.removeAttribute("disabled")}finally{window.__handlerApplyCurrentInFlight=!1}});let n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
2036
2036
 
2037
2037
  This will DIRECTLY MODIFY base configuration files.
2038
2038
 
@@ -2042,13 +2042,13 @@ This is ONLY for active development.
2042
2042
 
2043
2043
  Make sure your project is under Git version control.
2044
2044
 
2045
- Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Jt(),h={};for(let[f,b]of Object.entries(g.objects)){let y=b,w=f;/^(json\.|ui\.|effects\.|engine\.)/.test(w)||(w=`json.${f}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=w),h[`objects/${w}.json`]=y}g.engine&&(g.engine.runtime&&(h["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(h["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(h["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(h["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(h["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(h["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(h["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(h["engine/engine.json"]=g.engine));for(let[f,b]of Object.entries(g.scenes)){let y=f.startsWith("scene.")?f:`scene.${f}`;h[`scenes/${y}.json`]=b}let m=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{}})});if(!m.ok){let f=await m.json();throw new Error(f.error||"Apply to base failed")}Ze(),this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async p=>{let h=p.target.value;await this.switchVersion(h)}),this.container.querySelectorAll(".item-remove").forEach(p=>{p.addEventListener("click",()=>{let g=p.dataset.removePath,h=p.dataset.removeId;Na(h||void 0,g)})});let r=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(Ze(),sn(),this.refreshPanel())};r==null||r.addEventListener("click",c),l==null||l.addEventListener("click",c);let d=this.container.querySelector("#reset-to-applied-btn");d==null||d.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&sn()});let u=this.container.querySelector("#reset-to-original-btn");u==null||u.addEventListener("click",async()=>{await Ua()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
2045
+ Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Zt(),h={};for(let[f,b]of Object.entries(g.objects)){let y=b,w=f;/^(json\.|ui\.|effects\.|engine\.)/.test(w)||(w=`json.${f}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=w),h[`objects/${w}.json`]=y}g.engine&&(g.engine.runtime&&(h["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(h["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(h["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(h["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(h["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(h["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(h["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(h["engine/engine.json"]=g.engine));for(let[f,b]of Object.entries(g.scenes)){let y=f.startsWith("scene.")?f:`scene.${f}`;h[`scenes/${y}.json`]=b}let m=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{}})});if(!m.ok){let f=await m.json();throw new Error(f.error||"Apply to base failed")}Ze();try{let f=window.__editableConfig;f&&(window.__editableConfigBaseline=st(f))}catch{}this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async u=>{let h=u.target.value;await this.switchVersion(h)}),this.container.querySelectorAll(".item-remove").forEach(u=>{u.addEventListener("click",()=>{let g=u.dataset.removePath,h=u.dataset.removeId;Fa(h||void 0,g)})});let r=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(Ze(),on(),this.refreshPanel())};r==null||r.addEventListener("click",c),l==null||l.addEventListener("click",c);let d=this.container.querySelector("#reset-to-applied-btn");d==null||d.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&on()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await qa()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
2046
2046
  <div class="notify-icon">\u2705</div>
2047
2047
  <div class="notify-content">
2048
2048
  <strong>${i}</strong>
2049
2049
  <span>Project files updated.</span>
2050
2050
  </div>
2051
- `,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,s;let t=st();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
2051
+ `,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,s;let t=rt();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
2052
2052
 
2053
2053
  You have ${t.overrideCount} staged changes that will be discarded.
2054
2054
 
@@ -2060,7 +2060,7 @@ This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snaps
2060
2060
 
2061
2061
  This cannot be undone unless you have git commits or backups.
2062
2062
 
2063
- Are you absolutely sure?`))try{let t=Jt(),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 Gi=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 ai;this.sceneToolsPanel=new si;this.nudgePanel=new ri;this.inspectorPanel=new ki;this.libraryPanel=new Mt;this.libraryPanelDocked=new Mt;this.brandVisionPanel=new ji;this.customizeSettingsPanel=new _i;this.configPersistencePanel=new Bi;this.loadingScreenPanel=new Ri}applyAssetChange(e,t){return Bs(this,e,t)}resetAsset(e){return Gs(this,e)}applySlotAsset(e,t,i){return Ii(this,e,t,i)}resetSlotAsset(e,t,i){return Us(this,e,t,i)}startObjectVisuals(){return er(this)}stopObjectVisuals(){return tr(this)}shouldRunObjectVisuals(){return Oi(this)}updateObjectVisuals(){return zi(this)}getSelectedInstanceId(){return Sn(this)}getDisplayObjectById(e){return En(this,e)}getSelectedObjectConfig(){return zt(this)}getConfigAnchorWorldPoint(e){return An(this,e)}getScreenSize(){return Cn(this)}ensureBoundsGfx(){return Ln(this)}ensureAnchorGfx(){return kn(this)}drawBounds(e){return Tn(this,e)}drawAnchor(e){return Pn(this,e)}clearBounds(){return In(this)}clearAnchor(){return Mn(this)}clearObjectVisuals(){return Ot(this)}updateObjectInfo(e){return Rt(this,e)}resetDebugConfig(){return Di(this)}applyDebugConfig(){return ar(this)}exportDebugConfig(){return Hi(this)}loadObjectConfig(e){return sr(this,e)}fillConfigViewer(e){return $i(this,e)}copyConfigValues(){return rr(this)}applyObjectConfig(e){return _n(this,e)}applyCustomizeSettings(e,t){return or(this,e,t)}scheduleObjectAutoApply(){return lr(this)}setupDebugEventListeners(){return cr(this)}setupDebugInputListeners(e){return $n(this,e)}setupPanelLayout(){return dr(this)}setupCollapsiblePanels(e){return Dn(this,e)}setupRangeInput(e,t,i,n){return Se(this,e,t,i,n)}updateWorkbenchTabs(){return zn(this)}saveWorkbenchState(){return gt(this)}loadWorkbenchState(){return Fi(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 p,g,h;if(!this.selectedObjectId)return;let r=this.getSelectedObjectConfig();if(!r)return;let l=(p=r.transform)==null?void 0:p.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:u}=await import("./ConfigOverride-2HOZGV6G.js");u({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,u;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let r=(u=(d=s.transform)==null?void 0:d.scale)!=null?u:1,l=Math.max(.1,r+a),{applyConfigOverride:c}=await import("./ConfigOverride-2HOZGV6G.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`
2063
+ 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`
2064
2064
  <div class="debug-overlay hidden" id="debug-overlay">
2065
2065
  <div class="debug-workbench" id="debug-workbench">
2066
2066
  <div class="workbench-header" id="workbench-handle">
@@ -2107,7 +2107,7 @@ Are you absolutely sure?`))try{let t=Jt(),i={};for(let[a,s]of Object.entries(t.o
2107
2107
  ${this.sceneToolsPanel.render()}
2108
2108
  ${this.nudgePanel.render()}
2109
2109
  </div>
2110
- `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var r,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let u=this.container.querySelector("#config-pos-x"),p=this.container.querySelector("#config-pos-y");if(u&&p){let g=Number((r=u.value)!=null?r:0),h=Number((l=p.value)!=null?l:0),m=g+e*n,f=h+t*n;u.value=String(m),p.value=String(f),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let s=new Le;for(let u of i){let p=a(u);if(!p)continue;let g=((d=p.transform)==null?void 0:d.position)||[0,0],h=Array.isArray(g)?g[0]:g.x||0,m=Array.isArray(g)?g[1]:g.y||0,f=h+e*n,b=m+t*n;await s.updateProperty(u,"transform.position",[f,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function Mo(o){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(o)})}function jo(o){var n;let[e,t]=o.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function _o(o){return`
2110
+ `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var r,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let p=this.container.querySelector("#config-pos-x"),u=this.container.querySelector("#config-pos-y");if(p&&u){let g=Number((r=p.value)!=null?r:0),h=Number((l=u.value)!=null?l:0),m=g+e*n,f=h+t*n;p.value=String(m),u.value=String(f),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let s=new Pe;for(let p of i){let u=a(p);if(!u)continue;let g=((d=u.transform)==null?void 0:d.position)||[0,0],h=Array.isArray(g)?g[0]:g.x||0,m=Array.isArray(g)?g[1]:g.y||0,f=h+e*n,b=m+t*n;await s.updateProperty(p,"transform.position",[f,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function Mo(o){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(o)})}function jo(o){var n;let[e,t]=o.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function _o(o){return`
2111
2111
  Analyze these screenshots of a brand or game and extract its "Brand DNA".
2112
2112
 
2113
2113
  Provide a concise summary (2-3 sentences) covering:
@@ -2124,9 +2124,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
2124
2124
  ${o?`
2125
2125
  ADDITIONAL RULES/NOTES:
2126
2126
  ${o}`:""}
2127
- `.trim()}function pr(){let o=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let s=await Mo(a),r=jo(s),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:r.base64,mimeType:r.mimeType,dataUrl:s};o.push(l),n.push(l)}return n},getSources(){return o.slice()},async analyze(i,n,a){if(o.length===0)throw new Error("No screenshots to analyze.");let s=_o(n),r=o.map(p=>({base64:p.base64,mimeType:p.mimeType})),l=await Pi(i,s,r,{model:a}),c=e,d=[],u=l.split(`
2128
- `);for(let p of u)if(p.toLowerCase().startsWith("summary:"))c=p.slice(8).trim();else if(p.toLowerCase().includes("palette:")){let g=p.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(h=>{d.includes(h.toUpperCase())||d.push(h.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
2129
- Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var tt="handler_api_key_";var ht=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${tt}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${tt}${e}`,i=localStorage.getItem(t);if(!i)return null;let n=JSON.parse(i);return n.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(n)),this.decryptKey(n.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${tt}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${tt}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);if(i&&i.startsWith(tt)){let n=i.substring(tt.length),a=localStorage.getItem(i);if(a){let s=JSON.parse(a);e.push({service:n,label:s.label,created:s.created,lastUsed:s.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(tt)&&e.push(i)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let i="handler_preview_salt_2024"+e;return btoa(i)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),i="handler_preview_salt_2024";return t.startsWith(i)?t.substring(i.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},Hn=()=>ht.getKey("gemini"),Nn=(o,e)=>ht.setKey("gemini",o,e),Ro=()=>ht.hasKey("gemini");window.ApiKeyStorage=ht;window.getGeminiApiKey=Hn;window.setGeminiApiKey=Nn;window.hasGeminiApiKey=Ro;var Bn=class{constructor(){this.modal=null;this.options=null;this.analyzer=pr();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.savedLibraryPaths=new Map;this.promptInput=null;this.generateBtn=null;this.saveLibraryBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null;this.statusEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.savedLibraryPaths.clear(),this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
2127
+ `.trim()}function ur(){let o=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let s=await Mo(a),r=jo(s),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:r.base64,mimeType:r.mimeType,dataUrl:s};o.push(l),n.push(l)}return n},getSources(){return o.slice()},async analyze(i,n,a){if(o.length===0)throw new Error("No screenshots to analyze.");let s=_o(n),r=o.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await Ii(i,s,r,{model:a}),c=e,d=[],p=l.split(`
2128
+ `);for(let u of p)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let g=u.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(h=>{d.includes(h.toUpperCase())||d.push(h.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
2129
+ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var tt="handler_api_key_";var mt=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${tt}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${tt}${e}`,i=localStorage.getItem(t);if(!i)return null;let n=JSON.parse(i);return n.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(n)),this.decryptKey(n.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${tt}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${tt}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);if(i&&i.startsWith(tt)){let n=i.substring(tt.length),a=localStorage.getItem(i);if(a){let s=JSON.parse(a);e.push({service:n,label:s.label,created:s.created,lastUsed:s.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(tt)&&e.push(i)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let i="handler_preview_salt_2024"+e;return btoa(i)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),i="handler_preview_salt_2024";return t.startsWith(i)?t.substring(i.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},Fn=()=>mt.getKey("gemini"),Bn=(o,e)=>mt.setKey("gemini",o,e),Ro=()=>mt.hasKey("gemini");window.ApiKeyStorage=mt;window.getGeminiApiKey=Fn;window.setGeminiApiKey=Bn;window.hasGeminiApiKey=Ro;var Un=class{constructor(){this.modal=null;this.options=null;this.analyzer=ur();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.savedLibraryPaths=new Map;this.promptInput=null;this.generateBtn=null;this.saveLibraryBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null;this.statusEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.savedLibraryPaths.clear(),this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
2130
2130
  <style>
2131
2131
  .ai-gallery-item {
2132
2132
  position: relative;
@@ -2226,13 +2226,13 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0
2226
2226
  </div>
2227
2227
  `,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.saveLibraryBtn=this.modal.querySelector('[data-action="save-library"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),this.statusEl=this.modal.querySelector("[data-status]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var n;this.currentPrompt=((n=this.promptInput)==null?void 0:n.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",n=>{var r;let a=n.target;switch(a.dataset.action||((r=a.closest("[data-action]"))==null?void 0:r.getAttribute("data-action"))){case"generate":this.generateImage();break;case"save-library":this.saveSelectedImageToLibrary();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",n=>{let a=n.target;if(a.classList.contains("ai-gallery-item")||a.closest(".ai-gallery-item")){let s=a.closest(".ai-gallery-item"),r=parseInt(s.dataset.index||"-1");r>=0&&this.selectImage(r)}}),this.updateGenerateButton(),this.setStatus("Ready. Generate an image to get started.")}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var t;let e=(t=this.modal)==null?void 0:t.querySelector("#ai-use-dna");if(e!=null&&e.checked)try{let i=this.analyzer.getResult();if(i!=null&&i.summary&&this.promptInput){let n=`${this.currentPrompt}
2228
2228
 
2229
- Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let a=this.getApiKey();if(!a){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let s=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await Ti(this.options.currentValue);c&&(s=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let r=await ut(a,this.currentPrompt,s,{aspectRatio:"1:1"}),l=await pt(r);this.generatedImages.push(l||r),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(a){console.error("[AiEditorModal] Generation failed:",a),alert(`Generation failed: ${a instanceof Error?a.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(n=this.previewEl)==null||n.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,i)=>{let n=this.savedLibraryPaths.has(i),a=n?this.savedLibraryPaths.get(i):null,s=a?a.split("/").pop():"";return`
2229
+ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let a=this.getApiKey();if(!a){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let s=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await Pi(this.options.currentValue);c&&(s=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let r=await gt(a,this.currentPrompt,s,{aspectRatio:"1:1"}),l=await ut(r);this.generatedImages.push(l||r),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(a){console.error("[AiEditorModal] Generation failed:",a),alert(`Generation failed: ${a instanceof Error?a.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(n=this.previewEl)==null||n.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,i)=>{let n=this.savedLibraryPaths.has(i),a=n?this.savedLibraryPaths.get(i):null,s=a?a.split("/").pop():"";return`
2230
2230
  <div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
2231
2231
  <img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
2232
2232
  <div class="ai-gallery-label">#${i+1}${n?" \u2713":""}</div>
2233
2233
  ${n?`<div class="ai-gallery-saved" title="Saved: ${s}">\u{1F4BE}</div>`:""}
2234
2234
  </div>
2235
- `}).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var i,n;let e=(i=this.modal)==null?void 0:i.querySelector('[data-action="apply"]'),t=(n=this.modal)==null?void 0:n.querySelector('[data-action="save-library"]');e&&(e.disabled=this.selectedImageIndex<0),t&&(t.disabled=this.selectedImageIndex<0)}setStatus(e,t=!1){this.statusEl&&(this.statusEl.textContent=e,this.statusEl.style.color=t?"#ff4444":"#888")}async saveSelectedImageToLibrary(){var r;if(this.selectedImageIndex<0){this.setStatus("No image selected.",!0);return}let e=this.generatedImages[this.selectedImageIndex];if(!e){this.setStatus("Invalid image data.",!0);return}if(this.savedLibraryPaths.has(this.selectedImageIndex)){let l=this.savedLibraryPaths.get(this.selectedImageIndex);this.setStatus(`Already saved: ${l}`);return}let t=e;if(!t.startsWith("data:image/")){this.setStatus("Invalid image format.",!0);return}t=t.trim().replace(/\s/g,"");let i=((r=this.options)==null?void 0:r.objectId)||"asset",a=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_${Date.now()}.png`,s=this.inferCategoryFromObjectId(i);this.setStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:s,filename:a,data:t,overwrite:!0})})).json();if(c.success){console.log("[AiEditorModal] \u2705 Saved to library:",c.path),this.savedLibraryPaths.set(this.selectedImageIndex,c.path),this.setStatus(`\u2705 Saved: ${a}`);let d=window.addAssetToRegistry;typeof d=="function"&&d(s,a);let u=window.getEditableAssets;if(typeof u=="function"){let h=u();h&&!h.categories&&(h.categories=[]),h!=null&&h.categories&&!h.categories.includes(s)&&(h.categories.push(s),console.log(`[AiEditorModal] Added category ${s} to registry`))}await new Promise(h=>setTimeout(h,100));try{(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[AiEditorModal] \u2705 Registry rebuilt from disk"):console.warn("[AiEditorModal] Setup-library returned non-OK status")}catch(h){console.warn("[AiEditorModal] Setup-library not available:",h)}await new Promise(h=>setTimeout(h,200));let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[AiEditorModal] Refreshing library panel..."),await p());let g=window.reRenderAssetLibrary;typeof g=="function"&&(console.log("[AiEditorModal] Re-rendering library panel..."),g()),setTimeout(()=>{try{let h=window.__screenManager;h&&typeof h.refreshTextures=="function"&&(console.log("[AiEditorModal] Refreshing game textures via screen manager..."),h.refreshTextures()),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),console.log("[AiEditorModal] Dispatched config:changed event")}catch(h){console.warn("[AiEditorModal] Failed to refresh textures:",h)}},300),this.updateGallery()}else console.error("[AiEditorModal] \u274C Save failed:",c.error),this.setStatus(`Save failed: ${c.error}`,!0)}catch(l){console.error("[AiEditorModal] \u274C Save error:",l),this.setStatus("Save failed. Check console.",!0)}}inferCategoryFromObjectId(e){let t=e.toLowerCase();return t.includes("background")?"backgrounds":t.includes("character")?"characters":t.includes("key")?"collectedkeys":t.includes("draggable")?"draggables":t.includes("environment")||t.includes("env")||t.includes("hand")||t.includes("prop")||t.includes("item")?"environment":t.includes("machine")?"machines":t.includes("tutorial")?"tutorial":t.includes("ui")||t.includes("button")||t.includes("label")||t.includes("icon")||t.includes("logo")?"ui":t.includes("effect")||t.includes("confetti")||t.includes("particle")?"effects":"ui"}async applySelectedImage(){var i;if(this.selectedImageIndex<0||!((i=this.options)!=null&&i.onApply))return;let t=this.generatedImages[this.selectedImageIndex];this.savedLibraryPaths.has(this.selectedImageIndex)?(t=this.savedLibraryPaths.get(this.selectedImageIndex),this.setStatus("Applying saved image...")):(this.setStatus("Saving to library before applying..."),await this.saveSelectedImageToLibrary(),this.savedLibraryPaths.has(this.selectedImageIndex)?(t=this.savedLibraryPaths.get(this.selectedImageIndex),this.setStatus("\u2705 Saved and applying...")):this.setStatus("Failed to save. Applying data URL instead.",!0)),this.options.onApply(t),setTimeout(()=>{this.close()},500)}getApiKey(){let e=Hn();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return Nn(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},Fn=null;window.__openAiEditor=function(o,e,t,i){Fn||(Fn=new Bn),Fn.open({objectId:o,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let a=window.updateManager;if(a)a.updateProperty(o,i.path,n);else{let s=window.getEditableObjectConfig,r=s==null?void 0:s(o);if(r){let l=i.path.split("."),c=r;for(let d=0;d<l.length-1;d++)c[l[d]]||(c[l[d]]={}),c=c[l[d]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var Gn=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
2235
+ `}).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var i,n;let e=(i=this.modal)==null?void 0:i.querySelector('[data-action="apply"]'),t=(n=this.modal)==null?void 0:n.querySelector('[data-action="save-library"]');e&&(e.disabled=this.selectedImageIndex<0),t&&(t.disabled=this.selectedImageIndex<0)}setStatus(e,t=!1){this.statusEl&&(this.statusEl.textContent=e,this.statusEl.style.color=t?"#ff4444":"#888")}async saveSelectedImageToLibrary(){var r;if(this.selectedImageIndex<0){this.setStatus("No image selected.",!0);return}let e=this.generatedImages[this.selectedImageIndex];if(!e){this.setStatus("Invalid image data.",!0);return}if(this.savedLibraryPaths.has(this.selectedImageIndex)){let l=this.savedLibraryPaths.get(this.selectedImageIndex);this.setStatus(`Already saved: ${l}`);return}let t=e;if(!t.startsWith("data:image/")){this.setStatus("Invalid image format.",!0);return}t=t.trim().replace(/\s/g,"");let i=((r=this.options)==null?void 0:r.objectId)||"asset",a=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_${Date.now()}.png`,s=this.inferCategoryFromObjectId(i);this.setStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:s,filename:a,data:t,overwrite:!0})})).json();if(c.success){console.log("[AiEditorModal] \u2705 Saved to library:",c.path),this.savedLibraryPaths.set(this.selectedImageIndex,c.path),this.setStatus(`\u2705 Saved: ${a}`);let d=window.addAssetToRegistry;typeof d=="function"&&d(s,a);let p=window.getEditableAssets;if(typeof p=="function"){let h=p();h&&!h.categories&&(h.categories=[]),h!=null&&h.categories&&!h.categories.includes(s)&&(h.categories.push(s),console.log(`[AiEditorModal] Added category ${s} to registry`))}await new Promise(h=>setTimeout(h,100));try{(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[AiEditorModal] \u2705 Registry rebuilt from disk"):console.warn("[AiEditorModal] Setup-library returned non-OK status")}catch(h){console.warn("[AiEditorModal] Setup-library not available:",h)}await new Promise(h=>setTimeout(h,200));let u=window.refreshAssetLibrary;typeof u=="function"&&(console.log("[AiEditorModal] Refreshing library panel..."),await u());let g=window.reRenderAssetLibrary;typeof g=="function"&&(console.log("[AiEditorModal] Re-rendering library panel..."),g()),setTimeout(()=>{try{let h=window.__screenManager;h&&typeof h.refreshTextures=="function"&&(console.log("[AiEditorModal] Refreshing game textures via screen manager..."),h.refreshTextures()),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}})),console.log("[AiEditorModal] Dispatched config:changed event")}catch(h){console.warn("[AiEditorModal] Failed to refresh textures:",h)}},300),this.updateGallery()}else console.error("[AiEditorModal] \u274C Save failed:",c.error),this.setStatus(`Save failed: ${c.error}`,!0)}catch(l){console.error("[AiEditorModal] \u274C Save error:",l),this.setStatus("Save failed. Check console.",!0)}}inferCategoryFromObjectId(e){let t=e.toLowerCase();return t.includes("background")?"backgrounds":t.includes("character")?"characters":t.includes("key")?"collectedkeys":t.includes("draggable")?"draggables":t.includes("environment")||t.includes("env")||t.includes("hand")||t.includes("prop")||t.includes("item")?"environment":t.includes("machine")?"machines":t.includes("tutorial")?"tutorial":t.includes("ui")||t.includes("button")||t.includes("label")||t.includes("icon")||t.includes("logo")?"ui":t.includes("effect")||t.includes("confetti")||t.includes("particle")?"effects":"ui"}async applySelectedImage(){var i;if(this.selectedImageIndex<0||!((i=this.options)!=null&&i.onApply))return;let t=this.generatedImages[this.selectedImageIndex];this.savedLibraryPaths.has(this.selectedImageIndex)?(t=this.savedLibraryPaths.get(this.selectedImageIndex),this.setStatus("Applying saved image...")):(this.setStatus("Saving to library before applying..."),await this.saveSelectedImageToLibrary(),this.savedLibraryPaths.has(this.selectedImageIndex)?(t=this.savedLibraryPaths.get(this.selectedImageIndex),this.setStatus("\u2705 Saved and applying...")):this.setStatus("Failed to save. Applying data URL instead.",!0)),this.options.onApply(t),setTimeout(()=>{this.close()},500)}getApiKey(){let e=Fn();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return Bn(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},Gn=null;window.__openAiEditor=function(o,e,t,i){Gn||(Gn=new Un),Gn.open({objectId:o,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let a=window.updateManager;if(a)a.updateProperty(o,i.path,n);else{let s=window.getEditableObjectConfig,r=s==null?void 0:s(o);if(r){let l=i.path.split("."),c=r;for(let d=0;d<l.length-1;d++)c[l[d]]||(c[l[d]]={}),c=c[l[d]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var qn=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
2236
2236
  <div class="asset-preview-card">
2237
2237
  <div class="asset-preview-header">
2238
2238
  <div class="asset-preview-title">${n}</div>
@@ -2259,7 +2259,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2259
2259
  <source src="${n}" type="audio/wav">
2260
2260
  Your browser does not support the audio element.
2261
2261
  </audio>
2262
- `;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 Gn().open(o)};import{Application as Do,Container as He,Graphics as de,Point as U,Rectangle as gr,Text as Ho,TextStyle as No}from"pixi.js";import{Sprite as Oo,Container as ur}from"pixi.js";var zo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Un=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&&(Un=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${Un}`))}}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 Te=class{static async create(e,t,i){var l,c,d,u,p,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${Un}`);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 ur;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 tn.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:",(u=r==null?void 0:r.constructor)==null?void 0:u.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:",(p=s==null?void 0:s.constructor)==null?void 0:p.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof ur)){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 Ui=class{constructor(e){this.app=null;this.camera=new He;this.bgContainer=new He;this.mainContainer=new He;this.uiContainer=new He;this.gizmoLayer=new He;this.screenFrame=new de;this.gameFrame=new de;this.gridLayer=new de;this.spawnPointLayer=new He;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 de;this.anchorVisualizationLayer=new de;this.moveHandle=new de;this.scaleHandle=new de;this.rotateHandle=new de;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 de;this.lastPickPoint=null;this.lastPickIds=[];this.lastPickIndex=0;this.lastPickTime=0;this.playModeEnabled=!0;this.playModeInitialized=!1;this.layoutScale=1;this.updateManager=new Le;this.backgroundCoverEnabled=!0;this.backgroundLocked=!0;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,u=l-this.lastPickTime<1200,p=c&&d&&u?(this.lastPickIndex+1)%a.length:0,g=a[p];this.lastPickIds=a,this.lastPickIndex=p,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),Re({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 u of this.selectedIds){if(u===this.selectedId)continue;let p=this.objectMap.get(u);p!=null&&p.displayObject&&this.multiDragStartPositions.set(u,new U(p.displayObject.position.x,p.displayObject.position.y))}}for(let u of this.selectedIds){if(u===this.selectedId)continue;let p=this.objectMap.get(u);if(!(p!=null&&p.displayObject))continue;let g=this.multiDragStartPositions.get(u);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}p.displayObject.position.set(h,m),this.updateLiveConfigPositionForObject(u,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 de,this.selectionBox.zIndex=99999,this.selectionBox.eventMode="none",this.gizmoLayer.addChild(this.selectionBox),this.dropZoneOverlay=new de,this.dropZoneOverlay.zIndex=99998,this.dropZoneOverlay.eventMode="none",this.gizmoLayer.addChild(this.dropZoneOverlay),this.alignmentGuideLayer=new de,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}`,u=JSON.parse(JSON.stringify(l));if(u.identity.id=d,u.instance_id=c,u.object_config=d,(a=u.transform)!=null&&a.position){let h=u.transform.position,m=Array.isArray(h)?h[0]:h.x||0,f=Array.isArray(h)?h[1]:h.y||0;Array.isArray(h)?u.transform.position=[m+20,f+20]:u.transform.position={x:m+20,y:f+20}}let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:c,objectConfigId:d,config:u,layer:((s=u.identity)==null?void 0:s.category)==="ui"?"ui":"world"})}),g=await p.json();p.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,u,p,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=(u=(d=i.displayObject).getBounds)==null?void 0:u.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=(p=m.displayObject).getBounds)==null?void 0:g.call(p);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 A=Math.min(a.y,b.y),x=Math.max(s.y,y.y);this.alignmentGuideLayer.moveTo(w,A),this.alignmentGuideLayer.lineTo(w,x),this.alignmentGuideLayer.stroke({width:1,color:3900150,alpha:.6})}if(Math.abs(l-v)<c){let A=Math.min(a.x,b.x),x=Math.max(s.x,y.x);this.alignmentGuideLayer.moveTo(A,v),this.alignmentGuideLayer.lineTo(x,v),this.alignmentGuideLayer.stroke({width:1,color:3900150,alpha:.6})}let k=a.x,M=s.x,_=a.y,T=s.y,j=b.x,P=y.x,L=b.y,E=y.y;if(Math.abs(k-j)<c||Math.abs(k-P)<c||Math.abs(M-j)<c||Math.abs(M-P)<c){let A=Math.abs(k-j)<c?j:Math.abs(k-P)<c?P:Math.abs(M-j)<c?j:P,x=Math.min(_,L),S=Math.max(T,E);this.alignmentGuideLayer.moveTo(A,x),this.alignmentGuideLayer.lineTo(A,S),this.alignmentGuideLayer.stroke({width:1,color:1096065,alpha:.5})}if(Math.abs(_-L)<c||Math.abs(_-E)<c||Math.abs(T-L)<c||Math.abs(T-E)<c){let A=Math.abs(_-L)<c?L:Math.abs(_-E)<c?E:Math.abs(T-L)<c?L:E,x=Math.min(k,j),S=Math.max(M,P);this.alignmentGuideLayer.moveTo(x,A),this.alignmentGuideLayer.lineTo(S,A),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 P,L,E,A,x,S;if(t==null||i==null||t===i)return;let n=this.getEditableObjectConfig(e);if(!n)return;let a=(P=n.transform)!=null?P:{};if(a.position_ratio!=null)return;let s=(L=this.getRuntimeScreenSize())!=null?L: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,u=r.displayObject.position.y,p=we(s.width,s.height,t),g=we(s.width,s.height,i),h=p.x,m=p.y,f=g.x,b=g.y;l||(h=(p.x-s.width/2)/c,m=(p.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:u-m},w={x:d-f,y:u-b},v=a.offset,k=Array.isArray(v)?Number((E=v[0])!=null?E:0):Number((A=v==null?void 0:v.x)!=null?A:0),M=Array.isArray(v)?Number((x=v[1])!=null?x:0):Number((S=v==null?void 0:v.y)!=null?S:0),_=w.x-k,T=w.y-M,j=this.buildPositionValue(a,{x:_,y:T});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,u=typeof(l==null?void 0:l.getChildIndex)=="function"?l.getChildIndex(s):0,p=c*1e6+d*1e3+u;t.push({id:n,order:p})}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,u;let e=window.gameApp;if(e!=null&&e.renderer){let p=e.renderer.screen,g=Number((a=p==null?void 0:p.width)!=null?a:0),h=Number((s=p==null?void 0:p.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((u=t==null?void 0:t.dataset)==null?void 0:u.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,u,p,g,h,m,f,b,y,w,v,k,M,_,T,j,P,L,E,A,x,S,C,R,I,O,z,$,q;let e=window.__screenManager;if(e){let B=["gameplay","start","tutorial","endgame","loading"];for(let F of B){let D=(a=e.get)==null?void 0:a.call(e,F);if(D!=null&&D.visible){let G=(s=D.getContentLayer)==null?void 0:s.call(D);if(G){let W=(r=D.x)!=null?r:0,K=(l=D.y)!=null?l:0,N=(c=G.x)!=null?c:0,te=(d=G.y)!=null?d:0,J=(p=(u=G.scale)==null?void 0:u.x)!=null?p:1,Z=(h=(g=G.scale)==null?void 0:g.y)!=null?h:J;return console.log("[SceneEditor] getRuntimeLayoutReference: using visible screen contentLayer",{screenId:F,contentLayerScale:{x:J,y:Z},position:{x:W+N,y:K+te}}),{scale:{x:J,y:Z},position:{x:W+N,y:K+te},pivot:G.pivot?{x:G.pivot.x,y:G.pivot.y}:void 0}}}}for(let F of B){let D=(m=e.get)==null?void 0:m.call(e,F);if(D){if(!D.visible&&typeof D.updateLayout=="function"){let W=window.gameApp;if((f=W==null?void 0:W.renderer)!=null&&f.screen){let K=W.renderer.screen.width,N=W.renderer.screen.height;K>0&&N>0&&D.updateLayout(K,N)}}let G=(b=D.getContentLayer)==null?void 0:b.call(D);if(G){let W=(y=D.x)!=null?y:0,K=(w=D.y)!=null?w:0,N=(v=G.x)!=null?v:0,te=(k=G.y)!=null?k:0,J=(_=(M=G.scale)==null?void 0:M.x)!=null?_:1,Z=(j=(T=G.scale)==null?void 0:T.y)!=null?j:J;return console.log("[SceneEditor] getRuntimeLayoutReference: using any screen contentLayer",{screenId:F,visible:D.visible,contentLayerScale:{x:J,y:Z},position:{x:W+N,y:K+te}}),{scale:{x:J,y:Z},position:{x:W+N,y:K+te},pivot:G.pivot?{x:G.pivot.x,y:G.pivot.y}:void 0}}}}}let t=window.__mainContainer;if(t){let B=(L=(P=t.scale)==null?void 0:P.x)!=null?L:1,F=(A=(E=t.scale)==null?void 0:E.y)!=null?A:B;return console.log("[SceneEditor] getRuntimeLayoutReference: using __mainContainer",{scale:{x:B,y:F},position:{x:(x=t.position)==null?void 0:x.x,y:(S=t.position)==null?void 0:S.y}}),t}let i=window.gameApp,n=(C=i==null?void 0:i.stage)!=null?C:null;if(n){let B=(I=(R=n.scale)==null?void 0:R.x)!=null?I:1,F=(z=(O=n.scale)==null?void 0:O.y)!=null?z:B;console.log("[SceneEditor] getRuntimeLayoutReference: using gameApp.stage (fallback)",{scale:{x:B,y:F},position:{x:($=n.position)==null?void 0:$.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,u,p,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=(p=(u=f.getBgLayer)==null?void 0:u.call(f))!=null?p: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,u,p,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)&&((u=this.uiContainer.pivot)!=null&&u.set)){let f=Number((g=(p=e.pivot)==null?void 0:p.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 u=await this.createDisplayObject(e,t);if(!u)return;c.addChild(u),this.objectMap.set(e,{id:e,displayObject:u,assetKey:i,isUi:a}),this.attachObjectInteraction(u,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,u,p,g,h,m,f,b,y,w,v,k;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 Te.create(e,t,this.app);if(_ instanceof He)return _}}catch(M){console.warn("[SceneEditor] ObjectFactory failed for",e,M)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let M=this.getScreen(),_=(u=M==null?void 0:M.width)!=null?u:0,T=(p=M==null?void 0:M.height)!=null?p:0,j=new de,P=this.parseColor(n.background_color,0),L=typeof n.background_alpha=="number"?n.background_alpha:1;_>0&&T>0&&j.rect(0,0,_,T).fill({color:P,alpha:L});let E=new He;return E.addChild(j),E}if(a){let M=(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:M,align:(f=i==null?void 0:i.align)!=null?f:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new 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 M=new de,_=typeof t.effects.width=="number"?t.effects.width:100,T=typeof t.effects.height=="number"?t.effects.height:100,j=(k=t.effects.fill_color)!=null?k:"#ffffff",P=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,L=Number.parseInt(String(j).replace("#",""),16);return M.rect(0,0,_,T).fill({color:Number.isFinite(L)?L:16777215,alpha:P}),M}return new He}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 gr(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"))}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 _,T,j,P,L,E,A,x,S,C,R,I,O,z,$,q,B,F,D,G,W;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((T=l[0])!=null?T:0):Number((j=l==null?void 0:l.x)!=null?j:0),u=Array.isArray(l)?Number((P=l[1])!=null?P:0):Number((L=l==null?void 0:l.y)!=null?L:0),p=Array.isArray(c)?Number((E=c[0])!=null?E:0):Number((A=c==null?void 0:c.x)!=null?A:0),g=Array.isArray(c)?Number((x=c[1])!=null?x:0):Number((S=c==null?void 0:c.y)!=null?S:0),h=(Number.isFinite(d)?d:0)+(Number.isFinite(p)?p:0),m=(Number.isFinite(u)?u:0)+(Number.isFinite(g)?g:0);if(this.backgroundCoverEnabled&&this.isBackgroundObject(e,i,t)){let K=Number((R=(C=t==null?void 0:t.texture)==null?void 0:C.width)!=null?R:0),N=Number((O=(I=t==null?void 0:t.texture)==null?void 0:I.height)!=null?O:0);if(!Number.isFinite(K)||K<=0||!Number.isFinite(N)||N<=0){let re=(z=t==null?void 0:t.getLocalBounds)==null?void 0:z.call(t);K=Number(($=re==null?void 0:re.width)!=null?$:0),N=Number((q=re==null?void 0:re.height)!=null?q:0)}if(!Number.isFinite(K)||K<=0||!Number.isFinite(N)||N<=0)return;(B=t.anchor)!=null&&B.set&&t.anchor.set(.5,.5),(F=t.position)!=null&&F.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 te=n.width/K,J=n.height/N,Z=Math.max(te,J);(D=t.scale)!=null&&D.set?t.scale.set(Z,Z):t.scale&&(t.scale.x=Z,t.scale.y=Z);let pe=typeof(a==null?void 0:a.rotation)=="number"?a.rotation:0;t.rotation=this.toRadians(pe);return}let f=r!=null?$e(n.width,n.height,r):we(n.width,n.height,s),b=this.getRuntimeScale(),y=(f.x-n.width/2)/b+h,w=(f.y-n.height/2)/b+m;(G=t.position)!=null&&G.set?t.position.set(y,w):t.position&&(t.position.x=y,t.position.y=w);let k=(typeof(a==null?void 0:a.scale)=="number"?a.scale:1)*this.getRuntimeScale();(W=t.scale)!=null&&W.set?t.scale.set(k,k):t.scale&&(t.scale.x=k,t.scale.y=k);let M=typeof(a==null?void 0:a.rotation)=="number"?a.rotation:0;t.rotation=this.toRadians(M)}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?$e(i.width,i.height,e.position_ratio):we(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,u,p;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=(p=(d=y==null?void 0:y.transform)==null?void 0:d.anchor)!=null?p:(u=y==null?void 0:y.render)==null?void 0:u.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,u;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 p=this.getRuntimeLayoutReference();if(p){let g=Number((n=(i=p.position)==null?void 0:i.x)!=null?n:t.width/2),h=Number((s=(a=p.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=p.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),(u=this.app)!=null&&u.stage&&(this.app.stage.hitArea=new gr(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),u=Math.ceil((l-r)/e),p=e*Math.max(1,Math.ceil(d/c)),g=e*Math.max(1,Math.ceil(u/c)),h=Math.floor(a/p)*p,m=Math.floor(r/g)*g;this.gridLayer.clear(),this.gridLayer.visible=!0;for(let f=h;f<=s;f+=p)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,u;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[p,g]of this.objectMap.entries()){if(t&&p===t)continue;let h=e.get(p),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 M=f.toLocal(b,this.camera);g.displayObject.position.set(M.x,M.y)}else if(m.worldTransform){b.set(m.worldTransform.tx,m.worldTransform.ty);let M=f.toLocal(b,this.camera);g.displayObject.position.set(M.x,M.y)}let y=this.getWorldScale(m);if(y){let M=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,T=y.x/M,j=y.y/_;(d=g.displayObject.scale)!=null&&d.set?g.displayObject.scale.set(T,j):g.displayObject.scale&&(g.displayObject.scale.x=T,g.displayObject.scale.y=j)}let w=this.getWorldRotation(m);if(typeof w=="number"){let M=f?f.rotation:0,_=w-M;g.displayObject.rotation=_;let T=this.getEditableObjectConfig(p);if(T){let j=(u=T.transform)!=null?u:{};T.transform||(T.transform=j);let P=this.toDegrees(_),L=typeof j.rotation=="number"?j.rotation:0;if(Math.abs(P-L)>.01){let E=Math.round(P*100)/100;j.rotation=E}}}let v=m.parent,k=typeof(v==null?void 0:v.getChildIndex)=="function"?v.getChildIndex(m):0;typeof m.zIndex=="number"?g.displayObject.zIndex=m.zIndex:Number.isFinite(k)&&(g.displayObject.zIndex=k)}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 k=1/0,M=1/0,_=-1/0,T=-1/0,j=!1;for(let P of this.selectedIds){let L=this.objectMap.get(P);if(!(L!=null&&L.displayObject))continue;let E=(f=(m=L.displayObject).getBounds)==null?void 0:f.call(m);if(!E||E.width<=0||E.height<=0)continue;let A=this.camera.toLocal(new U(E.x,E.y)),x=this.camera.toLocal(new U(E.x+E.width,E.y+E.height));k=Math.min(k,A.x,x.x),M=Math.min(M,A.y,x.y),_=Math.max(_,A.x,x.x),T=Math.max(T,A.y,x.y),j=!0}if(j){let P=_-k,L=T-M,E=k+P/2,A=M+L/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(k,M,P,L),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});for(let C of this.selectedIds){let R=this.objectMap.get(C);if(!(R!=null&&R.displayObject))continue;let I=(y=(b=R.displayObject).getBounds)==null?void 0:y.call(b);if(!I||I.width<=0||I.height<=0)continue;let O=this.camera.toLocal(new U(I.x,I.y)),z=this.camera.toLocal(new U(I.x+I.width,I.y+I.height)),$=z.x-O.x,q=z.y-O.y;this.gizmoOutline.rect(O.x,O.y,$,q),this.gizmoOutline.stroke({width:1,color:16752394,alpha:.5})}let x=7,S={width:2,color:988970,alpha:.6};this.moveHandle.clear(),this.moveHandle.circle(E,A,x).fill({color:2278750,alpha:.95}),this.moveHandle.stroke(S),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 u=i.x+a,p=i.y+s;this.scaleHandle.clear(),this.scaleHandle.rect(u-c,p-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 de;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,u,p,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=(u=i.displayObject.parent)!=null?u:this.mainContainer,r=this.getEventLocalPoint(t,s);if(!r)return;(p=t==null?void 0:t.stopPropagation)==null||p.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 k,M,_,T,j,P,L,E;let n=this.getEditableObjectConfig(e);if(!n)return;let a=(k=n.transform)!=null?k:{};n.transform||(n.transform=a);let s=(M=this.getRuntimeScreenSize())!=null?M: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?$e(s.width,s.height,a.position_ratio):we(s.width,s.height,c),u=d.x,p=d.y,g=t,h=i;if(!l){let A=this.getRuntimeScale();u=(d.x-s.width/2)/A,p=(d.y-s.height/2)/A,g=t/A,h=i/A}let m=g-u,f=h-p,b=(T=a.offset)!=null?T:{x:0,y:0},y=Array.isArray(b)?Number((j=b[0])!=null?j:0):Number((P=b==null?void 0:b.x)!=null?P:0),w=Array.isArray(b)?Number((L=b[1])!=null?L:0):Number((E=b==null?void 0:b.y)!=null?E: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),Re({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 u=d.displayObject;if(!u||u.visible===!1||this.backgroundLocked&&this.isBackgroundObject(c,this.getEditableObjectConfig(c),u))continue;let p=(l=u.getBounds)==null?void 0:l.call(u);if(!p||p.width<=0||p.height<=0)continue;let g=p.x+p.width/2,h=p.y+p.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(u=>u.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}`,u=`${l}.png`,g=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:r,filename:u,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}/${u}`}}},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=`
2262
+ `;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=`
2263
2263
  position: fixed;
2264
2264
  top: 20px;
2265
2265
  right: 20px;
@@ -2272,7 +2272,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2272
2272
  font-family: system-ui, -apple-system, sans-serif;
2273
2273
  font-size: 14px;
2274
2274
  pointer-events: none;
2275
- `,i.textContent=e,document.body.appendChild(i),t>0&&setTimeout(()=>this.hideToast(i),t),i}hideToast(e){e&&e.parentNode&&e.parentNode.removeChild(e)}showContextMenu(e,t,i){let n=window.__HANDLER_ACTIVE_SCREEN,a=n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame"?n:"gameplay";new dt({objectId:e,screenId:a,onSelect:r=>{r?(this.selectedIds.clear(),this.selectedIds.add(r),this.setSelected(r),this.updateGizmos()):(this.setSelected(null),this.selectedIds.clear(),this.updateGizmos())},onRefresh:()=>{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh"))},onClose:()=>{},onDeleteRequest:r=>{let l=window.__deleteObjectRequest;typeof l=="function"&&l(r)},onMoveRequest:(r,l)=>{let c=window.__moveObjectRequest;typeof c=="function"&&c(r,a,l)}}).open({x:t,y:i})}};var qn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[ct("playable-portrait"),ct("iphone-14"),ct("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.hasForceSynced=!1;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||(this.scheduleFit(),this.updateBottomDockHeight())};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=ct(e.defaultDevice||un.id),this.debugPanel=new Gi,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let i=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=i===null?!0:i==="true"}catch{}let t="dark";try{let i=window.localStorage.getItem(this.getThemeStorageKey());(i==="light"||i==="dark")&&(t=i)}catch{}this.setTheme(t),this.sceneEditor=new Ui({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.updateBottomDockHeight(),this.isInitialized=!0,this.scheduleForceSync()}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}scheduleForceSync(){this.hasForceSynced||(this.hasForceSynced=!0,window.setTimeout(()=>{let e=window.__HANDLER_ACTIVE_SCREEN;fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"})}).catch(i=>{console.warn("[PreviewShell] Force sync on refresh failed:",i)})},250))}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=ct(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark");try{window.localStorage.setItem(this.getThemeStorageKey(),e)}catch{}let t=this.container.querySelector("#theme-select");t&&(t.value=e),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),this.updateSceneVisibility(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=null,s=l=>{let c=l.clientY-i,d=Math.max(100,Math.min(800,n-c));e.style.height=`${d}px`;let u=window.innerHeight;a=d/u*100;try{window.localStorage.setItem("preview_bottom_dock_height_percent",String(a))}catch{}let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},r=()=>{document.removeEventListener("pointermove",s),document.removeEventListener("pointerup",r),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),i=l.clientY,n=e.offsetHeight,document.addEventListener("pointermove",s),document.addEventListener("pointerup",r),e.classList.add("resizing")})}updateBottomDockHeight(){let e=this.container.querySelector("#bottom-dock");if(!e||e.classList.contains("resizing"))return;try{let a=window.localStorage.getItem("preview_bottom_dock_height_percent");if(a){let s=Number(a);if(Number.isFinite(s)&&s>0){let r=window.innerHeight,l=Math.max(100,Math.min(800,s/100*r));e.style.height=`${l}px`;return}}}catch{}let t=e.offsetHeight,i=window.innerHeight,n=Math.min(800,i*.5);t>n&&(e.style.height=`${n}px`)}makeSidebarResizable(e,t,i){let n,a,s=()=>{let c=this.container.querySelector(".preview-main");if(!c)return 600;let u=c.getBoundingClientRect().width,p=i==="left"?this.container.querySelector(".debug-workbench"):this.container.querySelector(".scene-panel.scene-objects"),g=p?p.offsetWidth:i==="left"?350:300,m=u-g-200;return Math.max(200,m)},r=c=>{let d=i==="left"?c.clientX-n:n-c.clientX,u=s(),p=Math.max(200,Math.min(u,a+d));e.style.width=`${p}px`;let g=this.container.querySelector(".preview-main");if(g){let m=i==="left"?`${p}px`:g.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:g.style.gridTemplateColumns.split(" ")[2]||"350px",b=400;g.style.gridTemplateColumns=`${m} minmax(${b}px, 1fr) ${f}`}let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},l=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",l),e.classList.remove("resizing")};t.addEventListener("pointerdown",c=>{c.preventDefault(),n=c.clientX,a=e.offsetWidth,document.addEventListener("pointermove",r),document.addEventListener("pointerup",l),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getThemeStorageKey(){return`handler_preview_theme::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&et(this.scenePane,e,i!=null?i:this.previewContainer),t&&Ni(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let s=a.clientX,r=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=u=>{let p=u.clientX-s,g=Math.max(240,Math.min(l,r+p));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
2275
+ `,i.textContent=e,document.body.appendChild(i),t>0&&setTimeout(()=>this.hideToast(i),t),i}hideToast(e){e&&e.parentNode&&e.parentNode.removeChild(e)}showContextMenu(e,t,i){let n=window.__HANDLER_ACTIVE_SCREEN,a=n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame"?n:"gameplay";new pt({objectId:e,screenId:a,onSelect:r=>{r?(this.selectedIds.clear(),this.selectedIds.add(r),this.setSelected(r),this.updateGizmos()):(this.setSelected(null),this.selectedIds.clear(),this.updateGizmos())},onRefresh:()=>{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh"))},onClose:()=>{},onDeleteRequest:r=>{let l=window.__deleteObjectRequest;typeof l=="function"&&l(r)},onMoveRequest:(r,l)=>{let c=window.__moveObjectRequest;typeof c=="function"&&c(r,a,l)}}).open({x:t,y:i})}};var Yn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[dt("playable-portrait"),dt("iphone-14"),dt("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.hasForceSynced=!1;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=dt(e.defaultDevice||hn.id),this.debugPanel=new qi,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let i=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=i===null?!0:i==="true"}catch{}let t="dark";try{let i=window.localStorage.getItem(this.getThemeStorageKey());(i==="light"||i==="dark")&&(t=i)}catch{}this.setTheme(t),this.sceneEditor=new Vi({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.isInitialized=!0,this.scheduleForceSync()}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}scheduleForceSync(){this.hasForceSynced||(this.hasForceSynced=!0,window.setTimeout(()=>{let e=window.__HANDLER_ACTIVE_SCREEN;fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"})}).catch(i=>{console.warn("[PreviewShell] Force sync on refresh failed:",i)})},250))}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=dt(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark");try{window.localStorage.setItem(this.getThemeStorageKey(),e)}catch{}let t=this.container.querySelector("#theme-select");t&&(t.value=e),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updatePanelPositions(),this.updateSceneVisibility(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}makeSidebarResizable(e,t,i){let n,a,s=()=>{let c=this.container.querySelector(".preview-main");if(!c)return 600;let p=c.getBoundingClientRect().width,u=i==="left"?this.container.querySelector(".debug-workbench"):this.container.querySelector(".scene-panel.scene-objects"),g=u?u.offsetWidth:i==="left"?350:300,m=p-g-200;return Math.max(200,m)},r=c=>{let d=i==="left"?c.clientX-n:n-c.clientX,p=s(),u=Math.max(200,Math.min(p,a+d));e.style.width=`${u}px`;let g=this.container.querySelector(".preview-main");if(g){let m=i==="left"?`${u}px`:g.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${u}px`:g.style.gridTemplateColumns.split(" ")[2]||"350px",b=400;g.style.gridTemplateColumns=`${m} minmax(${b}px, 1fr) ${f}`}let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},l=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",l),e.classList.remove("resizing")};t.addEventListener("pointerdown",c=>{c.preventDefault(),n=c.clientX,a=e.offsetWidth,document.addEventListener("pointermove",r),document.addEventListener("pointerup",l),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getThemeStorageKey(){return`handler_preview_theme::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&et(this.scenePane,e,i!=null?i:this.previewContainer),t&&Bi(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let s=a.clientX,r=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=p=>{let u=p.clientX-s,g=Math.max(240,Math.min(l,r+u));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
2276
2276
  <div class="preview-toolbar">
2277
2277
  <div class="preview-toolbar-left">
2278
2278
  <span class="preview-logo">PREVIEWER</span>
@@ -2281,7 +2281,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2281
2281
  <div class="preview-toolbar-center">
2282
2282
  <div class="device-selector-wrapper">
2283
2283
  <select class="device-dropdown" id="device-select">
2284
- ${Es.map(i=>`
2284
+ ${As.map(i=>`
2285
2285
  <optgroup label="${i.label}">
2286
2286
  ${i.devices.map(n=>`
2287
2287
  <option value="${n.id}" ${n.id===this.currentPreset.id?"selected":""}>
@@ -2444,6 +2444,8 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2444
2444
 
2445
2445
  ${((t=this.debugPanel)==null?void 0:t.getDebugOverlayHTML())||""}
2446
2446
 
2447
+ <!-- Bottom dock (Library and Console panels) - COMMENTED OUT -->
2448
+ <!--
2447
2449
  <div class="bottom-dock" id="bottom-dock">
2448
2450
  <div class="bottom-dock-resize-handle" id="bottom-dock-resize"></div>
2449
2451
  <div class="bottom-dock-header">
@@ -2462,9 +2464,10 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2462
2464
  </div>
2463
2465
  </div>
2464
2466
  </div>
2467
+ -->
2465
2468
 
2466
2469
  </div>
2467
- `,this.setupEventListeners(e),e}setupEventListeners(e){var M,_,T,j,P,L,E,A;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",x=>{if(this.viewMode==="compare")return;let S=x.target.value;this.setDevice(S)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",x=>{let S=x.target.value;this.setTheme(S)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(x=>{x.addEventListener("click",()=>{let S=x.dataset.viewToggle;S&&this.setViewMode(S)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(x=>{x.addEventListener("click",()=>{let S=x.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=x=>{let S=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${x}::${S}`},c=e.querySelector("#scene-grid-btn"),d=e.querySelector("#scene-play-btn"),u=(x,S,C)=>{x&&(x.textContent=S?`${C} On`:`${C} Off`,x.setAttribute("aria-pressed",S?"true":"false"))},p=()=>{let x=window.localStorage.getItem(l("grid_gap")),S=Number(x!=null?x:50);return Number.isFinite(S)?S:50},g=x=>{try{window.localStorage.setItem(l("grid_enabled"),x?"true":"false")}catch{}u(c,x,"Grid");let S=p();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:x,gap:S}}))},h=x=>{try{window.localStorage.setItem(l("play_mode"),x?"true":"false")}catch{}u(d,x,"Play"),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:x}}))};try{let x=window.localStorage.getItem(l("grid_enabled"))==="true",S=!0;try{window.localStorage.setItem(l("play_mode"),"true")}catch{}if(u(c,x,"Grid"),u(d,S,"Play"),d&&(d.disabled=!0),c){let C=p();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:x,gap:C}}))}d&&window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:S}}))}catch{}c==null||c.addEventListener("click",()=>{let x=c.getAttribute("aria-pressed")==="true";g(!x)}),d==null||d.addEventListener("click",()=>{let x=d.getAttribute("aria-pressed")==="true";h(!x)}),(M=e.querySelector("#rotate-btn"))==null||M.addEventListener("click",()=>this.toggleRotation()),(_=e.querySelector("#zoom-in-btn"))==null||_.addEventListener("click",()=>this.adjustUserZoom(.1)),(T=e.querySelector("#zoom-out-btn"))==null||T.addEventListener("click",()=>this.adjustUserZoom(-.1)),(j=e.querySelector("#refresh-btn"))==null||j.addEventListener("click",()=>this.refresh());let m=e.querySelector("#bottom-dock"),f=e.querySelector("#bottom-dock-resize");m&&f&&this.makeBottomDockResizable(m,f);let b=Array.from(e.querySelectorAll(".bottom-dock-tab"));b.forEach(x=>{x.addEventListener("click",()=>{let S=x.dataset.dockTab;if(!S)return;b.forEach(R=>R.classList.remove("active")),x.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(R=>{let I=R.dataset.dockPanel;R.classList.toggle("active",I===S)})})}),(P=e.querySelector("#console-clear"))==null||P.addEventListener("click",()=>this.clearConsole()),(L=e.querySelector("#corner-zoom-in-btn"))==null||L.addEventListener("click",()=>this.adjustUserZoom(.1)),(E=e.querySelector("#corner-zoom-out-btn"))==null||E.addEventListener("click",()=>this.adjustUserZoom(-.1)),(A=e.querySelector("#corner-grab-btn"))==null||A.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let y=e.querySelector(".scene-panel.scene-objects"),w=y==null?void 0:y.querySelector("[data-panel-resize-v]");y&&w&&this.makeSidebarResizable(y,w,"left");let v=e.querySelector(".debug-workbench"),k=v==null?void 0:v.querySelector("#workbench-resize-v");v&&k&&this.makeSidebarResizable(v,k,"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(),Fa();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),Ba();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=st().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;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(u=>u.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",u=>{let p=u.target;if(p!=null&&p.closest("[data-compare-focus]")){u.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,u=(s-c)/2;n.clearRect(0,0,a,s),n.drawImage(i,d,u,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 hr(o={}){let e=new qn(o);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}function Vn(o){try{if(o&&typeof o.keys=="function")return Array.from(o.keys())}catch{}return[]}function mr(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 fr(o,e){var d,u,p;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"&&((u=o.scale)!=null&&u.set?o.scale.set(t.scale):o.scale&&(o.scale.x=t.scale,o.scale.y=t.scale));let c=t.anchor;if(c&&((p=o.anchor)!=null&&p.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 br(o){if(typeof window=="undefined")return;let e=o==null?void 0:o.objects,t=Vn(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 u=new Set(c);return a.filter(p=>u.has(p))}let d=l==null?void 0:l.instanceToScreen;return d?a.filter(u=>d[u]===r):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>br(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Vn((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Vn((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var u,p,g,h,m,f;let s=(h=(g=(p=(u=window.__editableConfig)==null?void 0:u.objects)==null?void 0:p.get)==null?void 0:g.call(p,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(),u=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),p=await l.load(u);if(!p)return;c[t]=p;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=p);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=p;else if(f!=null&&f.children){let b=f.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=p)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=an();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Xt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=an();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Xt(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&&Xt(n,{silent:!0,persist:!0,emitEvent:!0})}}function Yn(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 u=window.gameApp,p=await Te.create(a,s,u);c&&(d!==void 0&&d!==-1?c.addChildAt(p,d):c.addChild(p));let g=t.create(a,p);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 u=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!u),u&&(console.log("[LIVE-EDIT] gameObject type:",(c=u.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof u.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof u.onConfigUpdate=="function")),u&&typeof u.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),u.updateConfig(s);else if(u&&typeof u.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),u.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let p=mr(u);fr(p,s)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,s){var d,u;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=(u=t==null?void 0:t.get)==null?void 0:u.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 p=mr(l);fr(p,s)}let c=[a];i==null||i(a,s,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,br(a))}};return n.rebuildIndexes(),n}import Go from"lottie-web";Xn(xs);typeof window!="undefined"&&!window.lottie&&(window.lottie=Go);var mt=null,Uo=async()=>{if(!mt){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]);mt=JSON.parse(i)}else mt=JSON.parse(e);return mt}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}mt=await(await fetch("./handler.config.json")).json()}return mt},Jn,Ht,wr,ft,Wn,Kn;function Yp(o){Jn=o.initGame,Ht=o.CustomAssets,wr=o.updateScreenState,ft=o.globalResponsiveMultipliers,Wn=o.layout,Kn=o.clearResponsiveElements}var qi="web_embed",Dt="https://example.com",yr={profile_id:qi},We=null,Pe=null,$t={width:0,height:0},qo=!0,Wp=async()=>{var c,d,u,p;document.title="Handler Pixi Game";let o=await Uo();yr={...o.ids||{},profile_id:qi},Dt=o.destination_url||((d=(c=o.export_profiles)==null?void 0:c[qi])==null?void 0:d.destination_url)||Dt,Ne.init({ids:yr,profile:qi,destinationUrl:Dt});let e=Ne.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),Pe=hr({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),vr()},onRefresh:vr});let g=Pe.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var w,v,k,M,_,T,j,P,L,E,A,x,S;let m=window.gameApp,f=window.gameObjectManager,{width:b,height:y}=h.detail;if($t.width=b,$t.height=y,wr(b,y),!(!m||!m.renderer)){f&&r(m,f);try{m.renderer.resize(b,y);let C=m.view;C&&(C.style.width="100%",C.style.height="100%",C.style.display="block")}catch(C){console.warn("[SCREEN] Error resizing renderer:",C);return}if(t&&f&&Wn)try{let C=(w=window.__mainContainer)!=null?w:m.stage,R=(j=(T=(M=window.__tutorialLabel)!=null?M:(k=(v=f.get("label_1"))==null?void 0:v.getDisplayObject)==null?void 0:k.call(v))!=null?T:(_=f.get("label_1"))==null?void 0:_.pixiObject)!=null?j:f.get("label_1"),I=f.get("background_1"),O=(A=(E=(L=window.__background)!=null?L:(P=I==null?void 0:I.getDisplayObject)==null?void 0:P.call(I))!=null?E:I==null?void 0:I.pixiObject)!=null?A:I;if(C){let z=C===m.stage;Wn({mainContainer:C,label:R,background:O,backgroundTexture:(O==null?void 0:O.texture)||null,app:m},t,0,$t,f,{skipMainContainerTransform:z}),window.dispatchEvent(new CustomEvent("handler:layout-applied",{detail:{width:$t.width,height:$t.height,presetId:(S=(x=h.detail)==null?void 0:x.presetId)!=null?S:null}}))}}catch(C){console.warn("[SCREEN] Error in layout:",C)}}})}let t=await Zt("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Tt(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(p=(u=t.engine.runtime)==null?void 0:u.layout)!=null&&p.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Zt("scene.main"));let i=await Jn(e,t,Dt,Pe);We=i.app;let n=i.gameObjectManager;window.gameApp=We,window.gameObjectManager=n;try{window.__liveEditBridge=Yn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Ht})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}Pe&&Pe.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(ft.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),r(We,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 k=await v.text();try{return JSON.parse(k)}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 k=await g(v),M=k==null?void 0:k.elements;if(!Array.isArray(M))continue;let _=M.map(T=>T==null?void 0:T.instance_id).filter(T=>typeof T=="string");f[y]=_;for(let T of _)b[T]||(b[T]=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: ${ft.scale.toFixed(3)}`),g.stage){let f=function(b,y=0){if(!b||!b.children)return;let w=" ".repeat(y);b.children.forEach((v,k)=>{if(v&&v.zIndex===9999){console.log(`${w}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(v&&v.scale){let M=v.scale.x||1,_=v.scale.y||1;v.__originalScale||(v.__originalScale={x:M,y:_},console.log(`${w}[RESPONSIVE] Stored original scale for child[${k}]: ${M.toFixed(3)}, ${_.toFixed(3)}`));let T=v.__originalScale.x*ft.scale,j=v.__originalScale.y*ft.scale;typeof v.scale.set=="function"?v.scale.set(T,j):(v.scale.x=T,v.scale.y=j),console.log(`${w}[RESPONSIVE] Child[${k}] scale: ${M.toFixed(3)}\u2192${v.scale.x.toFixed(3)} (type: ${v.constructor.name})`),f(v,y+1)}else v&&console.log(`${w}[RESPONSIVE] Child[${k}] 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){ft.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,Ne.start()},vr=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(Pe){Pe.notifyGameDestroyed();try{Kn&&Kn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=Pe.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),We){try{We.destroy(!0,{children:!0,texture:!1})}catch(r){console.warn("[PREVIEW] Destroy warning:",r)}We=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(()=>{Zt("scene.main").then(r=>{window.__editableConfig=r,window.__editableConfigBaseline||(window.__editableConfigBaseline=Tt(r)),Jn(a,r,Dt).then(l=>{We=l.app,window.gameApp=We,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Yn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Ht})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}Pe&&Pe.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Ne.start()}catch{}})})},100)},1e3)}};var Fe={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Vo=1.25,Yo={fontFamily:"Inter, system-ui, sans-serif"};var Zn=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=`
2470
+ `,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=`
2468
2471
  position: fixed;
2469
2472
  inset: 0;
2470
2473
  display: flex;
@@ -2473,7 +2476,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2473
2476
  z-index: 50;
2474
2477
  user-select: none;
2475
2478
  overflow: hidden;
2476
- background-color: ${Fe.background};
2479
+ background-color: ${Be.background};
2477
2480
  `;let t=document.createElement("div");t.style.cssText=`
2478
2481
  position: relative;
2479
2482
  width: 288px;
@@ -2503,12 +2506,12 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2503
2506
  font-size: 12px;
2504
2507
  font-weight: 900;
2505
2508
  letter-spacing: 0.15em;
2506
- color: ${Fe.ink};
2509
+ color: ${Be.ink};
2507
2510
  `,s.innerHTML='LOADING<span class="loading-dots" style="animation: pulse 1.5s infinite;">..</span>',this.progressText=document.createElement("span"),this.progressText.style.cssText=`
2508
2511
  font-size: 10px;
2509
2512
  font-family: monospace;
2510
2513
  font-weight: bold;
2511
- color: ${Fe.primaryAccent};
2514
+ color: ${Be.primaryAccent};
2512
2515
  `,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,a.appendChild(s),a.appendChild(this.progressText);let r=document.createElement("div");r.style.cssText=`
2513
2516
  height: 4px;
2514
2517
  width: 100%;
@@ -2523,7 +2526,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2523
2526
  border-radius: 9999px;
2524
2527
  position: relative;
2525
2528
  width: ${this.currentProgress}%;
2526
- background-color: ${Fe.primaryAccent};
2529
+ background-color: ${Be.primaryAccent};
2527
2530
  `;let l=document.createElement("div");l.style.cssText=`
2528
2531
  position: absolute;
2529
2532
  inset: 0;
@@ -2539,10 +2542,10 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2539
2542
  margin-top: 8px;
2540
2543
  padding: 0 4px;
2541
2544
  opacity: 0.4;
2542
- `;for(let p=0;p<9;p++){let g=document.createElement("div");g.style.cssText=`
2545
+ `;for(let u=0;u<9;u++){let g=document.createElement("div");g.style.cssText=`
2543
2546
  width: 1.5px;
2544
2547
  background-color: black;
2545
- height: ${p%4===0?"6px":"2px"};
2548
+ height: ${u%4===0?"6px":"2px"};
2546
2549
  `,c.appendChild(g)}n.appendChild(a),n.appendChild(r),n.appendChild(c);let d=document.createElement("div");return d.id="handler-load-centered",d.style.cssText=`
2547
2550
  position: absolute;
2548
2551
  top: 48px;
@@ -2552,7 +2555,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2552
2555
  left: 50%;
2553
2556
  transform: translateX(-50%);
2554
2557
  overflow: visible;
2555
- `,"HANDLER".split("").forEach((p,g)=>{let h=document.createElement("div");h.textContent=p,h.style.cssText=`
2558
+ `,"HANDLER".split("").forEach((u,g)=>{let h=document.createElement("div");h.textContent=u,h.style.cssText=`
2556
2559
  position: absolute;
2557
2560
  width: 28px;
2558
2561
  height: 40px;
@@ -2562,7 +2565,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2562
2565
  font-size: 24px;
2563
2566
  letter-spacing: -0.05em;
2564
2567
  animation: handlerMove 2.5s linear infinite;
2565
- color: ${Fe.ink};
2568
+ color: ${Be.ink};
2566
2569
  display: flex;
2567
2570
  align-items: center;
2568
2571
  justify-content: center;
@@ -2575,7 +2578,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2575
2578
  letter-spacing: 0.3em;
2576
2579
  opacity: 0.2;
2577
2580
  text-transform: uppercase;
2578
- color: ${Fe.ink};
2581
+ color: ${Be.ink};
2579
2582
  `,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`,e.appendChild(t),e.appendChild(this.authSeq),this.injectStyles(),e}injectStyles(){if(document.getElementById("handler-loading-screen-styles"))return;let e=document.createElement("style");e.id="handler-loading-screen-styles",e.textContent=`
2580
2583
  /* Box Loading Styles */
2581
2584
  .boxLoading {
@@ -2606,7 +2609,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2606
2609
  content: '';
2607
2610
  width: 50px;
2608
2611
  height: 50px;
2609
- background: ${Fe.primaryAccent};
2612
+ background: ${Be.primaryAccent};
2610
2613
  animation: animate 0.5s linear infinite;
2611
2614
  position: absolute;
2612
2615
  top: 0;
@@ -2663,7 +2666,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2663
2666
  0%, 100% { opacity: 1; }
2664
2667
  50% { opacity: 0.3; }
2665
2668
  }
2666
- `,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 Qn=ts.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"]);es();var kr={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"},Tr=Math.random().toString(36).slice(2),vt=null,bt={...kr},Pr="web_embed",na={},Ft,ea=!1,Nt=!1,Gt=!1,Ir=!1,oa=1,Yi=0,Xi=!1,Be=!1,yt="",wt=Math.floor(window.innerWidth),xt=Math.floor(window.innerHeight),aa=wt>xt,Ge=!1,Bt=!1,xr=!1,Sr=!1,ta=!1,Wi=null,it=null,sa=!1,ra=!1,Vi=new Map;function Mr(){if(!it)return null;let o=Date.now()-it;return!Number.isFinite(o)||o<0?null:o}function ia(o){if(sa)return;let e=Mr();e!==null&&(sa=!0,H("session_time",{duration_ms:e,reason:o}))}function Er(){if(vt)return vt;let o=document.createElement("div");return o.id="handler-root",o.setAttribute("data-handler-root","true"),document.body.appendChild(o),vt=o,o}function Ki(o){switch(o){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return o}}function jr(o,e){return{event_name:o,ts:Date.now(),session_id:Tr,deployment_id:bt.deployment_id,variant_id:bt.variant_id,export_profile_id:bt.profile_id,instance_id:bt.instance_id||"default",env:Pr==="mraid"?"mraid":"web",attribution:Ft,payload:e}}function H(o,e){let t=Ki(o),i=jr(t,e);on(i,!!na.analytics),ei(t,i),t!==o&&ei(o,i)}function Ut(){Wi&&(Wi(wt,xt),Wi=null)}function St(o){oa=o,H("volume",o)}function Et(o){o&&(Ir=!0),!Gt&&(Gt=!0,H("pause"),St(0))}function qt(o){!o&&Ir||Gt&&(Gt=!1,H("resume"),St(oa))}function Ke(o,e){wt=Math.floor(o||window.innerWidth),xt=Math.floor(e||window.innerHeight),aa=wt>xt,H("resize",{width:wt,height:xt})}function Ko(){if(gs())try{let o=mraid.getMaxSize();Ke(o.width,o.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?qt():Et()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Ke(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();St(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&St(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Xi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Ge=!0,H("boot"),H("view"),H("ready"),Be=!0,Ut();else{let t=()=>{Ge=!0,H("boot"),H("view"),H("ready"),Be=!0,Ut()};mraid.addEventListener("ready",t)}}catch(o){console.warn("MRAID hook skipped",o)}}function Xo(){if(hs())try{let o=dapi.getScreenSize();Ke(o.width,o.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?qt():Et()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Ke(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(St(e?1:0),dapi.addEventListener("audioVolumeChange",t=>St(t?1:0)),Xi=!0,dapi.isViewable())Ge=!0,H("boot"),H("view"),H("ready"),Be=!0,Ut();else{let t=()=>{Ge=!0,H("boot"),H("view"),H("ready"),Be=!0,Ut()};dapi.addEventListener("ready",t)}}catch(o){console.warn("DAPI hook skipped",o)}}function Ar(){let o=()=>{Ge||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Ge=!0,H("boot"),H("view"),H("ready"),Be=!0,Ut(),Bt&&(Bt=!1,Ie.start()))};window.addEventListener("resize",()=>Ke()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(qt(),o()):Et()}),document.readyState==="complete"||document.readyState==="interactive"?o():window.addEventListener("load",o),Xi=!0}function Jo(){let o=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(xr=!0),!(xr&&e instanceof MouseEvent)&&(Yi+=1,ra||(ra=!0,H("first_interaction",{count:Yi})),H("interaction",Yi))};document.addEventListener("mousedown",o),document.addEventListener("touchstart",o)}function Cr(o){var i,n,a,s,r,l,c,d,u,p,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(lt())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(ms())(r=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||r.call(s);else if(vs())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(ys())try{(u=(d=window.smxTracking)==null?void 0:d.redirect)==null||u.call(d)}catch(m){console.warn("Smadex redirect failed",m)}else if(fs()){let m=window.ExitApi;m&&typeof m.exit=="function"?m.exit(o||yt||""):o&&window.open(o)}else ot()?(p=window.install)==null||p.call(window):bs()?(g=window.openAppStore)==null||g.call(window):ln()?(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;fe("view",()=>e(t.mraid_viewable)),fe("start",()=>e(t.game_viewable)),fe("engagement",()=>e(t.engagement));let i=()=>e(t.complete);fe("complete",i),Qt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),fe("cta_click",()=>e(t.click))}else if(o==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;fe("view",()=>e(t.Ad_Load_Start)),fe("start",()=>e(t.Ad_Viewable)),fe("engagement",()=>e(t.First_Engagement)),fe("complete",()=>e(t.Gameplay_Complete)),fe("cta_click",()=>e(t.DSP_Click)),fe("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Qo(){if(!lt())return;let o=window.TJ_API;o&&o.setPlayableAPI&&o.setPlayableAPI({skipAd:()=>{try{Ie.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Lr(){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(){ot()&&(window.mintGameStart=()=>{qt(!0),Ke()},window.mintGameClose=()=>{Et(!0)})}function tl(){if(!cn())return;let o=window.NUC;!o||!o.trigger||(Ie.on("cta_click",()=>{var e,t;return(t=(e=o.trigger).convert)==null?void 0:t.call(e,yt)}),Ie.on("complete",()=>{var e,t;return(t=(e=o.trigger).tryAgain)==null?void 0:t.call(e)}))}var Ie={init(o={},e){var t;if(Pr=o.profile||"web_embed",na=o.consent||{},bt={...kr,...o.ids||{}},vt=o.rootEl||vt,Ft=void 0,Ya((t=o.telemetry)!=null&&t.endpoint?o.telemetry:null),it=null,sa=!1,ra=!1,Vi.clear(),yt=o.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Wi=e),H("init"),document.body.oncontextmenu=()=>!1,Er(),nl(vt),ws(),Ko(),Xo(),!Xi){if(document.readyState==="complete")Ar();else if(!Sr){Sr=!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${Qn} `,"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;"),Ge&&!Be&&(H("boot"),H("view"),H("ready"),Bt&&(Bt=!1,Ie.start()),Be=!0),Be=Ge},getRoot(){return Er()},get version(){return Qn},get maxWidth(){return wt},get maxHeight(){return xt},get isLandscape(){return aa},get isReady(){return Be},get isStarted(){return ea},get isPaused(){return Gt},get isFinished(){return Nt},get volume(){return oa},get interactions(){return Yi},on(o,e){Qt(Ki(o),e)},off(o,e){rn(Ki(o),e)},start(){var o,e;if(!ea){if(!Ge){Bt=!0;return}if(ea=!0,it||(it=Date.now()),H("start"),Ke(),ot())Et(),(o=window.gameReady)==null||o.call(window);else if(lt()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:aa?"landscape":"portrait",buildID:Qn})}}},finish(){var o,e;Nt||(Nt=!0,H("complete"),ia("complete"),ot()?(o=window.gameEnd)==null||o.call(window):ln()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):lt()&&Lr())},install(o){if(!Nt){Nt=!0,lt()?(Lr(),setTimeout(()=>Ie.install(o),300)):(H("complete"),setTimeout(()=>Ie.install(o),0));return}ta||(ta=!0,setTimeout(()=>ta=!1,500),H("cta_click"),H("conversion"),ia("cta"),Cr(o||yt))},emit(o,e){let t=Ki(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=jr(t,e);on(i,!!na.analytics),ei(t,i)},gameStart(){Ie.start()},gameEnd(){Ie.finish()},ctaClick(o,e){H("cta_click",{url:o||yt,manual:!0}),(e==null?void 0:e.open)!==!1&&Cr(o||yt)},ctaShow(o){H("cta_show",o)},ctaDismiss(o){H("cta_dismiss",o)},getGameTimeMs(){return Mr()},endSession(o="manual"){ia(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(`${Tr}:${o}`))%e.length,i=e[t];return Ft={...Ft||{},experiment_id:o},bt.variant_id=i,H("ab_assign",{experiment_id:o,variant_id:i}),i},levelStart(o,e){it||(it=Date.now()),H("level_start",{level_id:o,...e})},levelComplete(o,e){H("level_complete",{level_id:o,...e})},levelFail(o,e){H("level_fail",{level_id:o,...e})},checkpoint(o,e){H("checkpoint",{checkpoint_id:o,...e})},reward(o,e){H("reward",{reward_id:o,...e})},tutorialStart(o,e){H("tutorial_start",{step_id:o,...e})},tutorialComplete(o,e){H("tutorial_complete",{step_id:o,...e})},tutorialSkip(o,e){H("tutorial_skip",{step_id:o,...e})},timerStart(o){o&&Vi.set(o,Date.now())},timerEnd(o,e="custom",t){if(!o)return;let i=Vi.get(o);if(!i)return;Vi.delete(o);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){H("engagement",{action:"timer",key:o,duration_ms:n,...t});return}H(e,{key:o,duration_ms:n,...t})}},fps(o,e){H("fps",{value:o,...e})},memory(o,e){H("memory",{bytes:o,...e})},assetLoadStart(o,e){H("asset_load_start",{asset_id:o,...e})},assetLoadComplete(o,e){H("asset_load_complete",{asset_id:o,...e})},reportError(o,e,t){H("error",{code:o,message:e,...t})},retry(){var o,e,t;if(ot())(o=window.gameRetry)==null||o.call(window);else if(cn()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}H("engagement",{action:"retry"})},pause(){Et(!0)},resume(){qt(!0)},resize(o,e){Ke(o,e)}},Ne=Ie;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=`
2669
+ `,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=`
2667
2670
  (function(){
2668
2671
  var events = ['touchstart','touchend','mousedown','keydown'];
2669
2672
  function unlock(){
@@ -2679,14 +2682,14 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2679
2682
  }
2680
2683
  events.forEach(function(e){ document.addEventListener(e, unlock, false); });
2681
2684
  })();
2682
- `,o.appendChild(e)}async function la(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 u,p,g,h;if(!t.renderer)return;let r=(u=s==null?void 0:s.width)!=null?u:o.clientWidth,l=(p=s==null?void 0:s.height)!=null?p: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),Ne.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(r=>r.pause())}),Ne.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(r=>{r.currentTime>0&&!r.ended&&r.play().catch(()=>{})})}),Ne.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 ca,Ticker as At,ColorMatrixFilter as sl}from"pixi.js";var Ji=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)}},Zi=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}=Dr("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},Qi=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 Ji(n.transform),this.renderer=new Zi(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,u,p,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=(p=(u=this._config)==null?void 0:u.render)==null?void 0:p.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,u;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 p=new ca;p.blur=(a=e.blur.strength)!=null?a:4,t.push(p)}if((s=e.shadow)!=null&&s.enabled){let p=e.shadow,g=new ca;g.blur=(r=p.blur)!=null?r:4,g.blendMode="multiply",t.push(g),(p.offsetX!==0||p.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let p=e.glow,g=new ca;if(g.blur=(c=p.blur)!=null?c:8,t.push(g),p.color){let h=new sl,m=typeof p.color=="string"?parseInt(p.color.replace("#",""),16):p.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"),(u=e.distortion)!=null&&u.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,u,p,g,h,m,f;let e=(d=this._config)==null?void 0:d.motion;if(!e||!((u=e.intro)!=null&&u.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=(p=this._config)==null?void 0:p.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,P,L,E,A,x;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,k=this.transform.scale*(((P=(j=this._config)==null?void 0:j.effects)==null?void 0:P.scale_x)||1),M=this.transform.scale*(((E=(L=this._config)==null?void 0:L.effects)==null?void 0:E.scale_y)||1),_=this.transform.position.y,T=this.transform.position.x;if(this.pixiObject.alpha=((A=t.startAlpha)!=null?A:0)+(v-((x=t.startAlpha)!=null?x:0))*w,t.startScale!==void 0){let S=t.startScale+(1-t.startScale)*w;this.pixiObject.scale.set(k*S,M*S)}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=T,this.pixiObject.y=_,this.pixiObject.scale.set(k,M))};this._introTicker=c,At.shared.add(c)}applyMotion(){var u,p,g,h,m,f;let e=(u=this._config)==null?void 0:u.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(),!(((p=e.pulse)==null?void 0:p.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 L,E,A,x,S,C,R,I,O,z,$,q,B,F,D,G,W,K,N,te,J,Z,pe,re,Me,je;let y=((L=b.deltaTime)!=null?L:1)*c;a+=b.deltaTime*.05;let w=this.transform.scale,v=w*(((A=(E=this._config)==null?void 0:E.effects)==null?void 0:A.scale_x)||1),k=w*(((S=(x=this._config)==null?void 0:x.effects)==null?void 0:S.scale_y)||1),M=this.transform.position.x,_=this.transform.position.y,T=this.transform.rotation,j=0,P=0;if((C=e.swing)!=null&&C.enabled){let Y=(R=e.swing.amplitude)!=null?R:10,oe=(I=e.swing.speed)!=null?I:1,ie=Math.sin(a*oe)*Y;e.swing.axis==="vertical"?P+=ie:e.swing.axis==="both"?(j+=ie,P+=ie):j+=ie}if((O=e.continuousMove)!=null&&O.enabled){let Y=(z=e.continuousMove.axis)!=null?z:"x",oe=Math.max(0,($=e.continuousMove.speed)!=null?$:50),ie=Math.sign((q=e.continuousMove.direction)!=null?q:1)||1,ue=Math.max(0,(B=e.continuousMove.lifetime)!=null?B:0);s+=y;let Ue=ue>0?Math.min(s,ue):s,Xe=oe*ie*Ue;(Y==="x"||Y==="both")&&(j+=Xe),(Y==="y"||Y==="both")&&(P+=Xe)}if((F=e.orbit)!=null&&F.enabled){let Y=Math.max(0,(D=e.orbit.radius)!=null?D:50),oe=Math.max(0,(G=e.orbit.speed)!=null?G:45),ie=Math.sign((W=e.orbit.direction)!=null?W:1)||1,ue=oe*Math.PI/180;l+=ue*ie*y;let Ue=(K=e.orbit.pivotOffsetX)!=null?K:0,Xe=(N=e.orbit.pivotOffsetY)!=null?N:0;j+=Ue+Y*Math.cos(l),P+=Xe+Y*Math.sin(l)}if(this.pixiObject.x=M+j,this.pixiObject.y=_+P,(te=e.pulse)!=null&&te.enabled){let Y=(J=e.pulse.intensity)!=null?J:.1,oe=(Z=e.pulse.speed)!=null?Z:1,ue=1+Math.sin(a*oe)*Y;(pe=this.pixiObject.scale)!=null&&pe.set?this.pixiObject.scale.set(v*ue,k*ue):this.pixiObject.scale&&(this.pixiObject.scale.x=v*ue,this.pixiObject.scale.y=k*ue)}if((re=e.continuousRotate)!=null&&re.enabled){let Y=Math.max(0,(Me=e.continuousRotate.speed)!=null?Me:90),oe=Math.sign((je=e.continuousRotate.direction)!=null?je:1)||1,ie=Y*Math.PI/180;r+=ie*oe*y,this.pixiObject.rotation=T+r}};At.shared.add(d),this._tickerCleanup=()=>{var b,y,w,v,k;if(At.shared.remove(d),this.pixiObject){let M=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,(k=this.pixiObject.scale)!=null&&k.set?this.pixiObject.scale.set(M,_):this.pixiObject.scale&&(this.pixiObject.scale.x=M,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 Qi(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 en={"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=en[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=en[o];return e&&(t=e.weight)!=null?t:"400"}function ll(o,e){en[o]=e}function cl(){return Object.keys(en)}var Ct=null;function dl(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!Ct),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),Ct||(typeof window!="undefined"&&window.lottie?(Ct=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"),Ct=null)),Ct}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 _r(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 Xn(o){Ct=o}function gl(o,e,t,i){var M,_,T,j,P,L,E,A,x,S,C,R,I,O,z,$,q,B,F;let n=t.objects.get(o);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${o}`),null;let a=((M=n.effects)==null?void 0:M.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=_r(l);if(!c){let D=(T=(_=n.render)==null?void 0:_.asset)==null?void 0:T.path;if(typeof D=="string"&&D.toLowerCase().endsWith(".json")){let G=ul(D);if(c=_r(G),c)try{i[o]=c}catch{}}}if(!c){let D=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${o}`,{kind:D}),null}let d=dl();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${o}`),null;let u=(j=a.width)!=null?j:300,p=(P=a.height)!=null?P:300,g=(L=s.scale)!=null?L:1,h=((A=(E=s.position)==null?void 0:E.x)!=null?A:0)+((S=(x=s.offset)==null?void 0:x.x)!=null?S:0),m=((R=(C=s.position)==null?void 0:C.y)!=null?R:0)+((O=(I=s.offset)==null?void 0:I.y)!=null?O:0),f=(z=s.rotation)!=null?z:0,b=($=r.z_index)!=null?$:100,y=(q=r.alpha)!=null?q:1,w=document.createElement("div");w.style.cssText=`
2685
+ `,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=`
2683
2686
  position: absolute;
2684
2687
  top: calc(50% + ${m}px);
2685
2688
  left: calc(50% + ${h}px);
2686
2689
  transform: translate(-50%, -50%) scale(${g}) rotate(${f}deg);
2687
- width: ${u}px;
2688
- height: ${p}px;
2690
+ width: ${p}px;
2691
+ height: ${u}px;
2689
2692
  pointer-events: none;
2690
2693
  z-index: ${b};
2691
2694
  opacity: ${y};
2692
- `,e.appendChild(w);let v;try{v=d.loadAnimation({container:w,renderer:a.renderer||"svg",loop:(B=a.loop)!=null?B:!1,autoplay:(F=a.autoplay)!=null?F:!0,animationData:c})}catch(D){return w.parentNode&&w.parentNode.removeChild(w),console.warn(`[LottieOverlay] Failed to start animation: ${o}`,D),null}a.speed!==void 0&&v.setSpeed(a.speed);let k=()=>{v.destroy(),w.parentNode&&w.parentNode.removeChild(w)};return a.loop||v.addEventListener("complete",k),{animation:v,cleanup:k}}var da=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 la(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 Rr from"pixi.js";var hl=Rr;typeof window!="undefined"&&(window.__basePixi=Rr);import{Sprite as ml,Text as fl,TextStyle as bl,Texture as Or}from"pixi.js";var zr=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,u,p,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,k]of i.objects.entries()){if(s!=null&&s.has(v)||a&&!a.has(v)||(k==null?void 0:k.enabled)===!1)continue;let M=(u=(d=k==null?void 0:k.render)==null?void 0:d.asset)==null?void 0:u.path,_=(g=(p=k==null?void 0:k.render)==null?void 0:p.asset)==null?void 0:g.type,T=!!(M&&_==="image"),j=!!((h=k==null?void 0:k.ui)!=null&&h.text),P=j?(m=k==null?void 0:k.ui)==null?void 0:m.renderMode:void 0,L;if(P==="png"&&T?L="png":P==="text"&&j?L="text":T?L="png":j?L="text":L="skip",L!=="skip"){if(L==="text"){let E=yl(v,k);if(!E)continue;let A=k.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):E.anchor.set(.5,.5);let x=k.transform,S=(x==null?void 0:x.position)||(x==null?void 0:x.offset);S&&E.position.set((f=S.x)!=null?f:0,(b=S.y)!=null?b:0);let C=typeof(x==null?void 0:x.scale)=="number"?x.scale:1;E.scale.set(C,C);let R=typeof(x==null?void 0:x.rotation)=="number"?x.rotation:0;E.rotation=zr(R),E.parent||t.addChild(E);try{n.create(v,E)}catch{}r[v]=E,c[v]=E}else if(L==="png"){let E=Ce[v]||(typeof Or!="undefined"?Or.EMPTY:void 0),A=new ml(E);A.label=v;let x=k.render;A.alpha=typeof(x==null?void 0:x.alpha)=="number"?x.alpha:1,A.visible=(x==null?void 0:x.visible)!==!1,A.zIndex=typeof(x==null?void 0:x.z_index)=="number"?x.z_index:0,x!=null&&x.anchor&&typeof x.anchor.x=="number"&&typeof x.anchor.y=="number"&&A.anchor.set(x.anchor.x,x.anchor.y);let S=k.transform,C=(S==null?void 0:S.position)||(S==null?void 0:S.offset);C&&A.position.set((y=C.x)!=null?y:0,(w=C.y)!=null?w:0);let R=typeof(S==null?void 0:S.scale)=="number"?S.scale:1;A.scale.set(R,R);let I=typeof(S==null?void 0:S.rotation)=="number"?S.rotation:0;A.rotation=zr(I),A.parent||t.addChild(A);try{n.create(v,A)}catch{}r[v]=A,l[v]=A}}}return t.parent||e.addChild(t),{objects:r,sprites:l,texts:c}}var pa=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 Te.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 Te.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},$r=new pa,wl=new Proxy($r,{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){$r.init(o,e)}var ua=class extends Yt{async init(){nn(this.context.config,this.context.app),await Ce.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{xs as a,la as b,Ji as c,Zi as d,Qi as e,Vt as f,rl as g,ol as h,ll as i,cl as j,Xn as k,gl as l,Te as m,da as n,Yt as o,Wt as p,hl as q,vl as r,wl as s,xl as t,ua as u,wi as v,Xr as w,hn as x,ze as y,we as z,$e as A,mn as B,go as C,Sl as D,Ss as E,Es as F,un as G,ct as H,Ol as I,Gi as J,qn as K,hr as L,Yn as M,Yp as N,Wp as O,Fe as P,Vo as Q,Yo as R,Zn as S,Ie as T,Ne as U};
2695
+ `,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};