handler-playable-sdk 0.3.55 → 0.3.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./chunk-LV4HGC5G.js";import{c as ot,d as Rt,e as Ri,g as Qn,h as Ii,j as Oi,k as ea,l as ta,m as ji,n as Di,o as ia}from"./chunk-ZLL42OOV.js";import{a as Yr}from"./chunk-JXBG6UFL.js";import{Application as Hs}from"pixi.js";var Ce={};function Ot(a,e,t=!1){Ce[a]||(Ce[a]=[]),Ce[a].push({fn:e,once:t})}function zi(a,e){if(Ce[a]){if(!e){delete Ce[a];return}Ce[a]=Ce[a].filter(t=>t.fn!==e)}}function jt(a,...e){let t=Ce[a];if(t)for(let i of[...t])i.fn(...e),i.once&&zi(a,i.fn)}function ee(a,e){Ot(a,e,!0)}var G=null,ne=[],Ne=null;function ra(a){G=a,ne=[],Ne!==null&&(clearTimeout(Ne),Ne=null)}function sa(){var a,e,t;return{endpoint:(G==null?void 0:G.endpoint)||"",transport:(G==null?void 0:G.transport)||"beacon",batchSize:(a=G==null?void 0:G.batchSize)!=null?a:10,flushIntervalMs:(e=G==null?void 0:G.flushIntervalMs)!=null?e:300,maxQueue:(t=G==null?void 0:G.maxQueue)!=null?t:200,debug:!!(G!=null&&G.debug)}}async function na(a,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(a,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function Hi(a,e){let t=sa();if(e&&t.endpoint){if(ne.push(a),ne.length>t.maxQueue&&(ne=ne.slice(ne.length-t.maxQueue)),ne.length>=t.batchSize){aa();return}Ne===null&&(Ne=window.setTimeout(()=>{Ne=null,aa()},t.flushIntervalMs))}}async function aa(){let a=sa();if(!a.endpoint||ne.length===0)return;let e=ne.splice(0,a.batchSize);await na(a.endpoint,{events:e},a.transport,a.debug),ne.length>0&&await na(a.endpoint,{events:ne.splice(0,a.batchSize)},a.transport,a.debug)}function oa(a){return Math.max(0,Math.min(1,a))}function Wr(a){let e=String(a!=null?a:"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 lt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Kr(a,e){let t=a==null?void 0:a[e];return typeof t=="number"?t:0}function la(a,e,t){try{a[e]=t}catch{}}function Xr(a){let e=a==null?void 0:a.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 ca(a,e){let t=a==null?void 0:a.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 da(a,e){let t=Xr(a);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 pa(){let a=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),a.size>0&&i()})},n=p=>{var u;a.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},r=p=>{a.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},s=p=>{p.killed||(p.killed=!0,r(p))},o=()=>{var d,u;let p=lt();for(let g of Array.from(a)){if(g.killed||g.paused)continue;let f=p-g.startMs-g.delayMs;if(f<0)continue;let h=g.durationMs>0?f/g.durationMs:1,m=oa(h),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(h),b-1):0;if(g.repeat>0&&h>=1){let w=h-y;m=oa(w)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let w of g.props)la(g.target,w.key,w.from+(w.to-w.from)*v);g.scaleFrom&&g.scaleTo&&ca(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(d=g.onUpdate)==null||d.call(g)}catch{}if(h>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(p,d,u)=>{var w;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),f=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((w=u==null?void 0:u.delayMsOverride)!=null?w:0)),h=Wr(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let C of Object.keys(d)){if(y.has(C))continue;let k=d[C];typeof k=="number"&&v.push({key:C,from:Kr(p,C),to:k})}let x=da(p,d);return{target:p,startMs:lt(),delayMs:f,durationMs:g,ease:h,props:v,scaleFrom:x.from,scaleTo:x.to,repeat:m,yoyo:b,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return n(u),{kill:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=lt())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:lt(),f=lt()-g;u.startMs+=f,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let g of Object.keys(d)){let f=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof f=="number"&&la(p,g,f)}let u=da(p,d);u.to&&ca(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))s(u)},timeline(p={}){let d=[],u=0,g=!1,f=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{d.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,x){return m({kind:"to",target:y,vars:v,atMs:h(x)}),b},fromTo(y,v,x,w){return m({kind:"fromTo",target:y,vars:x,from:v,atMs:h(w)}),b},play(){var y,v;if(g)return b;g=!0,f=[];for(let x of d)x.kind==="fromTo"&&c.set(x.target,(y=x.from)!=null?y:{}),f.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((v=x.vars.delay)!=null?v:0)}));return b},pause(){for(let y of f)y.pause();return b},kill(){for(let y of f)y.kill();f=[],g=!1}};return p.paused||b.play(),b}};return c}function ua(){if(typeof window=="undefined")return;let a=window;if(!a.gsap)try{a.gsap=pa()}catch{}}var ga={name:"handler-playable-sdk",version:"0.3.55",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var te=0,Zr=te++,ha=te++,fa=te++,ma=te++,ba=te++,ya=te++,va=te++,xa=te++,wa=te++,Ea=te++,Aa=te++,Sa=te++,F=Zr;function Ca(){return F===ha}function La(){return F===fa}function Ta(){return F===ma}function ka(){return F===ba}function Fe(){return F===ya}function Ue(){return F===va}function Pa(){return F===xa}function Ma(){return F===wa}function _a(){return F===Ea}function $i(){return F===Aa}function Bi(){return F===Sa}function Ra(){let a=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(a==="mraid")try{mraid.getState(),F=ha;return}catch{}else if(a==="dapi")try{dapi.isReady(),F=fa;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(F=ma)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(F=ba)}catch{}else if(e==="mintegral")window.gameReady&&(F=ya);else if(e==="tapjoy")window.TJ_API&&(F=va);else if(e==="tiktok")window.openAppStore&&(F=xa);else if(e==="smadex")try{window.smxTracking&&(F=wa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(F=Ea)}catch{}else e==="vungle"?F=Aa:(a==="nucleo"||e==="nucleo")&&(F=Sa)}import Ni from"lottie-web";var Ia=Ni;typeof window!="undefined"&&(window.lottie=Ni,window.__baseLottie=Ni);function q(a,e){let t=(n,r)=>r===0?n:t(r,n%r),i=t(a,e);return`${a/i}:${e/i}`}var Oo=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:q(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:q(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:q(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:q(360,780)}],jo=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:q(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:q(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:q(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:q(412,915)}],Do=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:q(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:q(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:q(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:q(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:q(800,1280)}],Fi=[{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:q(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:q(768,1024),mraidScale:.7}];var Oa=[...Fi],ja=[{category:"playable",label:"Playable Ad",devices:Fi}],Ui=Fi[0];function Ge(a){return Oa.find(e=>e.id===a)||Ui}function zo(a){return Oa.filter(e=>e.category===a)}var Dt=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all"}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
1
+ import{c as Ri,d as le,e as Ii}from"./chunk-I5OOVR5U.js";import{i as jt}from"./chunk-LV4HGC5G.js";import{c as ot,d as It,e as lt,g as Qn,h as Oi,j as ji,k as Ot,l as ea,m as ta,n as Di,o as ia}from"./chunk-ZLL42OOV.js";import{a as Yr}from"./chunk-JXBG6UFL.js";import{Application as Hs}from"pixi.js";var Ce={};function Dt(a,e,t=!1){Ce[a]||(Ce[a]=[]),Ce[a].push({fn:e,once:t})}function zi(a,e){if(Ce[a]){if(!e){delete Ce[a];return}Ce[a]=Ce[a].filter(t=>t.fn!==e)}}function zt(a,...e){let t=Ce[a];if(t)for(let i of[...t])i.fn(...e),i.once&&zi(a,i.fn)}function ee(a,e){Dt(a,e,!0)}var G=null,ne=[],Ne=null;function ra(a){G=a,ne=[],Ne!==null&&(clearTimeout(Ne),Ne=null)}function sa(){var a,e,t;return{endpoint:(G==null?void 0:G.endpoint)||"",transport:(G==null?void 0:G.transport)||"beacon",batchSize:(a=G==null?void 0:G.batchSize)!=null?a:10,flushIntervalMs:(e=G==null?void 0:G.flushIntervalMs)!=null?e:300,maxQueue:(t=G==null?void 0:G.maxQueue)!=null?t:200,debug:!!(G!=null&&G.debug)}}async function na(a,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(a,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function Hi(a,e){let t=sa();if(e&&t.endpoint){if(ne.push(a),ne.length>t.maxQueue&&(ne=ne.slice(ne.length-t.maxQueue)),ne.length>=t.batchSize){aa();return}Ne===null&&(Ne=window.setTimeout(()=>{Ne=null,aa()},t.flushIntervalMs))}}async function aa(){let a=sa();if(!a.endpoint||ne.length===0)return;let e=ne.splice(0,a.batchSize);await na(a.endpoint,{events:e},a.transport,a.debug),ne.length>0&&await na(a.endpoint,{events:ne.splice(0,a.batchSize)},a.transport,a.debug)}function oa(a){return Math.max(0,Math.min(1,a))}function Wr(a){let e=String(a!=null?a:"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 ct(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Kr(a,e){let t=a==null?void 0:a[e];return typeof t=="number"?t:0}function la(a,e,t){try{a[e]=t}catch{}}function Xr(a){let e=a==null?void 0:a.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 ca(a,e){let t=a==null?void 0:a.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 da(a,e){let t=Xr(a);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 pa(){let a=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),a.size>0&&i()})},n=d=>{var u;a.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},r=d=>{a.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,r(d))},o=()=>{var p,u;let d=ct();for(let g of Array.from(a)){if(g.killed||g.paused)continue;let f=d-g.startMs-g.delayMs;if(f<0)continue;let h=g.durationMs>0?f/g.durationMs:1,m=oa(h),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(h),b-1):0;if(g.repeat>0&&h>=1){let w=h-y;m=oa(w)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let w of g.props)la(g.target,w.key,w.from+(w.to-w.from)*v);g.scaleFrom&&g.scaleTo&&ca(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(h>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var w;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),f=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((w=u==null?void 0:u.delayMsOverride)!=null?w:0)),h=Wr(p.ease),m=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"]),v=[];for(let C of Object.keys(p)){if(y.has(C))continue;let k=p[C];typeof k=="number"&&v.push({key:C,from:Kr(d,C),to:k})}let x=da(d,p);return{target:d,startMs:ct(),delayMs:f,durationMs:g,ease:h,props:v,scaleFrom:x.from,scaleTo:x.to,repeat:m,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=ct())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:ct(),f=ct()-g;u.startMs+=f,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let f=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof f=="number"&&la(d,g,f)}let u=da(d,p);u.to&&ca(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))s(u)},timeline(d={}){let p=[],u=0,g=!1,f=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{p.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,x){return m({kind:"to",target:y,vars:v,atMs:h(x)}),b},fromTo(y,v,x,w){return m({kind:"fromTo",target:y,vars:x,from:v,atMs:h(w)}),b},play(){var y,v;if(g)return b;g=!0,f=[];for(let x of p)x.kind==="fromTo"&&c.set(x.target,(y=x.from)!=null?y:{}),f.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((v=x.vars.delay)!=null?v:0)}));return b},pause(){for(let y of f)y.pause();return b},kill(){for(let y of f)y.kill();f=[],g=!1}};return d.paused||b.play(),b}};return c}function ua(){if(typeof window=="undefined")return;let a=window;if(!a.gsap)try{a.gsap=pa()}catch{}}var ga={name:"handler-playable-sdk",version:"0.3.56",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var te=0,Zr=te++,ha=te++,fa=te++,ma=te++,ba=te++,ya=te++,va=te++,xa=te++,wa=te++,Ea=te++,Aa=te++,Sa=te++,F=Zr;function Ca(){return F===ha}function Ta(){return F===fa}function La(){return F===ma}function ka(){return F===ba}function Fe(){return F===ya}function Ue(){return F===va}function Pa(){return F===xa}function Ma(){return F===wa}function _a(){return F===Ea}function $i(){return F===Aa}function Bi(){return F===Sa}function Ra(){let a=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(a==="mraid")try{mraid.getState(),F=ha;return}catch{}else if(a==="dapi")try{dapi.isReady(),F=fa;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(F=ma)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(F=ba)}catch{}else if(e==="mintegral")window.gameReady&&(F=ya);else if(e==="tapjoy")window.TJ_API&&(F=va);else if(e==="tiktok")window.openAppStore&&(F=xa);else if(e==="smadex")try{window.smxTracking&&(F=wa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(F=Ea)}catch{}else e==="vungle"?F=Aa:(a==="nucleo"||e==="nucleo")&&(F=Sa)}import Ni from"lottie-web";var Ia=Ni;typeof window!="undefined"&&(window.lottie=Ni,window.__baseLottie=Ni);function q(a,e){let t=(n,r)=>r===0?n:t(r,n%r),i=t(a,e);return`${a/i}:${e/i}`}var Oo=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:q(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:q(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:q(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:q(360,780)}],jo=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:q(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:q(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:q(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:q(412,915)}],Do=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:q(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:q(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:q(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:q(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:q(800,1280)}],Fi=[{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:q(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:q(768,1024),mraidScale:.7}];var Oa=[...Fi],ja=[{category:"playable",label:"Playable Ad",devices:Fi}],Ui=Fi[0];function Ge(a){return Oa.find(e=>e.id===a)||Ui}function zo(a){return Oa.filter(e=>e.category===a)}var Ht=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all"}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
2
2
  <div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects" style="left:16px; top:72px;">
3
3
  <div class="scene-panel-header" data-panel-handle>
4
4
  <div class="panel-title">
@@ -31,9 +31,9 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
31
31
  <div class="scene-object-list" data-object-list></div>
32
32
  </div>
33
33
  </div>
34
- `}initialize(e,t){var n,r,s,o,l;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(n=this.root)==null?void 0:n.querySelector("[data-object-list]"),this.searchInput=(r=this.root)==null?void 0:r.querySelector("#scene-object-search"),(s=this.searchInput)==null||s.addEventListener("input",()=>this.refreshObjects());let i=(o=this.root)==null?void 0:o.querySelector("#scene-screen-filter");if(i){try{let c=window.localStorage.getItem(this.getScreenFilterStorageKey());c&&(this.screenFilter=c)}catch{}i.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}i.addEventListener("change",()=>{let c=i.value||"all";this.screenFilter=c;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(l=this.root)==null||l.addEventListener("click",c=>{let p=c.target;if(!p)return;let d=p.closest("[data-object-id]");if(!d)return;let u=d.dataset.objectId;u&&this.select(u)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects())}setSelected(e){var s,o,l,c,p;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{d.classList.toggle("selected",d.dataset.objectId===e)});let i=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumbs]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-screen]"),r=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&r)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,u),f={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),m=this.formatDisplayName(h);n.textContent=f[g]||g,r.textContent=m,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let n=e();if(!Array.isArray(n)||n.length===0){let d=window.__editableObjectConfigs;d&&typeof d.keys=="function"&&(n=Array.from(d.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let r=(((p=this.searchInput)==null?void 0:p.value)||"").trim().toLowerCase(),s=["loading","start","gameplay","tutorial","endgame"],o=Object.fromEntries(s.map(d=>[d,[]])),l=Object.fromEntries(s.map(d=>[d,[]]));n.forEach(d=>{var O,j,T,E;let u=typeof t=="function"?t(d):null;if(!u){let S=window.__editableObjectConfigs;S&&typeof S.get=="function"&&(u=(O=S.get(d))!=null?O:null)}let g=(((j=u==null?void 0:u.identity)==null?void 0:j.category)||"scene").toString(),f=(((T=u==null?void 0:u.identity)==null?void 0:T.id)||d).toString(),h=g.toLowerCase(),m=f.toLowerCase(),b=h.includes("ui")||m.startsWith("ui")||m.includes("label"),y=this.formatDisplayName(f||d),v=((E=u==null?void 0:u.render)==null?void 0:E.visible)===!1||(u==null?void 0:u.enabled)===!1,x=this.getObjectType(u),w={id:d,label:y,category:g,isUi:b,isUnused:v,objectType:x},C=this.inferScreen(w.id,u);if(this.screenFilter!=="all"&&C!==this.screenFilter||!(!r||w.id.toLowerCase().includes(r)||w.label.toLowerCase().includes(r)))return;(w.isUnused?l:o)[C].push(w)});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"};this.listContainer.innerHTML=`
35
- ${s.map(d=>this.renderGroup(c[d],[...o[d],...l[d]])).join("")}
36
- `,this.setSelected(this.selectedId)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var o,l;let i=window.__HANDLER_SCREEN_INDEX,n=(o=i==null?void 0:i.instanceToScreen)==null?void 0:o[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let r=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${r}`.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,r,s,o,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(r=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&r.endsWith(".json")?"animation":((o=(s=e.render)==null?void 0:s.asset)==null?void 0:o.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(p=(c=e.gameplay)==null?void 0:c.tuning)!=null&&p.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(r=>{var p,d;let s=typeof i=="function"?i(r.id):null;if(!s){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(s=(p=u.get(r.id))!=null?p:null)}let o=this.getTypeIconByType(r.objectType),l=this.getAssetPreview(s),c=(d=s==null?void 0:s.ui)!=null&&d.text?`"${s.ui.text.substring(0,12)}${s.ui.text.length>12?"...":""}"`:"";return`
34
+ `}initialize(e,t){var n,r,s,o,l;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(n=this.root)==null?void 0:n.querySelector("[data-object-list]"),this.searchInput=(r=this.root)==null?void 0:r.querySelector("#scene-object-search"),(s=this.searchInput)==null||s.addEventListener("input",()=>this.refreshObjects());let i=(o=this.root)==null?void 0:o.querySelector("#scene-screen-filter");if(i){try{let c=window.localStorage.getItem(this.getScreenFilterStorageKey());c&&(this.screenFilter=c)}catch{}i.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}i.addEventListener("change",()=>{let c=i.value||"all";this.screenFilter=c;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(l=this.root)==null||l.addEventListener("click",c=>{let d=c.target;if(!d)return;let p=d.closest("[data-object-id]");if(!p)return;let u=p.dataset.objectId;u&&this.select(u)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects())}setSelected(e){var s,o,l,c,d;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(p=>{p.classList.toggle("selected",p.dataset.objectId===e)});let i=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumbs]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-screen]"),r=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&r)if(e){let p=window.getEditableObjectConfig,u=typeof p=="function"?p(e):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,u),f={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((d=u==null?void 0:u.identity)==null?void 0:d.id)||e).toString(),m=this.formatDisplayName(h);n.textContent=f[g]||g,r.textContent=m,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var d;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let n=e();if(!Array.isArray(n)||n.length===0){let p=window.__editableObjectConfigs;p&&typeof p.keys=="function"&&(n=Array.from(p.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let r=(((d=this.searchInput)==null?void 0:d.value)||"").trim().toLowerCase(),s=["loading","start","gameplay","tutorial","endgame"],o=Object.fromEntries(s.map(p=>[p,[]])),l=Object.fromEntries(s.map(p=>[p,[]]));n.forEach(p=>{var O,j,L,E;let u=typeof t=="function"?t(p):null;if(!u){let S=window.__editableObjectConfigs;S&&typeof S.get=="function"&&(u=(O=S.get(p))!=null?O:null)}let g=(((j=u==null?void 0:u.identity)==null?void 0:j.category)||"scene").toString(),f=(((L=u==null?void 0:u.identity)==null?void 0:L.id)||p).toString(),h=g.toLowerCase(),m=f.toLowerCase(),b=h.includes("ui")||m.startsWith("ui")||m.includes("label"),y=this.formatDisplayName(f||p),v=((E=u==null?void 0:u.render)==null?void 0:E.visible)===!1||(u==null?void 0:u.enabled)===!1,x=this.getObjectType(u),w={id:p,label:y,category:g,isUi:b,isUnused:v,objectType:x},C=this.inferScreen(w.id,u);if(this.screenFilter!=="all"&&C!==this.screenFilter||!(!r||w.id.toLowerCase().includes(r)||w.label.toLowerCase().includes(r)))return;(w.isUnused?l:o)[C].push(w)});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"};this.listContainer.innerHTML=`
35
+ ${s.map(p=>this.renderGroup(c[p],[...o[p],...l[p]])).join("")}
36
+ `,this.setSelected(this.selectedId)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var o,l;let i=window.__HANDLER_SCREEN_INDEX,n=(o=i==null?void 0:i.instanceToScreen)==null?void 0:o[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let r=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${r}`.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,r,s,o,l,c,d;return e?(t=e.ui)!=null&&t.text?"text":(r=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&r.endsWith(".json")?"animation":((o=(s=e.render)==null?void 0:s.asset)==null?void 0:o.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(d=(c=e.gameplay)==null?void 0:c.tuning)!=null&&d.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(r=>{var d,p;let s=typeof i=="function"?i(r.id):null;if(!s){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(s=(d=u.get(r.id))!=null?d:null)}let o=this.getTypeIconByType(r.objectType),l=this.getAssetPreview(s),c=(p=s==null?void 0:s.ui)!=null&&p.text?`"${s.ui.text.substring(0,12)}${s.ui.text.length>12?"...":""}"`:"";return`
37
37
  <button class="scene-object-item ${r.isUnused?"unused":""}" data-object-id="${r.id}">
38
38
  <span class="scene-object-label">${r.label}</span>
39
39
  ${c?`<span class="scene-object-text-preview">${c}</span>`:""}
@@ -46,7 +46,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
46
46
  ${n}
47
47
  </div>
48
48
  </div>
49
- `}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var i,n,r,s,o,l;if(!e)return"\u{1F4E6}";if((i=e.render)!=null&&i.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((n=e.ui)!=null&&n.text)return"\u{1F4DD}";if(((r=e.identity)==null?void 0:r.category)==="ui")return"\u{1F3A8}";if(e.effects||(o=(s=e.identity)==null?void 0:s.id)!=null&&o.includes("effect"))return"\u2728";if(e.audio)return"\u{1F50A}";let t=((l=e.identity)==null?void 0:l.id)||"";return t.includes("background")?"\u{1F5BC}\uFE0F":t.includes("character")?"\u{1F464}":t.includes("key")?"\u{1F511}":t.includes("draggable")?"\u{1F3AF}":t.includes("machine")?"\u2699\uFE0F":t.includes("tutorial")||t.includes("hand")?"\u{1F446}":"\u{1F4E6}"}getAssetPreview(e){var i;if(!e)return null;let t=(i=e.render)==null?void 0:i.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var i,n,r,s;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((r=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:r.panel_bg_color)||((s=e.ui)==null?void 0:s.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var i,n,r,s;if(!e)return"";let t=[];return((i=e.render)==null?void 0:i.visible)===!1&&t.push("hidden"),((n=e.render)==null?void 0:n.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((r=e.interaction)!=null&&r.clickable||(s=e.ui)!=null&&s.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t;this.selectedId=e,this.setSelected(e),(t=this.options)==null||t.onSelect(e)}};var zt=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
49
+ `}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var i,n,r,s,o,l;if(!e)return"\u{1F4E6}";if((i=e.render)!=null&&i.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((n=e.ui)!=null&&n.text)return"\u{1F4DD}";if(((r=e.identity)==null?void 0:r.category)==="ui")return"\u{1F3A8}";if(e.effects||(o=(s=e.identity)==null?void 0:s.id)!=null&&o.includes("effect"))return"\u2728";if(e.audio)return"\u{1F50A}";let t=((l=e.identity)==null?void 0:l.id)||"";return t.includes("background")?"\u{1F5BC}\uFE0F":t.includes("character")?"\u{1F464}":t.includes("key")?"\u{1F511}":t.includes("draggable")?"\u{1F3AF}":t.includes("machine")?"\u2699\uFE0F":t.includes("tutorial")||t.includes("hand")?"\u{1F446}":"\u{1F4E6}"}getAssetPreview(e){var i;if(!e)return null;let t=(i=e.render)==null?void 0:i.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var i,n,r,s;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((r=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:r.panel_bg_color)||((s=e.ui)==null?void 0:s.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var i,n,r,s;if(!e)return"";let t=[];return((i=e.render)==null?void 0:i.visible)===!1&&t.push("hidden"),((n=e.render)==null?void 0:n.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((r=e.interaction)!=null&&r.clickable||(s=e.ui)!=null&&s.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t;this.selectedId=e,this.setSelected(e),(t=this.options)==null||t.onSelect(e)}};var $t=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
50
50
  <div class="scene-tools-corner-panel ${this.isCollapsed?"collapsed":""}" data-panel="scene-tools-corner">
51
51
  <div class="scene-tools-header" data-tools-header data-panel-handle>
52
52
  <span class="scene-tools-title">Scene Tools</span>
@@ -91,7 +91,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
91
91
  </div>
92
92
  </div>
93
93
  </div>
94
- `}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 c;this.isCollapsed=!this.isCollapsed,(c=this.root)==null||c.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let r=(c,p)=>{var u;let d=(u=this.root)==null?void 0:u.querySelector(`[data-status="${c}"]`);d&&d.classList.toggle("active",p)},s=this.root.querySelector("#debug-highlight-object");s==null||s.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightObject(!!s.checked),r("bounds",s.checked)});let o=this.root.querySelector("#debug-highlight-anchor");o==null||o.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightAnchor(!!o.checked),r("anchor",o.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{r("nudge",l.checked)})}updateInfo(e){}};var Ht=class{constructor(){this.root=null;this.options=null}render(){return`
94
+ `}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 c;this.isCollapsed=!this.isCollapsed,(c=this.root)==null||c.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let r=(c,d)=>{var u;let p=(u=this.root)==null?void 0:u.querySelector(`[data-status="${c}"]`);p&&p.classList.toggle("active",d)},s=this.root.querySelector("#debug-highlight-object");s==null||s.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightObject(!!s.checked),r("bounds",s.checked)});let o=this.root.querySelector("#debug-highlight-anchor");o==null||o.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightAnchor(!!o.checked),r("anchor",o.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{r("nudge",l.checked)})}updateInfo(e){}};var Bt=class{constructor(){this.root=null;this.options=null}render(){return`
95
95
  <div class="nudge-panel hidden" data-panel="nudge-panel">
96
96
  <div class="nudge-panel-header">
97
97
  <span class="nudge-panel-title">Nudge Controls</span>
@@ -148,7 +148,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
148
148
  </div>
149
149
  </div>
150
150
  </div>
151
- `}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(r=>{r.addEventListener("click",()=>{var l,c,p,d;let s=r.dataset.nudge,o=this.getNudgeStep();switch(s){case"up":(l=this.options)==null||l.onNudge(0,-o);break;case"down":(c=this.options)==null||c.onNudge(0,o);break;case"left":(p=this.options)==null||p.onNudge(-o,0);break;case"right":(d=this.options)==null||d.onNudge(o,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(r=>{r.addEventListener("click",()=>{var l;let o=r.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(o)})})}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 $t=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let i=e||{},n=t||{},r={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&&r.slots.length>0)for(let c of r.slots){let p=s.find(d=>(d==null?void 0:d.slotId)&&d.slotId===(c==null?void 0:c.slotId));p!=null&&p.currentAsset&&p.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=p.currentAsset)}let o=i.libraryAssets||{};for(let[c,p]of Object.entries(o)){if(!Array.isArray(p))continue;r.libraryAssets[c]||(r.libraryAssets[c]=[]);let d=new Set((r.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of p){let g=u==null?void 0:u.filename;!g||d.has(g)||(r.libraryAssets[c].unshift(u),d.add(g))}}let l=new Set(r.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return r.categories=Array.from(l),r}render(){return`
151
+ `}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(r=>{r.addEventListener("click",()=>{var l,c,d,p;let s=r.dataset.nudge,o=this.getNudgeStep();switch(s){case"up":(l=this.options)==null||l.onNudge(0,-o);break;case"down":(c=this.options)==null||c.onNudge(0,o);break;case"left":(d=this.options)==null||d.onNudge(-o,0);break;case"right":(p=this.options)==null||p.onNudge(o,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(r=>{r.addEventListener("click",()=>{var l;let o=r.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(o)})})}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 Nt=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let i=e||{},n=t||{},r={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&&r.slots.length>0)for(let c of r.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 o=i.libraryAssets||{};for(let[c,d]of Object.entries(o)){if(!Array.isArray(d))continue;r.libraryAssets[c]||(r.libraryAssets[c]=[]);let p=new Set((r.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)||(r.libraryAssets[c].unshift(u),p.add(g))}}let l=new Set(r.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return r.categories=Array.from(l),r}render(){return`
152
152
  <div class="scene-panel library-panel panel-accent-purple" data-panel="library">
153
153
  <div class="scene-panel-header" data-panel-handle>
154
154
  <div class="panel-title">
@@ -167,57 +167,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
167
167
  </div>
168
168
  <div class="panel-resize-handle" data-panel-resize></div>
169
169
  </div>
170
- `}initialize(e,t){var r,s,o;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-slots]");let i=(s=this.root)==null?void 0:s.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(o=this.root)==null?void 0:o.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}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(),r=this.mergeRegistries(t,n);window.getEditableAssets=()=>r,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();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(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let r=document.createElement("div");r.className="library-category";let s=document.createElement("div");s.className="library-category-header",s.textContent=this.formatCategoryName(i),r.appendChild(s);let o=document.createElement("div");o.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);o.appendChild(c)}r.appendChild(o),this.slotsContainer.appendChild(r)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let r=document.createElement("div");r.className="slot-header";let s=document.createElement("div");s.className="slot-current";let o=document.createElement("img");o.src=`/raw/${e.currentAsset}?t=${t}`,o.alt=e.displayName,o.className="slot-thumbnail",o.onerror=()=>{o.style.display="none"},s.appendChild(o),r.appendChild(s);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let p=document.createElement("div");p.className="slot-asset",p.textContent=e.currentAsset,l.appendChild(c),l.appendChild(p),r.appendChild(l);let d=document.createElement("div");d.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async h=>{h.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(u);let g=document.createElement("button");g.className="slot-reset",g.title="Reset to default",g.textContent="\u21BA",g.addEventListener("click",async h=>{h.stopPropagation(),await this.handleReset(e)}),d.appendChild(g);let f=document.createElement("span");if(f.className="slot-expand-icon",f.textContent=i?"\u25BC":"\u25B6",d.appendChild(f),r.appendChild(d),r.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(r),i){let h=this.createLibraryElement(e,t);n.appendChild(h)}return n}createLibraryElement(e,t){var r;let i=document.createElement("div");i.className="slot-library";let n=((r=this.registry)==null?void 0:r.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(s=>{let o=new Map;for(let c of n)o.set(c.filename,c);for(let c of s)o.has(c.filename)||o.set(c.filename,c);let l=Array.from(o.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let p=document.createElement("div");p.className="library-item";let d=document.createElement("img");d.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,d.alt=c.displayName,d.className="library-thumbnail",d.onerror=()=>{d.style.opacity="0.3"},p.appendChild(d);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,p.appendChild(u),p.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(p)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),r=[],s=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=s.exec(n))!==null;){let l=o[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");r.push({filename:l,displayName:c})}}return r}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}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()}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(" ")}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.")}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(r=>(r.objectId===i||r.slotId===i)&&(!t||r.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var s;let r=(s=this.slotsContainer)==null?void 0:s.querySelector(`[data-slot-id="${n.slotId}"]`);r&&(r.scrollIntoView({behavior:"smooth",block:"center"}),r.classList.add("highlight-pulse"),setTimeout(()=>r.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Bt=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 Nt=class{render(e,t,i,n){let r=i&&i.trim(),s=r?`/raw/${i}`:"";return`
171
- <div class="inspector-property inspector-property-image">
172
- <div class="property-header">
173
- <label class="inspector-property-label">${this.formatLabel(t)}</label>
174
- <div class="property-badges">
175
- <span class="property-badge" title="Image Asset">IMG</span>
176
- </div>
177
- </div>
178
-
179
- <div class="inspector-image-container">
180
- ${r?`
181
- <div class="inspector-image-preview">
182
- <img src="${s}" alt="${t}" onclick="window.open('${s}', '_blank')" />
183
- <div class="preview-overlay">
184
- <span class="preview-resolution" id="res-${e}-${t}">- x -</span>
185
- </div>
186
- </div>
187
- `:`
188
- <div class="inspector-image-placeholder">
189
- <span>No Image Selected</span>
190
- </div>
191
- `}
192
-
193
- <div class="inspector-image-details">
194
- <div class="path-group">
195
- <input type="text"
196
- class="inspector-input inspector-input-path"
197
- value="${i||""}"
198
- data-property-path="${n}"
199
- data-object-id="${e}"
200
- placeholder="path/to/asset.png" />
201
- </div>
202
-
203
- <div class="inspector-image-actions">
204
- <button class="inspector-btn inspector-btn-sm primary" data-action="library" data-path="${n}" data-object="${e}">
205
- \u{1F4DA} Show in Library
206
- </button>
207
- <button class="inspector-btn inspector-btn-sm" data-action="ai-edit" data-path="${n}" data-object="${e}">
208
- \u2728 AI Edit
209
- </button>
210
- <button class="inspector-btn inspector-btn-sm" data-action="upload" data-path="${n}" data-object="${e}">
211
- \u{1F4E4}
212
- </button>
213
- <button class="inspector-btn inspector-btn-sm" data-action="reset" data-path="${n}" data-object="${e}">
214
- \u21BA
215
- </button>
216
- </div>
217
- </div>
218
- </div>
219
- </div>
220
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ft=class{render(e,t,i,n){let r=i||"#000000";return`
170
+ `}initialize(e,t){var r,s,o;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-slots]");let i=(s=this.root)==null?void 0:s.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(o=this.root)==null?void 0:o.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}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(),r=this.mergeRegistries(t,n);window.getEditableAssets=()=>r,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();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(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let r=document.createElement("div");r.className="library-category";let s=document.createElement("div");s.className="library-category-header",s.textContent=this.formatCategoryName(i),r.appendChild(s);let o=document.createElement("div");o.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);o.appendChild(c)}r.appendChild(o),this.slotsContainer.appendChild(r)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let r=document.createElement("div");r.className="slot-header";let s=document.createElement("div");s.className="slot-current";let o=document.createElement("img");o.src=`/raw/${e.currentAsset}?t=${t}`,o.alt=e.displayName,o.className="slot-thumbnail",o.onerror=()=>{o.style.display="none"},s.appendChild(o),r.appendChild(s);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let d=document.createElement("div");d.className="slot-asset",d.textContent=e.currentAsset,l.appendChild(c),l.appendChild(d),r.appendChild(l);let p=document.createElement("div");p.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async h=>{h.stopPropagation(),await this.handleAIEdit(e)}),p.appendChild(u);let g=document.createElement("button");g.className="slot-reset",g.title="Reset to default",g.textContent="\u21BA",g.addEventListener("click",async h=>{h.stopPropagation(),await this.handleReset(e)}),p.appendChild(g);let f=document.createElement("span");if(f.className="slot-expand-icon",f.textContent=i?"\u25BC":"\u25B6",p.appendChild(f),r.appendChild(p),r.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(r),i){let h=this.createLibraryElement(e,t);n.appendChild(h)}return n}createLibraryElement(e,t){var r;let i=document.createElement("div");i.className="slot-library";let n=((r=this.registry)==null?void 0:r.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(s=>{let o=new Map;for(let c of n)o.set(c.filename,c);for(let c of s)o.has(c.filename)||o.set(c.filename,c);let l=Array.from(o.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let d=document.createElement("div");d.className="library-item";let p=document.createElement("img");p.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,p.alt=c.displayName,p.className="library-thumbnail",p.onerror=()=>{p.style.opacity="0.3"},d.appendChild(p);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,d.appendChild(u),d.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(d)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),r=[],s=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=s.exec(n))!==null;){let l=o[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");r.push({filename:l,displayName:c})}}return r}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}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()}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(" ")}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.")}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(r=>(r.objectId===i||r.slotId===i)&&(!t||r.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var s;let r=(s=this.slotsContainer)==null?void 0:s.querySelector(`[data-slot-id="${n.slotId}"]`);r&&(r.scrollIntoView({behavior:"smooth",block:"center"}),r.classList.add("highlight-pulse"),setTimeout(()=>r.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Ft=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 Ut=class{render(e,t,i,n){return""}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Gt=class{render(e,t,i,n){let r=i||"#000000";return`
221
171
  <div class="inspector-property inspector-property-color">
222
172
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
223
173
  <div class="inspector-color-group">
@@ -233,7 +183,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
233
183
  data-object-id="${e}" />
234
184
  </div>
235
185
  </div>
236
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ut=class{render(e,t,i,n){return`
186
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var qt=class{render(e,t,i,n){return`
237
187
  <div class="inspector-property inspector-property-number">
238
188
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
239
189
  <input type="number"
@@ -243,7 +193,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
243
193
  data-object-id="${e}"
244
194
  step="any" />
245
195
  </div>
246
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Gt=class{render(e,t,i,n){let r=String(i||"");return`
196
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Vt=class{render(e,t,i,n){let r=String(i||"");return`
247
197
  <div class="inspector-property inspector-property-text">
248
198
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
249
199
  <div class="inspector-input-group">
@@ -254,7 +204,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
254
204
  data-object-id="${e}" />
255
205
  </div>
256
206
  </div>
257
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var qt=class{render(e,t,i,n){return`
207
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Yt=class{render(e,t,i,n){return`
258
208
  <div class="inspector-property inspector-property-boolean">
259
209
  <label class="inspector-property-label">
260
210
  <input type="checkbox"
@@ -265,7 +215,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
265
215
  <span>${this.formatLabel(t)}</span>
266
216
  </label>
267
217
  </div>
268
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Vt=class{render(e,t,i,n){if(!Array.isArray(i)||i.length===0)return`
218
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Wt=class{render(e,t,i,n){if(!Array.isArray(i)||i.length===0)return`
269
219
  <div class="inspector-property inspector-property-array">
270
220
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
271
221
  <div class="inspector-array-empty">Empty array</div>
@@ -277,7 +227,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
277
227
  ${r}
278
228
  </div>
279
229
  </div>
280
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Yt=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&i&&typeof i=="object")return this.renderLogic(e,t,i,n);let r=[];for(let o in i){let l=i[o],c=`${n}.${o}`,p=this.registry.renderProperty(e,o,l,c);p&&r.push(p)}return r.length===0?"":r.length<=4&&r.every(o=>o.includes("inspector-property"))?`
230
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Kt=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&i&&typeof i=="object")return this.renderLogic(e,t,i,n);let r=[];for(let o in i){let l=i[o],c=`${n}.${o}`,d=this.registry.renderProperty(e,o,l,c);d&&r.push(d)}return r.length===0?"":r.length<=4&&r.every(o=>o.includes("inspector-property"))?`
281
231
  <div class="inspector-subsection">
282
232
  <div class="inspector-subsection-title">${this.formatLabel(t)}</div>
283
233
  <div class="inspector-subsection-content">
@@ -291,7 +241,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
291
241
  ${r.join("")}
292
242
  </div>
293
243
  </div>
294
- `}renderLogic(e,t,i,n){let r=[],s=typeof(i==null?void 0:i.id)=="string"?i.id:"",o={zone:["bottom-left","bottom-right","top-left","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"]},l=(()=>{let p=window,d=Array.isArray(p==null?void 0:p.__HANDLER_LOGIC_OPTIONS)?p.__HANDLER_LOGIC_OPTIONS:[],g=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...d].map(f=>String(f)).filter(f=>f.trim().length>0);return Array.from(new Set(g)).sort((f,h)=>f.localeCompare(h))})(),c=s&&!l.includes(s)?[s,...l]:l;r.push(`
244
+ `}renderLogic(e,t,i,n){let r=[],s=typeof(i==null?void 0:i.id)=="string"?i.id:"",o={zone:["bottom-left","bottom-right","top-left","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"]},l=(()=>{let d=window,p=Array.isArray(d==null?void 0:d.__HANDLER_LOGIC_OPTIONS)?d.__HANDLER_LOGIC_OPTIONS:[],g=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...p].map(f=>String(f)).filter(f=>f.trim().length>0);return Array.from(new Set(g)).sort((f,h)=>f.localeCompare(h))})(),c=s&&!l.includes(s)?[s,...l]:l;r.push(`
295
245
  <div class="inspector-property inspector-property-text">
296
246
  <label class="inspector-property-label">Id</label>
297
247
  <div class="inspector-input-group">
@@ -300,11 +250,11 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
300
250
  data-object-id="${e}"
301
251
  data-logic-id-selector="true">
302
252
  <option value="" ${s?"":"selected"}>None</option>
303
- ${c.map(p=>`<option value="${p}" ${p===s?"selected":""}>${p}</option>`).join("")}
253
+ ${c.map(d=>`<option value="${d}" ${d===s?"selected":""}>${d}</option>`).join("")}
304
254
  </select>
305
255
  </div>
306
256
  </div>
307
- `);for(let p in i){if(p==="id")continue;let d=i[p],u=`${n}.${p}`;if(p==="props"&&d&&typeof d=="object"){let f=[];for(let h in d){let m=d[h],b=`${u}.${h}`,y=o[h];if((h==="targetId"||h==="inputId")&&typeof m=="string"){let v=(()=>{try{let C=window,k=C==null?void 0:C.__editableConfig;if(!(k!=null&&k.objects))return[];let P=[];if(k.objects instanceof Map)for(let O of k.objects.keys())P.push(O);else typeof k.objects=="object"&&P.push(...Object.keys(k.objects));return P.sort()}catch{return[]}})(),x=m||"",w=x&&!v.includes(x)?[x,...v]:v;f.push(`
257
+ `);for(let d in i){if(d==="id")continue;let p=i[d],u=`${n}.${d}`;if(d==="props"&&p&&typeof p=="object"){let f=[];for(let h in p){let m=p[h],b=`${u}.${h}`,y=o[h];if((h==="targetId"||h==="inputId")&&typeof m=="string"){let v=(()=>{try{let C=window,k=C==null?void 0:C.__editableConfig;if(!(k!=null&&k.objects))return[];let P=[];if(k.objects instanceof Map)for(let O of k.objects.keys())P.push(O);else typeof k.objects=="object"&&P.push(...Object.keys(k.objects));return P.sort()}catch{return[]}})(),x=m||"",w=x&&!v.includes(x)?[x,...v]:v;f.push(`
308
258
  <div class="inspector-property inspector-property-text">
309
259
  <label class="inspector-property-label">${this.formatLabel(h)}</label>
310
260
  <div class="inspector-input-group">
@@ -334,14 +284,14 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
334
284
  ${f.join("")}
335
285
  </div>
336
286
  </div>
337
- `);continue}let g=this.registry.renderProperty(e,p,d,u);g&&r.push(g)}return r.length===0?"":`
287
+ `);continue}let g=this.registry.renderProperty(e,d,p,u);g&&r.push(g)}return r.length===0?"":`
338
288
  <div class="inspector-property inspector-property-object">
339
289
  <div class="inspector-object-header">${this.formatLabel(t)}</div>
340
290
  <div class="inspector-object-body">
341
291
  ${r.join("")}
342
292
  </div>
343
293
  </div>
344
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Wt=class{render(e,t,i,n,r){let s=i==null?"":String(i),o=Array.from(new Set(r.map(c=>String(c)))),l=s&&!o.includes(s)?[s,...o]:o;return`
294
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Xt=class{render(e,t,i,n,r){let s=i==null?"":String(i),o=Array.from(new Set(r.map(c=>String(c)))),l=s&&!o.includes(s)?[s,...o]:o;return`
345
295
  <div class="inspector-property inspector-property-text">
346
296
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
347
297
  <div class="inspector-input-group">
@@ -352,7 +302,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
352
302
  </select>
353
303
  </div>
354
304
  </div>
355
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Kt=class{constructor(){this.typeDetector=new Bt,this.imageRenderer=new Nt,this.colorRenderer=new Ft,this.numberRenderer=new Ut,this.textRenderer=new Gt,this.booleanRenderer=new qt,this.arrayRenderer=new Vt,this.objectRenderer=new Yt(this),this.selectRenderer=new Wt}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,r=n==null?void 0:n.schemas;if(!r)return null;let s=String(e||"").split(".").filter(Boolean);if(s.length<2)return null;let o=s[0],l=s.slice(1).join("."),c=r instanceof Map?r.get(o):r==null?void 0:r[o];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.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(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(n)).sort((r,s)=>r.localeCompare(s))}catch{return[]}}renderProperty(e,t,i,n){let r=t.toLowerCase(),s=r==="logic"||r==="logic_id"||r==="logicid",o=r==="id"&&n.toLowerCase().includes("logic");if((s||o)&&typeof i=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,i,n,u)}let c={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"]}[t];if(c&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,c);if((t==="targetId"||t==="inputId")&&typeof i=="string"){let u=this.getObjectIds();return this.selectRenderer.render(e,t,i,n,["",...u])}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}};var qe=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let r=window.getEditableObjectConfig;if(typeof r!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let s=r(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}ot({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let d=window.__editableConfig,u=(p=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?p:s;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let r of i)if(n&&typeof n=="object"&&r in n)n=n[r];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};var Xt=class{constructor(){this.updateManager=new qe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let r=n(t);if(!r)return;let s=this.updateManager.getNestedProperty(r,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,r),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,s);break;case"ai-edit":this.openAIEditor(t,i,s);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,s);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let s=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===r||p.slotId===r)){let p=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),n.slots.push({slotId:r,displayName:r.replace(/_/g," "),objectId:r,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),n.categories&&!n.categories.includes(p)&&n.categories.push(p),n.libraryAssets&&!n.libraryAssets[p]&&(n.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var r;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(n.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(e),l=(r=o==null?void 0:o.identity)==null?void 0:r.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 r=t.split(".").pop()||t;n(r,`Edit ${r} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){let i=document.createElement("input");i.type="file",i.accept="image/*",i.onchange=async n=>{var o;let r=(o=n.target.files)==null?void 0:o[0];if(!r)return;console.log("[QuickActionsBar] Preparing upload for:",r.name);let s=new FileReader;s.onload=async()=>{var c,p,d;let l=s.result;try{let u=window.getEditableObjectConfig,g=u==null?void 0:u(e),f=((c=g==null?void 0:g.identity)==null?void 0:c.category)||(t.split(".")[0]==="render"?"environment":"ui"),m=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:f,filename:r.name,data:l,overwrite:!0})})).json();if(m.success){console.log("[QuickActionsBar] \u2705 Uploaded and saved:",m.path),this.updateManager.updateProperty(e,t,m.path);let b=window.__debugContext;(d=(p=b==null?void 0:b.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,m.path);let y=window.addAssetToRegistry;typeof y=="function"&&y(f,r.name);let v=window.reRenderAssetLibrary;typeof v=="function"&&v(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}else console.error("[QuickActionsBar] \u274C Upload failed:",m.error),alert(`Upload failed: ${m.error}`)}catch(u){console.error("[QuickActionsBar] \u274C Upload error:",u),alert("Upload failed. Check console.")}},s.readAsDataURL(r)},i.click()}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],r=i.slice(1),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(n):typeof s.schemas=="object"&&(o=s.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let s=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,s,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};function Qr(a,e){let t;return function(...n){let r=()=>{clearTimeout(t),a(...n)};clearTimeout(t),t=setTimeout(r,e)}}var Jt=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.rendererRegistry=new Kt,this.updateManager=new qe,this.quickActions=new Xt,window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
305
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Jt=class{constructor(){this.typeDetector=new Ft,this.imageRenderer=new Ut,this.colorRenderer=new Gt,this.numberRenderer=new qt,this.textRenderer=new Vt,this.booleanRenderer=new Yt,this.arrayRenderer=new Wt,this.objectRenderer=new Kt(this),this.selectRenderer=new Xt}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,r=n==null?void 0:n.schemas;if(!r)return null;let s=String(e||"").split(".").filter(Boolean);if(s.length<2)return null;let o=s[0],l=s.slice(1).join("."),c=r instanceof Map?r.get(o):r==null?void 0:r[o];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(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(n)).sort((r,s)=>r.localeCompare(s))}catch{return[]}}renderProperty(e,t,i,n){let r=t.toLowerCase(),s=r==="logic"||r==="logic_id"||r==="logicid",o=r==="id"&&n.toLowerCase().includes("logic");if((s||o)&&typeof i=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,i,n,u)}let c={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"]}[t];if(c&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,c);if((t==="targetId"||t==="inputId")&&typeof i=="string"){let u=this.getObjectIds();return this.selectRenderer.render(e,t,i,n,["",...u])}let d=this.getEnumOptionsFromSchemas(n);if(d)return this.selectRenderer.render(e,t,i,n,d);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}};var qe=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let r=window.getEditableObjectConfig;if(typeof r!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let s=r(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}ot({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let p=window.__editableConfig,u=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:s;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let r of i)if(n&&typeof n=="object"&&r in n)n=n[r];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};var Zt=class{constructor(){this.updateManager=new qe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let r=n(t);if(!r)return;let s=this.updateManager.getNestedProperty(r,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,r),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,s);break;case"ai-edit":this.openAIEditor(t,i,s);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,s);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let s=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===r||d.slotId===r)){let d=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),n.slots.push({slotId:r,displayName:r.replace(/_/g," "),objectId:r,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 r;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(n.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(e),l=(r=o==null?void 0:o.identity)==null?void 0:r.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 r=t.split(".").pop()||t;n(r,`Edit ${r} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){let i=document.createElement("input");i.type="file",i.accept="image/*",i.onchange=async n=>{var o;let r=(o=n.target.files)==null?void 0:o[0];if(!r)return;console.log("[QuickActionsBar] Preparing upload for:",r.name);let s=new FileReader;s.onload=async()=>{var c,d,p;let l=s.result;try{let u=window.getEditableObjectConfig,g=u==null?void 0:u(e),f=((c=g==null?void 0:g.identity)==null?void 0:c.category)||(t.split(".")[0]==="render"?"environment":"ui"),m=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:f,filename:r.name,data:l,overwrite:!0})})).json();if(m.success){console.log("[QuickActionsBar] \u2705 Uploaded and saved:",m.path),this.updateManager.updateProperty(e,t,m.path);let b=window.__debugContext;(p=(d=b==null?void 0:b.options)==null?void 0:d.onPropertyChange)==null||p.call(d,e,t,m.path);let y=window.addAssetToRegistry;typeof y=="function"&&y(f,r.name);let v=window.reRenderAssetLibrary;typeof v=="function"&&v(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}else console.error("[QuickActionsBar] \u274C Upload failed:",m.error),alert(`Upload failed: ${m.error}`)}catch(u){console.error("[QuickActionsBar] \u274C Upload error:",u),alert("Upload failed. Check console.")}},s.readAsDataURL(r)},i.click()}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],r=i.slice(1),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(n):typeof s.schemas=="object"&&(o=s.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let s=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,s,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};function Qr(a,e){let t;return function(...n){let r=()=>{clearTimeout(t),a(...n)};clearTimeout(t),t=setTimeout(r,e)}}var Qt=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.rendererRegistry=new Jt,this.updateManager=new qe,this.quickActions=new Zt,window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
356
306
  <div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector" style="right:16px; top:72px;">
357
307
  <div class="scene-panel-header" data-panel-handle>
358
308
  <div class="panel-title">
@@ -381,7 +331,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
381
331
  </div>
382
332
  ${this.renderConversionButtons(e,t)}
383
333
  </div>
384
- `);let o=["ui","transform","render","gameplay","interaction","audio","effects","physics","motion","identity"];for(let l of o){let c=t[l];if(c){if(!this.showAdvanced&&!this.isSectionMeaningful(l,c,t))continue;i.push(this.renderSection(e,l,c,l))}}for(let l in t)if(!o.includes(l)&&typeof t[l]=="object"&&t[l]!==null){if(!this.showAdvanced&&!this.isSectionMeaningful(l,t[l],t))continue;i.push(this.renderSection(e,l,t[l],l))}this.contentContainer.innerHTML=i.join("")+this.renderFooter(t),this.attachEventListeners()}renderConversionButtons(e,t){var o,l,c,p;let i=!!t.ui,n=((o=t.ui)==null?void 0:o.renderMode)==="png"||((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.type)==="image";if(!(i||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||n)return"";let s=(p=t.ui)!=null&&p.text?"ui.text":"render.asset.path";return`
334
+ `);let o=["ui","transform","render","gameplay","interaction","audio","effects","physics","motion","identity"];for(let l of o){let c=t[l];if(c){if(!this.showAdvanced&&!this.isSectionMeaningful(l,c,t))continue;i.push(this.renderSection(e,l,c,l))}}for(let l in t)if(!o.includes(l)&&typeof t[l]=="object"&&t[l]!==null){if(!this.showAdvanced&&!this.isSectionMeaningful(l,t[l],t))continue;i.push(this.renderSection(e,l,t[l],l))}this.contentContainer.innerHTML=i.join("")+this.renderFooter(t),this.attachEventListeners()}renderConversionButtons(e,t){var o,l,c,d;let i=!!t.ui,n=((o=t.ui)==null?void 0:o.renderMode)==="png"||((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.type)==="image";if(!(i||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||n)return"";let s=(d=t.ui)!=null&&d.text?"ui.text":"render.asset.path";return`
385
335
  <div class="inspector-quick-actions">
386
336
  <button class="debug-btn debug-btn-sm success ai-simple-btn" type="button" data-convert-toggle>
387
337
  \u2728 Convert to PNG
@@ -392,7 +342,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
392
342
  <button class="debug-btn debug-btn-sm" data-action="upload" data-path="render.asset.path" data-object="${e}">\u{1F4E4} Upload</button>
393
343
  </div>
394
344
  </div>
395
- `}renderFooter(e){let t=["motion","effects","ui","audio","physics","interaction","gameplay","visibility"],i=Object.keys(e),n=t.filter(r=>!i.includes(r));return n.length===0?"":`
345
+ `}renderFooter(e){let t=["logic","motion","effects","ui","audio","physics","interaction","gameplay","visibility"],i=Object.keys(e),n=t.filter(r=>!i.includes(r));return n.length===0?"":`
396
346
  <div class="inspector-footer">
397
347
  <div class="inspector-add-component">
398
348
  <select class="inspector-component-select" data-inspector-component-select>
@@ -402,7 +352,7 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
402
352
  <button class="debug-btn debug-btn-sm primary" data-inspector-add-component-btn>Add</button>
403
353
  </div>
404
354
  </div>
405
- `}renderSection(e,t,i,n){let r=[],s=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let o in i){if(!this.showAdvanced&&s.includes(o))continue;let l=i[o],c=`${n}.${o}`,p=this.rendererRegistry.renderProperty(e,o,l,c);p&&r.push(p)}return r.length===0?"":`
355
+ `}renderSection(e,t,i,n){let r=[],s=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let o in i){if(!this.showAdvanced&&s.includes(o))continue;let l=i[o],c=`${n}.${o}`,d=this.rendererRegistry.renderProperty(e,o,l,c);d&&r.push(d)}return r.length===0?"":`
406
356
  <div class="inspector-section" data-section="${t}">
407
357
  <div class="inspector-section-header" data-section-toggle="${t}">
408
358
  <span class="inspector-section-arrow">\u25BC</span>
@@ -413,17 +363,17 @@ import{c as Mi,d as le,e as _i}from"./chunk-I5OOVR5U.js";import{i as It}from"./c
413
363
  ${r.join("")}
414
364
  </div>
415
365
  </div>
416
- `}attachEventListeners(){var c,p,d,u;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Qr((g,f,h)=>{var m,b;this.updateManager.updateProperty(g,f,h),(b=(m=this.options)==null?void 0:m.onPropertyChange)==null||b.call(m,g,f,h)},300);e.forEach(g=>{let f=m=>{var x,w;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId;if(y&&v){let C=b.value;if(b.type==="checkbox")C=b.checked;else if(b.type==="number"&&(C=parseFloat(b.value),isNaN(C)))return;b.type==="text"||b.type==="range"||b.tagName==="TEXTAREA"?t(v,y,C):(this.updateManager.updateProperty(v,y,C),(w=(x=this.options)==null?void 0:x.onPropertyChange)==null||w.call(x,v,y,C))}},h=g.dataset.propertyPath;h==="logic.id"||h!=null&&h.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",h),g.addEventListener("change",async m=>{var O;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId,x=b.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",x),!y||!v)return;await this.updateManager.updateProperty(v,y,x),console.log("[Inspector v1.0.0] Logic ID updated");let w=window,C=(O=w==null?void 0:w.__HANDLER_LOGIC_META)==null?void 0:O[x],k=this.getDefaultPropsForLogic(x,C);console.log("[Inspector v1.0.0] New logic default props:",k);let P=y.replace(".id",".props");await this.updateManager.updateProperty(v,P,k),console.log("[Inspector v1.0.0] Logic props updated to:",k),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(v)})):(g.addEventListener("change",f),(g.tagName==="INPUT"||g.tagName==="TEXTAREA")&&g.addEventListener("input",f))}),this.contentContainer.querySelectorAll("[data-action]").forEach(g=>{g.addEventListener("click",f=>{let h=f.target,m=h.dataset.action,b=h.dataset.path,y=h.dataset.object;m&&b&&y&&this.quickActions.handleAction(m,y,b)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(g=>{g.addEventListener("click",f=>{var b,y;let h=f.target,m=h.dataset.sectionToggle||((b=h.closest("[data-section-toggle]"))==null?void 0:b.getAttribute("data-section-toggle"));if(m){let v=(y=this.contentContainer)==null?void 0:y.querySelector(`[data-section="${m}"]`);v==null||v.classList.toggle("collapsed")}})});let r=(c=this.root)==null?void 0:c.querySelector("[data-inspector-advanced]");r==null||r.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let s=(p=this.root)==null?void 0:p.querySelector("[data-convert-toggle]");s==null||s.addEventListener("click",()=>{var f;let g=(f=this.root)==null?void 0:f.querySelector("[data-convert-menu]");g==null||g.classList.toggle("hidden")});let o=(d=this.contentContainer)==null?void 0:d.querySelector("[data-inspector-add-component-btn]"),l=(u=this.contentContainer)==null?void 0:u.querySelector("[data-inspector-component-select]");o==null||o.addEventListener("click",async()=>{let g=l.value;g&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,g)})}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}let r=window.__editableConfig,s=r==null?void 0:r.schemas,o=null;s instanceof Map?o=s.get(t):s&&typeof s=="object"&&(o=s[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var r,s;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((s=(r=i.render)==null?void 0:r.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=`
366
+ `}attachEventListeners(){var c,d,p,u;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Qr((g,f,h)=>{var m,b;this.updateManager.updateProperty(g,f,h),(b=(m=this.options)==null?void 0:m.onPropertyChange)==null||b.call(m,g,f,h)},300);e.forEach(g=>{let f=m=>{var x,w;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId;if(y&&v){let C=b.value;if(b.type==="checkbox")C=b.checked;else if(b.type==="number"&&(C=parseFloat(b.value),isNaN(C)))return;b.type==="text"||b.type==="range"||b.tagName==="TEXTAREA"?t(v,y,C):(this.updateManager.updateProperty(v,y,C),(w=(x=this.options)==null?void 0:x.onPropertyChange)==null||w.call(x,v,y,C))}},h=g.dataset.propertyPath;h==="logic.id"||h!=null&&h.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",h),g.addEventListener("change",async m=>{var O;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId,x=b.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",x),!y||!v)return;await this.updateManager.updateProperty(v,y,x),console.log("[Inspector v1.0.0] Logic ID updated");let w=window,C=(O=w==null?void 0:w.__HANDLER_LOGIC_META)==null?void 0:O[x],k=this.getDefaultPropsForLogic(x,C);console.log("[Inspector v1.0.0] New logic default props:",k);let P=y.replace(".id",".props");await this.updateManager.updateProperty(v,P,k),console.log("[Inspector v1.0.0] Logic props updated to:",k),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(v)})):(g.addEventListener("change",f),(g.tagName==="INPUT"||g.tagName==="TEXTAREA")&&g.addEventListener("input",f))}),this.contentContainer.querySelectorAll("[data-action]").forEach(g=>{g.addEventListener("click",f=>{let h=f.target,m=h.dataset.action,b=h.dataset.path,y=h.dataset.object;m&&b&&y&&this.quickActions.handleAction(m,y,b)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(g=>{g.addEventListener("click",f=>{var b,y;let h=f.target,m=h.dataset.sectionToggle||((b=h.closest("[data-section-toggle]"))==null?void 0:b.getAttribute("data-section-toggle"));if(m){let v=(y=this.contentContainer)==null?void 0:y.querySelector(`[data-section="${m}"]`);v==null||v.classList.toggle("collapsed")}})});let r=(c=this.root)==null?void 0:c.querySelector("[data-inspector-advanced]");r==null||r.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let s=(d=this.root)==null?void 0:d.querySelector("[data-convert-toggle]");s==null||s.addEventListener("click",()=>{var f;let g=(f=this.root)==null?void 0:f.querySelector("[data-convert-menu]");g==null||g.classList.toggle("hidden")});let o=(p=this.contentContainer)==null?void 0:p.querySelector("[data-inspector-add-component-btn]"),l=(u=this.contentContainer)==null?void 0:u.querySelector("[data-inspector-component-select]");o==null||o.addEventListener("click",async()=>{let g=l.value;g&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,g)})}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}let r=window.__editableConfig,s=r==null?void 0:r.schemas,o=null;s instanceof Map?o=s.get(t):s&&typeof s=="object"&&(o=s[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var r,s;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((s=(r=i.render)==null?void 0:r.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=`
417
367
  <div class="inspector-empty">
418
368
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
419
369
  <span class="inspector-empty-text">${e}</span>
420
370
  </div>
421
- `)}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}getDefaultPropsForLogic(e,t){return{DragToWin:{targetDrags:3},DragSnap:{targetId:"",snapRadius:100,snapDuration:.5,returnOnMiss:!0,returnDuration:.3,ease:"power2.out"},SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},JoystickMove:{speed:200,zone:"bottom-center",offsetX:0,offsetY:-50,inputId:""},Tap:{maxTapDuration:300,maxTapDistance:10,tapCount:1,tapTimeout:500},Swipe:{inputId:"",direction:"any",minDistance:50,maxDuration:1e3},Hold:{holdDuration:500,visualFeedback:!0,feedbackColor:16777215}}[e]||{}}getSectionIcon(e){return{identity:"\u{1F194}",transform:"\u{1F4D0}",render:"\u{1F3A8}",ui:"\u{1F4AC}",gameplay:"\u{1F3AE}",interaction:"\u{1F446}",audio:"\u{1F50A}",effects:"\u2728",motion:"\u{1F3AC}"}[e]||"\u{1F4E6}"}clear(){this.selectedObjectId=null,this.contentContainer&&(this.contentContainer.innerHTML=`
371
+ `)}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}getDefaultPropsForLogic(e,t){return{DragToWin:{targetDrags:3},DragSnap:{targetId:"",snapRadius:100,snapDuration:.5,returnOnMiss:!0,returnDuration:.3,ease:"power2.out"},SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},JoystickMove:{speed:200,zone:"bottom-center",offsetX:0,offsetY:-50,inputId:""},Tap:{maxTapDuration:300,maxTapDistance:10,tapCount:1,tapTimeout:500},Swipe:{inputId:"",direction:"any",minDistance:50,maxDuration:1e3},Hold:{holdDuration:500,visualFeedback:!0,feedbackColor:16777215}}[e]||{}}getSectionIcon(e){return{identity:"\u{1F194}",transform:"\u{1F4D0}",render:"\u{1F3A8}",ui:"\u{1F4AC}",logic:"\u{1F3AE}",gameplay:"\u{1F3AE}",interaction:"\u{1F446}",audio:"\u{1F50A}",effects:"\u2728",motion:"\u{1F3AC}"}[e]||"\u{1F4E6}"}clear(){this.selectedObjectId=null,this.contentContainer&&(this.contentContainer.innerHTML=`
422
372
  <div class="inspector-empty">
423
373
  <span class="inspector-empty-icon">\u{1F3AF}</span>
424
374
  <span class="inspector-empty-text">Select an object to inspect</span>
425
375
  </div>
426
- `)}};import*as Wa from"jszip";function Gi(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function Da(a){var n;let[e,t]=a.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 za(a){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=a})}async function Zt(a){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",a);let i=await fetch(a);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,a),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let r=await Gi(n),s=await za(r),o=Da(r);return console.log("[ImageUtils] Success resolution:",s==null?void 0:s.width,"x",s==null?void 0:s.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:r,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 Le(a){var e,t;try{let i=await Gi(a),n=await za(i),r=Da(i);return{base64:r.base64,mimeType:r.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 Ha(a){return Gi(a).then(e=>e).catch(()=>null)}function qi(a,e){var t;try{let[i,n]=a.split(","),r=i.match(/data:(.*?);base64/),s=(t=r==null?void 0:r[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:s})}catch{return null}}async function Ve(a,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((d,u)=>{let g=new Image;g.onload=()=>d(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=a}),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"),a;n.drawImage(t,0,0);let r=n.getImageData(0,0,i.width,i.height),s=r.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(d=>({r:s[d.offset],g:s[d.offset+1],b:s[d.offset+2]})),c=0;for(let d=0;d<s.length;d+=4){let u=s[d],g=s[d+1],f=s[d+2],h=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(g-m.g,2)+Math.pow(f-m.b,2))<e){h=!0;break}h&&(s[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(r,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),a}}function $a(a,e){if(!a||!e)return"1:1";let t=a/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function fe(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function W(a){return typeof a=="string"?a:void 0}function Ba(a){return a.toLowerCase().endsWith(".png")?a.slice(0,-4):a}function es(a){var i,n,r;let e=(i=W(a.id))!=null?i:W(a.name);if(e)return e;let t=(n=W(a.file))!=null?n:W(a.asset);return t?Ba((r=t.split("/").pop())!=null?r:t):void 0}function ts(a,e,t){var i,n,r;if(typeof e=="string")return{id:a,file:e,role:t};if(fe(e)){let s=(i=W(e.file))!=null?i:W(e.asset);return s?{id:(n=W(e.id))!=null?n:a,file:s,role:(r=W(e.role))!=null?r:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function Vi(a,e){var t,i,n;if(!a)return[];if(Array.isArray(a)){let r=[];for(let s of a){if(typeof s=="string"){let o=Ba((t=s.split("/").pop())!=null?t:s);r.push({id:o,file:s,role:e});continue}if(fe(s)){let o=es(s),l=(i=W(s.file))!=null?i:W(s.asset);if(!o||!l)continue;r.push({id:o,file:l,role:(n=W(s.role))!=null?n:e,dataUrl:W(s.dataUrl),layout:s.layout})}}return r}if(fe(a)){let r=[];for(let[s,o]of Object.entries(a)){let l=ts(s,o,e);l&&r.push(l)}return r}return[]}function is(a){var e,t;return(t=(e=W(a.brand_name))!=null?e:W(a.brandName))!=null?t:W(a.name)}function ns(a){if(fe(a.brand_dna)&&fe(a.brand_dna.colors))return a.brand_dna;if(fe(a.colors)){let e={colors:a.colors};return typeof a.style=="string"&&(e.style=a.style),fe(a.fonts)&&(e.fonts=a.fonts),e}}function as(a){var t;let e=new Map;for(let i of a){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 Yi(a,e={}){var s,o,l;let t=a.filter(fe),i=(o=(s=t.map(is).find(Boolean))!=null?s:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(ns).find(Boolean))!=null?l:{colors:{}},r=[];for(let c of t)"layers"in c&&r.push(...Vi(c.layers,"visual element")),"assets"in c&&r.push(...Vi(c.assets,"visual element")),fe(c.endgame)&&"assets"in c.endgame&&r.push(...Vi(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:as(r)}}import{GoogleGenAI as rs}from"@google/genai";async function Qt(a,e,t=[],i={}){var n,r,s,o,l,c,p;try{if(!(a!=null&&a.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 d=new rs({apiKey:a}),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 f=await d.models.generateContent({model:u,contents:g}),h="",m=(s=(r=(n=f.candidates)==null?void 0:n[0])==null?void 0:r.content)==null?void 0:s.parts;if(m)for(let b of m)b.text&&(h+=b.text);if(!h.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${h.length}`),h}catch(d){throw console.error("[Gemini] API error:",d),(o=d.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=d.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=d.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(p=d.message)!=null&&p.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):d}}import{GoogleGenAI as ss}from"@google/genai";async function Ye(a,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new ss({apiKey:a}),r=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),r.push({inlineData:{mimeType:o.mimeType,data:o.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:r});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 o of s.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,c=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function Na(a){let e=a.brandAssets.map(r=>{let s=`- ${r.id}: ${r.role}`;return r.layout&&(s+=` [pos: ${r.layout.x.toFixed(0)},${r.layout.y.toFixed(0)}, size: ${r.layout.w.toFixed(0)}x${r.layout.h.toFixed(0)}, z: ${r.layout.z}, opacity: ${r.layout.opacity}]`),s}).join(`
376
+ `)}};import*as Wa from"jszip";function Gi(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function Da(a){var n;let[e,t]=a.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 za(a){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=a})}async function ei(a){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",a);let i=await fetch(a);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,a),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let r=await Gi(n),s=await za(r),o=Da(r);return console.log("[ImageUtils] Success resolution:",s==null?void 0:s.width,"x",s==null?void 0:s.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:r,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 Te(a){var e,t;try{let i=await Gi(a),n=await za(i),r=Da(i);return{base64:r.base64,mimeType:r.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 Ha(a){return Gi(a).then(e=>e).catch(()=>null)}function qi(a,e){var t;try{let[i,n]=a.split(","),r=i.match(/data:(.*?);base64/),s=(t=r==null?void 0:r[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:s})}catch{return null}}async function Ve(a,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=a}),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"),a;n.drawImage(t,0,0);let r=n.getImageData(0,0,i.width,i.height),s=r.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],f=s[p+2],h=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(g-m.g,2)+Math.pow(f-m.b,2))<e){h=!0;break}h&&(s[p+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(r,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),a}}function $a(a,e){if(!a||!e)return"1:1";let t=a/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function fe(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function W(a){return typeof a=="string"?a:void 0}function Ba(a){return a.toLowerCase().endsWith(".png")?a.slice(0,-4):a}function es(a){var i,n,r;let e=(i=W(a.id))!=null?i:W(a.name);if(e)return e;let t=(n=W(a.file))!=null?n:W(a.asset);return t?Ba((r=t.split("/").pop())!=null?r:t):void 0}function ts(a,e,t){var i,n,r;if(typeof e=="string")return{id:a,file:e,role:t};if(fe(e)){let s=(i=W(e.file))!=null?i:W(e.asset);return s?{id:(n=W(e.id))!=null?n:a,file:s,role:(r=W(e.role))!=null?r:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function Vi(a,e){var t,i,n;if(!a)return[];if(Array.isArray(a)){let r=[];for(let s of a){if(typeof s=="string"){let o=Ba((t=s.split("/").pop())!=null?t:s);r.push({id:o,file:s,role:e});continue}if(fe(s)){let o=es(s),l=(i=W(s.file))!=null?i:W(s.asset);if(!o||!l)continue;r.push({id:o,file:l,role:(n=W(s.role))!=null?n:e,dataUrl:W(s.dataUrl),layout:s.layout})}}return r}if(fe(a)){let r=[];for(let[s,o]of Object.entries(a)){let l=ts(s,o,e);l&&r.push(l)}return r}return[]}function is(a){var e,t;return(t=(e=W(a.brand_name))!=null?e:W(a.brandName))!=null?t:W(a.name)}function ns(a){if(fe(a.brand_dna)&&fe(a.brand_dna.colors))return a.brand_dna;if(fe(a.colors)){let e={colors:a.colors};return typeof a.style=="string"&&(e.style=a.style),fe(a.fonts)&&(e.fonts=a.fonts),e}}function as(a){var t;let e=new Map;for(let i of a){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 Yi(a,e={}){var s,o,l;let t=a.filter(fe),i=(o=(s=t.map(is).find(Boolean))!=null?s:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(ns).find(Boolean))!=null?l:{colors:{}},r=[];for(let c of t)"layers"in c&&r.push(...Vi(c.layers,"visual element")),"assets"in c&&r.push(...Vi(c.assets,"visual element")),fe(c.endgame)&&"assets"in c.endgame&&r.push(...Vi(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:as(r)}}import{GoogleGenAI as rs}from"@google/genai";async function ti(a,e,t=[],i={}){var n,r,s,o,l,c,d;try{if(!(a!=null&&a.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 rs({apiKey:a}),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 f=await p.models.generateContent({model:u,contents:g}),h="",m=(s=(r=(n=f.candidates)==null?void 0:n[0])==null?void 0:r.content)==null?void 0:s.parts;if(m)for(let b of m)b.text&&(h+=b.text);if(!h.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${h.length}`),h}catch(p){throw console.error("[Gemini] API error:",p),(o=p.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=p.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=p.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=p.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):p}}import{GoogleGenAI as ss}from"@google/genai";async function Ye(a,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new ss({apiKey:a}),r=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),r.push({inlineData:{mimeType:o.mimeType,data:o.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:r});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 o of s.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,c=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function Na(a){let e=a.brandAssets.map(r=>{let s=`- ${r.id}: ${r.role}`;return r.layout&&(s+=` [pos: ${r.layout.x.toFixed(0)},${r.layout.y.toFixed(0)}, size: ${r.layout.w.toFixed(0)}x${r.layout.h.toFixed(0)}, z: ${r.layout.z}, opacity: ${r.layout.opacity}]`),s}).join(`
427
377
  `)||"None",t=a.brandDna?`Colors: ${JSON.stringify(a.brandDna.colors)}, Style: ${a.brandDna.style||"not specified"}`:"Not provided",i=a.gameObjects.map(r=>typeof r=="string"?`- id: ${r}`:`- id: ${r.id}${r.category?`, category: ${r.category}`:""}${r.type?`, type: ${r.type}`:""}`).join(`
428
378
  `),n="";if(a.brandConfig){let r=a.brandConfig,s=[];r.splash&&s.push(`SPLASH: title="${r.splash.title||""}", subtitle="${r.splash.subtitle||""}", button="${r.splash.button_label||""}"`),r.endgame&&s.push(`ENDGAME: title="${r.endgame.title||""}", subtitle="${r.endgame.subtitle||""}", cta="${r.endgame.cta_label||""}"`),r.tutorial&&s.push(`TUTORIAL: text="${r.tutorial.label_text||""}", helper="${r.tutorial.helper_text||""}"`),s.length>0&&(n=`
429
379
  BRAND CONTENT:
@@ -508,7 +458,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
508
458
 
509
459
  OUTPUT:
510
460
  Generate the requested asset matching the brand style.${a.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
511
- `.trim()}function Ua(a){return a.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 Ga(a,e){return!(a.includes("background")&&(a.includes("_1")||a.includes("splash")||a.includes("endgame")||a.includes("main"))||e==="text"||e==="effects"&&a.includes("particle"))}async function qa(a){var s,o;let e=Ua(a.gameObjects),t={gamePrompt:a.gamePrompt,gameObjects:e,brandAssets:a.manifest.assets,brandDna:a.manifest.brand_dna,brandName:a.manifest.brand_name},i=Na(t),n=[];if(a.flatDesignDataUrl)try{let l=Va(a.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 r;try{r=await Qt(a.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."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return os(r,a.gameObjects)}function os(a,e){try{let t=a,i=a.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let r=a.match(/\{[\s\S]*\}/);r&&(t=r[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:a,parsed:!0}:{mappingResult:{mappings:e.map(r=>({game_object:r,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:a,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:a,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function Wi(a,e,t={}){var n;let i=e.mappings.filter(r=>r.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let r=0;r<i.length;r++){let s=i[r];(n=t.onProgress)==null||n.call(t,r+1,i.length,s.game_object);try{let o=await ls(a,s);s.output_dataUrl=o,s.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${s.game_object}:`,o),s.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function ls(a,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&a.manifest){let o=a.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=a.assetFiles.get(o.file);if(l){let c=await Le(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(a.flatDesignDataUrl){let o=Va(a.flatDesignDataUrl);o&&t.push(o)}let i=Ga(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:a.manifest.brand_dna,needsTransparency:i},r=Fa(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await Ye(a.apiKey,r,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await Ve(s)||s}function Va(a){let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function Ya(a,e){let t=a.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,r])=>({id:n,file:String(r),role:"visual element"})):i=[],a.assets=i;for(let n of i){let r=e.get(n.file);if(r){let s=await Le(r);s&&(n.dataUrl=s.dataUrl)}}}var ei=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.mappingResult=null;this.analysisRawResponse=null;this.analysisParsedOk=null;this.analysisParseError=null;this.isAnalyzing=!1;this.isGenerating=!1}get manifest(){return this.normalizedManifest}render(){return`
461
+ `.trim()}function Ua(a){return a.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 Ga(a,e){return!(a.includes("background")&&(a.includes("_1")||a.includes("splash")||a.includes("endgame")||a.includes("main"))||e==="text"||e==="effects"&&a.includes("particle"))}async function qa(a){var s,o;let e=Ua(a.gameObjects),t={gamePrompt:a.gamePrompt,gameObjects:e,brandAssets:a.manifest.assets,brandDna:a.manifest.brand_dna,brandName:a.manifest.brand_name},i=Na(t),n=[];if(a.flatDesignDataUrl)try{let l=Va(a.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 r;try{r=await ti(a.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."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return os(r,a.gameObjects)}function os(a,e){try{let t=a,i=a.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let r=a.match(/\{[\s\S]*\}/);r&&(t=r[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:a,parsed:!0}:{mappingResult:{mappings:e.map(r=>({game_object:r,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:a,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:a,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function Wi(a,e,t={}){var n;let i=e.mappings.filter(r=>r.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let r=0;r<i.length;r++){let s=i[r];(n=t.onProgress)==null||n.call(t,r+1,i.length,s.game_object);try{let o=await ls(a,s);s.output_dataUrl=o,s.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${s.game_object}:`,o),s.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function ls(a,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&a.manifest){let o=a.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=a.assetFiles.get(o.file);if(l){let c=await Te(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(a.flatDesignDataUrl){let o=Va(a.flatDesignDataUrl);o&&t.push(o)}let i=Ga(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:a.manifest.brand_dna,needsTransparency:i},r=Fa(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await Ye(a.apiKey,r,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await Ve(s)||s}function Va(a){let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function Ya(a,e){let t=a.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,r])=>({id:n,file:String(r),role:"visual element"})):i=[],a.assets=i;for(let n of i){let r=e.get(n.file);if(r){let s=await Te(r);s&&(n.dataUrl=s.dataUrl)}}}var ii=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.mappingResult=null;this.analysisRawResponse=null;this.analysisParsedOk=null;this.analysisParseError=null;this.isAnalyzing=!1;this.isGenerating=!1}get manifest(){return this.normalizedManifest}render(){return`
512
462
  <div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
513
463
  <div class="scene-panel-header" data-panel-handle>
514
464
  <div class="panel-title">
@@ -624,7 +574,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
624
574
  </div>
625
575
  <div class="panel-resize-handle" data-panel-resize></div>
626
576
  </div>
627
- `}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,r,s,o,l,c,p,d,u,g,f;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let m=h.dataset.visionTab;this.switchTab(m)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let m=h.target.value;this.switchUploadMethod(m)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(r=this.root.querySelector("[data-vision-upload-zip]"))==null||r.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||m.click()}),(s=this.root.querySelector("[data-vision-zip-input]"))==null||s.addEventListener("change",h=>{this.handleZipUpload(h)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(p=this.root.querySelector("[data-vision-upload-flat]"))==null||p.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||m.click()}),(d=this.root.querySelector("[data-vision-flat-input]"))==null||d.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(f=this.root.querySelector("[data-vision-apply-all]"))==null||f.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let m=h.target;if(!m)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;y&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(y),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(y),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(y),m.closest("[data-mapping-generate-one]")&&this.generateOne(y),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let m=h.target;if(!m||!this.mappingResult)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(x=>x.game_object===y);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let m=h.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(x=>x.game_object===y);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(r){console.error("[BrandVision] ZIP processing failed:",r),this.setStatus("zip",`Error: ${r instanceof Error?r.message:"Unknown error"}`)}}}async processZipFile(e){var s,o;let t=await Wa.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let p=l.toLowerCase();p.endsWith(".json")?i.push({name:l,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((s=t.file(l.name))==null?void 0:s.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let r=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),p=new Blob([c],{type:"image/png"}),d=l.name.split("/").pop()||l.name;console.log(`Processing ${d}, uint8array length: ${c.length}, blob size: ${p.size}`);let u;try{u=await this.blobToDataUrl(p)}catch(m){console.warn(`FileReader failed for ${d}, using fallback:`,m),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${d}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(d.replace(".png",""));console.log(`Saving ${d} to category: ${g}`);let h=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:g,filename:d,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${d}:`,h),h.success){console.log(`\u2705 Saved PNG to library: ${d} (${g}) at ${h.path}`);let m=new File([p],d,{type:"image/png"});r.set(d,m)}else console.warn(`\u274C Failed to save ${d}:`,h.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=r;try{this.normalizedManifest=Yi(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[p,d]of r){let u=await this.fileToDataUrl(d);l.push({id:p.replace(".png",""),filename:p,dataUrl:u,category:this.inferAssetCategory(p.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
577
+ `}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,r,s,o,l,c,d,p,u,g,f;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let m=h.dataset.visionTab;this.switchTab(m)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let m=h.target.value;this.switchUploadMethod(m)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(r=this.root.querySelector("[data-vision-upload-zip]"))==null||r.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||m.click()}),(s=this.root.querySelector("[data-vision-zip-input]"))==null||s.addEventListener("change",h=>{this.handleZipUpload(h)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||m.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(f=this.root.querySelector("[data-vision-apply-all]"))==null||f.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let m=h.target;if(!m)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;y&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(y),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(y),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(y),m.closest("[data-mapping-generate-one]")&&this.generateOne(y),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let m=h.target;if(!m||!this.mappingResult)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(x=>x.game_object===y);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let m=h.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(x=>x.game_object===y);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(r){console.error("[BrandVision] ZIP processing failed:",r),this.setStatus("zip",`Error: ${r instanceof Error?r.message:"Unknown error"}`)}}}async processZipFile(e){var s,o;let t=await Wa.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let d=l.toLowerCase();d.endsWith(".json")?i.push({name:l,content:null}):d.startsWith("assets/")&&d.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((s=t.file(l.name))==null?void 0:s.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let r=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),d=new Blob([c],{type:"image/png"}),p=l.name.split("/").pop()||l.name;console.log(`Processing ${p}, uint8array length: ${c.length}, blob size: ${d.size}`);let u;try{u=await this.blobToDataUrl(d)}catch(m){console.warn(`FileReader failed for ${p}, using fallback:`,m),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${p}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(p.replace(".png",""));console.log(`Saving ${p} to category: ${g}`);let h=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:g,filename:p,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${p}:`,h),h.success){console.log(`\u2705 Saved PNG to library: ${p} (${g}) at ${h.path}`);let m=new File([d],p,{type:"image/png"});r.set(p,m)}else console.warn(`\u274C Failed to save ${p}:`,h.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=r;try{this.normalizedManifest=Yi(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[d,p]of r){let u=await this.fileToDataUrl(p);l.push({id:d.replace(".png",""),filename:d,dataUrl:u,category:this.inferAssetCategory(d.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
628
578
  \u{1F3F7}\uFE0F Brand: ${((o=this.normalizedManifest)==null?void 0:o.brand_name)||"Imported Brand"}`),this.addAssetsToRegistry(l),this.refreshLibrary()}catch(l){console.error("[BrandVision] Failed to normalize ZIP manifest:",l),this.normalizedManifest=null,this.setStatus("zip","\u274C Failed to normalize manifest")}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let r=n.result;console.log("FileReader result type:",typeof r,"length:",r.length),console.log("Data URL prefix:",r.substring(0,30)),t(r)},n.onerror=r=>{console.error("FileReader error:",r),i(r)},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 r of e){let s=r.category||"misc";n[s]||(n[s]=[]),i.libraryAssets[s]||(i.libraryAssets[s]=[]),i.libraryAssets[s].some(l=>l.filename===r.filename)||(i.libraryAssets[s].unshift({filename:r.filename,displayName:r.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${r.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 r;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let s of Array.from(i))try{let o=await s.text(),l=JSON.parse(o);this.uploadedJsons.set(s.name,l),l.layers?n+=`\u2705 Layers: ${s.name}
629
579
  `:l.brand_dna||l.colors?n+=`\u2705 Brand: ${s.name}
630
580
  `:n+=`\u2705 Loaded: ${s.name}
@@ -632,7 +582,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
632
582
  `}try{this.normalizedManifest=Yi(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let s=Array.isArray((r=this.normalizedManifest)==null?void 0:r.assets)?this.normalizedManifest.assets.length:0;n+=`
633
583
  \u{1F4E6} Normalized manifest: ${s} assets`,n+=`
634
584
  \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:s,brandName:this.normalizedManifest.brand_name})}catch(s){console.error("[BrandVision] Failed to normalize manifest:",s),this.normalizedManifest=null,n+=`
635
- \u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",n.trim())}async handleAssetsUpload(e){let i=e.target.files;if(!(!i||i.length===0)){for(let n of Array.from(i))this.assetFiles.set(n.name,n);this.setStatus("assets",`${this.assetFiles.size} files loaded`)}}async handleFlatDesignUpload(e){var r,s;let i=(r=e.target.files)==null?void 0:r[0];if(!i)return;let n=await Le(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let o=(s=this.root)==null?void 0:s.querySelector("[data-vision-flat-preview]");o&&(o.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,r,s,o,l,c;if(this.isAnalyzing)return;let e=(r=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:r.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 Ya(t,this.assetFiles);let p={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},d=await qa(p);this.mappingResult=d.mappingResult,this.analysisRawResponse=d.rawResponse,this.analysisParsedOk=d.parsed,this.analysisParseError=(s=d.parseError)!=null?s:null,this.renderMappings(),d.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(o=this.mappingResult)==null?void 0:o.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${d.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(p){console.error("[BrandVision] Analysis failed:",p),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 r={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Wi(r,this.mappingResult,{onProgress:(s,o,l)=>{this.setStatus("apply",`Generating ${s}/${o}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(r){console.error("[BrandVision] Generation failed:",r),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var o;let e=(o=this.root)==null?void 0:o.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,r=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),s=n?`
585
+ \u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",n.trim())}async handleAssetsUpload(e){let i=e.target.files;if(!(!i||i.length===0)){for(let n of Array.from(i))this.assetFiles.set(n.name,n);this.setStatus("assets",`${this.assetFiles.size} files loaded`)}}async handleFlatDesignUpload(e){var r,s;let i=(r=e.target.files)==null?void 0:r[0];if(!i)return;let n=await Te(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let o=(s=this.root)==null?void 0:s.querySelector("[data-vision-flat-preview]");o&&(o.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,r,s,o,l,c;if(this.isAnalyzing)return;let e=(r=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:r.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 Ya(t,this.assetFiles);let d={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},p=await qa(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=(o=this.mappingResult)==null?void 0:o.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${p.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(d){console.error("[BrandVision] Analysis failed:",d),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let r={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Wi(r,this.mappingResult,{onProgress:(s,o,l)=>{this.setStatus("apply",`Generating ${s}/${o}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(r){console.error("[BrandVision] Generation failed:",r),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var o;let e=(o=this.root)==null?void 0:o.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,r=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),s=n?`
636
586
  <div class="vision-raw-block">
637
587
  <div class="inspector-text-sm" style="white-space: pre-wrap;">
638
588
  \u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
@@ -642,10 +592,10 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
642
592
  </div>
643
593
  `:"";e.innerHTML=`
644
594
  ${s}
645
- ${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",p=l.brand_asset||"",d=(b=t==null?void 0:t.assets)==null?void 0:b.find(y=>y.id===p),u=(d==null?void 0:d.dataUrl)||"",g=l.output_dataUrl||"",f=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",h=!!f,m=`
595
+ ${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||"",f=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",h=!!f,m=`
646
596
  <select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
647
597
  <option value="">Select brand asset\u2026</option>
648
- ${r.replace(`value="${p}"`,`value="${p}" selected`)}
598
+ ${r.replace(`value="${d}"`,`value="${d}" selected`)}
649
599
  </select>
650
600
  `;return`
651
601
  <div class="vision-mapping-item" data-mapping-item="${l.game_object}">
@@ -695,7 +645,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
695
645
  </div>
696
646
  `}).join("")}
697
647
  `}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,r=this.getPreviewValueForMapping(n);if(!r.value)continue;let s=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,r.value):r.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(r=>r.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var r;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=(r=this.mappingResult)==null?void 0:r.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 r=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,r,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,r,s;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(s=(r=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:r.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 o={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Wi(o,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(o){console.error("[BrandVision] generateOne failed:",o),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-JLWPHR4L.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 o=window.addAssetToRegistry;typeof o=="function"&&o(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(s.path)}catch(r){return console.error("[BrandVision] Save to library error:",r),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(o=>o.slotId===e||o.currentAsset===e);if(s!=null&&s.category)return String(s.category)}let r=n==null?void 0:n.categories;if(Array.isArray(r)&&r.length>0){let s=e.toLowerCase(),o=l=>r.find(c=>c.toLowerCase().includes(l));return s.includes("bg")||s.includes("background")?o("background")||r[0]:(s.includes("cta")||s.includes("button")||s.includes("ui")||s.includes("logo"))&&o("ui")||r[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 r;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=(r=this.root)==null?void 0:r.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,r=o=>{let l=Math.max(300,n+(o.clientX-i));this.root.style.width=`${l}px`},s=()=>{window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",s)};window.addEventListener("pointermove",r),window.addEventListener("pointerup",s)})}refresh(){}};function Ka(a,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${a}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
698
- `)}var cs=["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"],ds=["cta_hint","cta_label_end"],Xa=[{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"}],ps=["brand.primary","brand.heading","brand.body","brand.warning"],ti=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`
648
+ `)}var cs=["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"],ds=["cta_hint","cta_label_end"],Xa=[{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"}],ps=["brand.primary","brand.heading","brand.body","brand.warning"],ni=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`
699
649
  <div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
700
650
  <div class="scene-panel-header" data-panel-handle>
701
651
  <div class="panel-title">
@@ -758,12 +708,12 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
758
708
  <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" />
759
709
  <circle cx="12" cy="12" r="3.2" />
760
710
  </svg>
761
- `,c.addEventListener("click",()=>{this.previewAsset(i,o.value,o.dataset.assetType,d)});let p=document.createElement("button");p.type="button",p.className="customize-icon-btn",p.title="Upload asset",p.innerHTML=`
711
+ `,c.addEventListener("click",()=>{this.previewAsset(i,o.value,o.dataset.assetType,p)});let d=document.createElement("button");d.type="button",d.className="customize-icon-btn",d.title="Upload asset",d.innerHTML=`
762
712
  <svg viewBox="0 0 24 24" aria-hidden="true">
763
713
  <path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
764
714
  <path d="M5 14v4h14v-4h2v6H3v-6h2z" />
765
715
  </svg>
766
- `;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var f;let g=(f=d.files)==null?void 0:f[0];g&&this.handleAssetUpload(g,o,i)}),p.addEventListener("click",()=>d.click()),l.appendChild(c),l.appendChild(p),l.appendChild(d),r.appendChild(s),r.appendChild(o),r.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(r)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",cs.forEach(t=>{var l,c,p;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 r=document.createElement("span");r.textContent=t.replace(/_/g," ");let s=document.createElement("input");s.type="color",s.value=i,s.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=i,o.className="customize-color-text",o.dataset.colorTextKey=t,s.addEventListener("input",()=>{o.value=s.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(s.value=o.value)}),n.appendChild(r),n.appendChild(s),n.appendChild(o),(p=this.colorsContainer)==null||p.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",ps.forEach(t=>{var s,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(s=e==null?void 0:e[t])!=null?s:t,r.className="customize-input",r.dataset.fontKey=t,i.appendChild(n),i.appendChild(r),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",ds.forEach(t=>{var s,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(s=this.readUiValue(e,t))!=null?s:"",r.className="customize-input",r.dataset.textKey=t,i.appendChild(n),i.appendChild(r),(o=this.textsContainer)==null||o.appendChild(i)}),Xa.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=t;let s=document.createElement("input");s.type="text",s.value=(o=this.getObjectTextValue(i))!=null?o:"",s.className="customize-input",s.dataset.objectTextKey=t,n.appendChild(r),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 o,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.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((o=e==null?void 0:e[i])!=null?o:""),s.className="customize-input",s.dataset.audioKey=i,i.includes("file")&&(s.placeholder="audio file path"),n.appendChild(r),n.appendChild(s),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),r=e;for(let s of n){if(r==null)return null;r=r[s]}return typeof r=="string"?r:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,r;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(r=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?r:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let r=t.split("."),s=n;for(let o of r){if(s==null)return null;s=s[o]}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(o=>{let l=o;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(o=>{let l=o,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(o=>{let l=o,c=l.dataset.fontKey;c&&(n[c]=l.value)});let r={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(r[c]=l.value)});let s={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let p=parseFloat(l.value);s[c]=isNaN(p)?0:p}else s[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let p=Xa.find(d=>d.key===c);p&&this.applyObjectPropertyValue(p.objectId,p.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:r,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 Zt(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,r,s;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(r=(n=o==null?void 0:o.value)==null?void 0:n.trim())!=null?r:""}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 r=document.createElement("img");r.className="ai-gallery-thumb",r.alt=t;let s=this.resolveAssetUrls(i);s[0]&&(r.src=s[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(r),n.appendChild(o),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var s,o;let i=t,n=i.dataset.assetKey,r=(o=(s=i.value)==null?void 0:s.trim())!=null?o:"";!n||!r||this.isAiGalleryImage(r)&&e.push({key:n,value:r})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var o,l,c,p,d,u,g,f,h,m;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=`
716
+ `;let p=document.createElement("input");p.type="file",p.accept="image/*,audio/*,application/json",p.className="customize-file",p.addEventListener("change",()=>{var f;let g=(f=p.files)==null?void 0:f[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>p.click()),l.appendChild(c),l.appendChild(d),l.appendChild(p),r.appendChild(s),r.appendChild(o),r.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(r)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",cs.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 r=document.createElement("span");r.textContent=t.replace(/_/g," ");let s=document.createElement("input");s.type="color",s.value=i,s.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=i,o.className="customize-color-text",o.dataset.colorTextKey=t,s.addEventListener("input",()=>{o.value=s.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(s.value=o.value)}),n.appendChild(r),n.appendChild(s),n.appendChild(o),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",ps.forEach(t=>{var s,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(s=e==null?void 0:e[t])!=null?s:t,r.className="customize-input",r.dataset.fontKey=t,i.appendChild(n),i.appendChild(r),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",ds.forEach(t=>{var s,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(s=this.readUiValue(e,t))!=null?s:"",r.className="customize-input",r.dataset.textKey=t,i.appendChild(n),i.appendChild(r),(o=this.textsContainer)==null||o.appendChild(i)}),Xa.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=t;let s=document.createElement("input");s.type="text",s.value=(o=this.getObjectTextValue(i))!=null?o:"",s.className="customize-input",s.dataset.objectTextKey=t,n.appendChild(r),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 o,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.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((o=e==null?void 0:e[i])!=null?o:""),s.className="customize-input",s.dataset.audioKey=i,i.includes("file")&&(s.placeholder="audio file path"),n.appendChild(r),n.appendChild(s),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),r=e;for(let s of n){if(r==null)return null;r=r[s]}return typeof r=="string"?r:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,r;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(r=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?r:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let r=t.split("."),s=n;for(let o of r){if(s==null)return null;s=s[o]}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(o=>{let l=o;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(o=>{let l=o,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(o=>{let l=o,c=l.dataset.fontKey;c&&(n[c]=l.value)});let r={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(r[c]=l.value)});let s={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let d=parseFloat(l.value);s[c]=isNaN(d)?0:d}else s[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let d=Xa.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:r,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 ei(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,r,s;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(r=(n=o==null?void 0:o.value)==null?void 0:n.trim())!=null?r:""}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 r=document.createElement("img");r.className="ai-gallery-thumb",r.alt=t;let s=this.resolveAssetUrls(i);s[0]&&(r.src=s[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(r),n.appendChild(o),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var s,o;let i=t,n=i.dataset.assetKey,r=(o=(s=i.value)==null?void 0:s.trim())!=null?o:"";!n||!r||this.isAiGalleryImage(r)&&e.push({key:n,value:r})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var o,l,c,d,p,u,g,f,h,m;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=`
767
717
  <div class="ai-modal-card">
768
718
  <div class="ai-modal-header">
769
719
  <div>
@@ -834,7 +784,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
834
784
  </div>
835
785
  </div>
836
786
  </div>
837
- `;let r=n.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let s=n.querySelector("[data-ai-ref-button]");s==null||s.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var y,v,x;let b=(x=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?x:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(h=this.aiCropBtn)==null||h.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.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 p,d,u,g,f,h,m,b,y,v,x,w,C,k,P,O,j,T,E,S;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(f=(g=this.aiModelSelect)==null?void 0:g.value)!=null?f:"gemini-2.5-flash-image",i=(b=(m=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:m.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,r=n,s=n,o=Number((w=(x=this.aiStrengthInput)==null?void 0:x.value)!=null?w:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((C=l==null?void 0:l.value)==null?void 0:C.trim())||((k=this.aiBaseValue)==null?void 0:k.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let A=null,M=(P=this.getSelectedAssetKey())!=null?P:"unknown",I=(O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl){let V=qi(this.aiOutputDataUrl,"ai-output.png");if(V){let Y=await Le(V);Y&&(A={input:{base64:Y.base64,mimeType:Y.mimeType},dataUrl:Y.dataUrl,width:Y.width,height:Y.height})}}if(A||(A=await this.getImageDataFromAsset(c)),!A){this.setAiStatus("Unable to load the base image.");return}let D=[A.input],L=!1;if(this.aiReferenceFile){let V=await Le(this.aiReferenceFile);V?(D.push({base64:V.base64,mimeType:V.mimeType}),L=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let _=Ka(i,{includeReference:L,includeMagenta:r,changeLevel:o}),$=(E=(T=this.aiReferenceFile)==null?void 0:T.name)!=null?E:"none";console.info("[AI] Final prompt:",_),console.info("[AI] Image sources:",{assetKey:M,base:I,reference:$});let Q=$a(A.width,A.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let B=await Ye(e,_,D,{aspectRatio:Q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",B==null?void 0:B.length),this.aiRawOutputDataUrl=B,await this.refreshAiOutputFromRaw()}catch(A){console.error("[CustomizePanel] AI Generate Error:",A),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((S=this.aiStatusEl)==null?void 0:S.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,r,s,o;if(!this.aiRawOutputDataUrl)return;let e=(r=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?r:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Ve(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 r=((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(r&&s)console.log("[CustomizePanel] Applying AI output directly to object:",r,s),this.applyObjectPropertyValue(r,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 r,s,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_")}_ai_${Date.now()}`,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}. Applying...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Logic: Adding to registry category:",n),p(n,`${i}.png`));let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Logic: Refreshing library panel"),d());let u=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),g=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),f=this.getSelectedAssetInput();if(f&&(f.value=c.path,this.handleAssetValueChange((o=f.dataset.assetKey)!=null?o:"",f)),u&&g){console.log("[CustomizePanel] Saved and applying directly to object:",u,g);let h=window.applyAssetToSlot,m=/texture|image|sprite|asset\\.path/i.test(g)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof h=="function"&&m){let b=this.getFilenameFromPath(c.path);h(u,b,n)}else this.applyObjectPropertyValue(u,g,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}setTimeout(()=>{this.closeAiModal()},1e3)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var s;let t=(s=this.aiContext)==null?void 0:s.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let r=i.toLowerCase();return r.includes("background")?"backgrounds":r.includes("character")?"characters":r.includes("key")?"collectedkeys":r.includes("draggable")?"draggables":r.includes("environment")||r.includes("env")||r.includes("hand")||r.includes("prop")||r.includes("item")||r.includes("decor")||r.includes("object")?"environment":r.includes("machine")?"machines":r.includes("tutorial")?"tutorial":r.includes("ui")||r.includes("button")||r.includes("label")||r.includes("icon")||r.includes("logo")||r.includes("cta")||r.includes("menu")||r.includes("overlay")?"ui":r.includes("effect")||r.includes("confetti")||r.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(r=>r.currentAsset===e||r.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 r=n.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=qi(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let r=await this.showManualCropModal(n,i,t);if(!r)return;let s=await Ha(r);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){let n=t.value,r=e;if(e.type.startsWith("image/")){let l=await this.getImageDimensions(n);if(l){let c=await this.showManualCropModal(e,l,n);if(!c)return;r=c}}let s=URL.createObjectURL(r),o=t.dataset.objectUrl;if(o)try{URL.revokeObjectURL(o)}catch{}t.dataset.objectUrl=s,t.dataset.assetType=r.type,t.value=s,this.handleAssetValueChange(i,t)}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 r=this.resolveAssetUrls(t);if(r.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,r,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 r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
787
+ `;let r=n.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let s=n.querySelector("[data-ai-ref-button]");s==null||s.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var y,v,x;let b=(x=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?x:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(h=this.aiCropBtn)==null||h.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,f,h,m,b,y,v,x,w,C,k,P,O,j,L,E,S;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(f=(g=this.aiModelSelect)==null?void 0:g.value)!=null?f:"gemini-2.5-flash-image",i=(b=(m=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:m.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,r=n,s=n,o=Number((w=(x=this.aiStrengthInput)==null?void 0:x.value)!=null?w:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((C=l==null?void 0:l.value)==null?void 0:C.trim())||((k=this.aiBaseValue)==null?void 0:k.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let A=null,M=(P=this.getSelectedAssetKey())!=null?P:"unknown",I=(O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl){let V=qi(this.aiOutputDataUrl,"ai-output.png");if(V){let Y=await Te(V);Y&&(A={input:{base64:Y.base64,mimeType:Y.mimeType},dataUrl:Y.dataUrl,width:Y.width,height:Y.height})}}if(A||(A=await this.getImageDataFromAsset(c)),!A){this.setAiStatus("Unable to load the base image.");return}let D=[A.input],T=!1;if(this.aiReferenceFile){let V=await Te(this.aiReferenceFile);V?(D.push({base64:V.base64,mimeType:V.mimeType}),T=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let _=Ka(i,{includeReference:T,includeMagenta:r,changeLevel:o}),$=(E=(L=this.aiReferenceFile)==null?void 0:L.name)!=null?E:"none";console.info("[AI] Final prompt:",_),console.info("[AI] Image sources:",{assetKey:M,base:I,reference:$});let Q=$a(A.width,A.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let B=await Ye(e,_,D,{aspectRatio:Q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",B==null?void 0:B.length),this.aiRawOutputDataUrl=B,await this.refreshAiOutputFromRaw()}catch(A){console.error("[CustomizePanel] AI Generate Error:",A),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((S=this.aiStatusEl)==null?void 0:S.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,r,s,o;if(!this.aiRawOutputDataUrl)return;let e=(r=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?r:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Ve(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 r=((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(r&&s)console.log("[CustomizePanel] Applying AI output directly to object:",r,s),this.applyObjectPropertyValue(r,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 r,s,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(m){console.warn("[CustomizePanel] Setup-library endpoint not available:",m)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),g=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),f=this.getSelectedAssetInput();if(f&&(f.value=c.path,this.handleAssetValueChange((o=f.dataset.assetKey)!=null?o:"",f)),u&&g){console.log("[CustomizePanel] Applying saved asset to object:",u,g);let m=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(g)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof m=="function"&&b){let y=this.getFilenameFromPath(c.path);await m(u,y,n)}else this.applyObjectPropertyValue(u,g,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let h=window.__highlightLibrarySlot;typeof h=="function"&&u&&(console.log("[CustomizePanel] Highlighting slot in library:",u,n),setTimeout(()=>{h(u,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var s;let t=(s=this.aiContext)==null?void 0:s.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let r=i.toLowerCase();return r.includes("background")?"backgrounds":r.includes("character")?"characters":r.includes("key")?"collectedkeys":r.includes("draggable")?"draggables":r.includes("environment")||r.includes("env")||r.includes("hand")||r.includes("prop")||r.includes("item")||r.includes("decor")||r.includes("object")?"environment":r.includes("machine")?"machines":r.includes("tutorial")?"tutorial":r.includes("ui")||r.includes("button")||r.includes("label")||r.includes("icon")||r.includes("logo")||r.includes("cta")||r.includes("menu")||r.includes("overlay")?"ui":r.includes("effect")||r.includes("confetti")||r.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(r=>r.currentAsset===e||r.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 r=n.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=qi(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let r=await this.showManualCropModal(n,i,t);if(!r)return;let s=await Ha(r);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){let n=t.value,r=e;if(e.type.startsWith("image/")){let l=await this.getImageDimensions(n);if(l){let c=await this.showManualCropModal(e,l,n);if(!c)return;r=c}}let s=URL.createObjectURL(r),o=t.dataset.objectUrl;if(o)try{URL.revokeObjectURL(o)}catch{}t.dataset.objectUrl=s,t.dataset.assetType=r.type,t.value=s,this.handleAssetValueChange(i,t)}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 r=this.resolveAssetUrls(t);if(r.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,r,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 r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
838
788
  <div class="asset-preview-card">
839
789
  <div class="asset-preview-header">
840
790
  <div class="asset-preview-title">${e}</div>
@@ -850,8 +800,8 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
850
800
  <img class="asset-preview-ai-image" alt="AI output preview">
851
801
  </div>
852
802
  </div>
853
- `;let s=r.querySelector(".asset-preview-body"),o=r.querySelector(".asset-preview-close"),l=r.querySelector(".asset-preview-change"),c=r.querySelector(".asset-preview-ai"),p=r.querySelector("[data-asset-ai-preview]");if(o==null||o.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()}),r.addEventListener("click",d=>{d.target===r&&this.closePreviewModal()}),s)if(n==="image"){let d=document.createElement("img");this.loadWithFallback(d,i),s.appendChild(d)}else if(n==="audio"){let d=document.createElement("audio");d.controls=!0,this.loadWithFallback(d,i),s.appendChild(d)}else if(n==="json"){let d=document.createElement("pre");this.fetchWithFallback(i).then(u=>{d.textContent=u!=null?u:"Unable to load JSON."}),s.appendChild(d)}else{let d=document.createElement("a");d.href=i[0],d.target="_blank",d.rel="noreferrer",d.textContent="Open asset",s.appendChild(d)}document.body.appendChild(r),this.previewModal=r,this.updateAiModalPreview(p,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,r=window.applyEditableObjectConfig;if(typeof n!="function"||typeof r!="function")return;let s=n(e);if(!s)return;let o=JSON.parse(JSON.stringify(s)),l=t.split("."),c=o;for(let p=0;p<l.length-1;p++){let d=l[p];c[d]=c[d]||{},c=c[d]}c[l[l.length-1]]=i,r(e,o)}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 r;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(r=this.activePreviewFileInput)!=null?r: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=r=>{var u,g;r.preventDefault();let s=r.clientX,o=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,p=f=>{let h=f.clientX-s,m=Math.min(c,Math.max(l,o+h));this.root&&(this.root.style.width=`${m}px`)},d=()=>{var h,m;window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d);let f=(m=(h=this.root)==null?void 0:h.getBoundingClientRect().width)!=null?m:0;f>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(f)))};window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)};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,r=URL.createObjectURL(e),s=await this.loadImage(r);try{URL.revokeObjectURL(r)}catch{}if(!(s!=null&&s.naturalWidth)||!(s!=null&&s.naturalHeight))return null;let o=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let p=Math.min(860,window.innerWidth-60),f=Math.max(220,Math.floor((p-32-16)/2)),h=Math.min(520,window.innerHeight-240),m=f,b=m/n;b>h&&(b=h,m=b*n),c.innerHTML=`
854
- <div class="asset-crop-card" style="width:${p}px;">
803
+ `;let s=r.querySelector(".asset-preview-body"),o=r.querySelector(".asset-preview-close"),l=r.querySelector(".asset-preview-change"),c=r.querySelector(".asset-preview-ai"),d=r.querySelector("[data-asset-ai-preview]");if(o==null||o.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()}),r.addEventListener("click",p=>{p.target===r&&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(r),this.previewModal=r,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,r=window.applyEditableObjectConfig;if(typeof n!="function"||typeof r!="function")return;let s=n(e);if(!s)return;let o=JSON.parse(JSON.stringify(s)),l=t.split("."),c=o;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,r(e,o)}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 r;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(r=this.activePreviewFileInput)!=null?r: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=r=>{var u,g;r.preventDefault();let s=r.clientX,o=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,d=f=>{let h=f.clientX-s,m=Math.min(c,Math.max(l,o+h));this.root&&(this.root.style.width=`${m}px`)},p=()=>{var h,m;window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p);let f=(m=(h=this.root)==null?void 0:h.getBoundingClientRect().width)!=null?m:0;f>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(f)))};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,r=URL.createObjectURL(e),s=await this.loadImage(r);try{URL.revokeObjectURL(r)}catch{}if(!(s!=null&&s.naturalWidth)||!(s!=null&&s.naturalHeight))return null;let o=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),f=Math.max(220,Math.floor((d-32-16)/2)),h=Math.min(520,window.innerHeight-240),m=f,b=m/n;b>h&&(b=h,m=b*n),c.innerHTML=`
804
+ <div class="asset-crop-card" style="width:${d}px;">
855
805
  <div class="asset-crop-header">
856
806
  <div>
857
807
  <div class="asset-crop-title">Crop to match current asset</div>
@@ -880,7 +830,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
880
830
  <button class="asset-crop-apply" type="button">Apply Crop</button>
881
831
  </div>
882
832
  </div>
883
- `;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),w=c.querySelector(".asset-crop-zoom-value"),C=c.querySelector(".asset-crop-close"),k=c.querySelector(".asset-crop-cancel"),P=c.querySelector(".asset-crop-apply"),O=c.querySelector(".asset-crop-reset");if(!y||!v||!x||!w){l(null);return}let j=y.getContext("2d"),T=v.getContext("2d");if(!j||!T){l(null);return}let E=s.naturalWidth,S=s.naturalHeight,A=Math.max(y.width/E,y.height/S),M=1,I=0,D=0,L=!1,_=0,$=0,Q=0,B=0,V=()=>{let z=A*M,se=Math.max(0,(E*z-y.width)/2),ue=Math.max(0,(S*z-y.height)/2);I=Math.min(se,Math.max(-se,I)),D=Math.min(ue,Math.max(-ue,D))},Y=()=>{let z=A*M;j.clearRect(0,0,y.width,y.height);let se=y.width/2-E*z/2+I,ue=y.height/2-S*z/2+D;if(j.drawImage(s,se,ue,E*z,S*z),T.clearRect(0,0,v.width,v.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let he=Math.max(v.width/o.naturalWidth,v.height/o.naturalHeight),Be=v.width/2-o.naturalWidth*he/2,Ae=v.height/2-o.naturalHeight*he/2;T.drawImage(o,Be,Ae,o.naturalWidth*he,o.naturalHeight*he)}else T.fillStyle="rgba(255, 255, 255, 0.04)",T.fillRect(0,0,v.width,v.height),T.strokeStyle="rgba(255, 255, 255, 0.08)",T.strokeRect(4,4,v.width-8,v.height-8);let Ee=v.width/y.width*(A*M),ge=I*(v.width/y.width),_e=D*(v.height/y.height),He=v.width/2-E*Ee/2+ge,$e=v.height/2-S*Ee/2+_e;T.save(),T.globalAlpha=.7,T.drawImage(s,He,$e,E*Ee,S*Ee),T.restore()},X=()=>{I=0,D=0,V(),Y()};x.addEventListener("input",()=>{M=Number(x.value),w.textContent=`${M.toFixed(2)}\xD7`,V(),Y()}),y.addEventListener("pointerdown",z=>{L=!0,_=z.clientX,$=z.clientY,Q=I,B=D,y.setPointerCapture(z.pointerId)}),y.addEventListener("pointermove",z=>{L&&(I=Q+(z.clientX-_),D=B+(z.clientY-$),V(),Y())}),y.addEventListener("pointerup",z=>{L=!1,y.releasePointerCapture(z.pointerId)}),y.addEventListener("pointerleave",()=>{L=!1});let we=()=>{c.remove()},ze=()=>{we(),l(null)},Lt=async()=>{let z=document.createElement("canvas");z.width=t.width,z.height=t.height;let se=z.getContext("2d");if(!se){we(),l(null);return}let ue=M,ge=Math.max(z.width/E,z.height/S)*ue,_e=z.width/y.width,He=I*_e,$e=D*_e,he=z.width/2-E*ge/2+He,Be=z.height/2-S*ge/2+$e;se.drawImage(s,he,Be,E*ge,S*ge);let Ae=await new Promise(Tt=>{z.toBlob(kt=>Tt(kt),e.type||"image/png")});if(we(),!Ae){l(null);return}l(new File([Ae],e.name,{type:Ae.type}))};C==null||C.addEventListener("click",ze),k==null||k.addEventListener("click",ze),O==null||O.addEventListener("click",X),P==null||P.addEventListener("click",()=>{Lt()}),c.addEventListener("click",z=>{z.target===c&&ze()}),document.body.appendChild(c),X()})}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 ii=class{constructor(){this.root=null;this.options=null}render(){return`
833
+ `;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),w=c.querySelector(".asset-crop-zoom-value"),C=c.querySelector(".asset-crop-close"),k=c.querySelector(".asset-crop-cancel"),P=c.querySelector(".asset-crop-apply"),O=c.querySelector(".asset-crop-reset");if(!y||!v||!x||!w){l(null);return}let j=y.getContext("2d"),L=v.getContext("2d");if(!j||!L){l(null);return}let E=s.naturalWidth,S=s.naturalHeight,A=Math.max(y.width/E,y.height/S),M=1,I=0,D=0,T=!1,_=0,$=0,Q=0,B=0,V=()=>{let z=A*M,se=Math.max(0,(E*z-y.width)/2),ue=Math.max(0,(S*z-y.height)/2);I=Math.min(se,Math.max(-se,I)),D=Math.min(ue,Math.max(-ue,D))},Y=()=>{let z=A*M;j.clearRect(0,0,y.width,y.height);let se=y.width/2-E*z/2+I,ue=y.height/2-S*z/2+D;if(j.drawImage(s,se,ue,E*z,S*z),L.clearRect(0,0,v.width,v.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let he=Math.max(v.width/o.naturalWidth,v.height/o.naturalHeight),Be=v.width/2-o.naturalWidth*he/2,Ae=v.height/2-o.naturalHeight*he/2;L.drawImage(o,Be,Ae,o.naturalWidth*he,o.naturalHeight*he)}else L.fillStyle="rgba(255, 255, 255, 0.04)",L.fillRect(0,0,v.width,v.height),L.strokeStyle="rgba(255, 255, 255, 0.08)",L.strokeRect(4,4,v.width-8,v.height-8);let Ee=v.width/y.width*(A*M),ge=I*(v.width/y.width),_e=D*(v.height/y.height),He=v.width/2-E*Ee/2+ge,$e=v.height/2-S*Ee/2+_e;L.save(),L.globalAlpha=.7,L.drawImage(s,He,$e,E*Ee,S*Ee),L.restore()},X=()=>{I=0,D=0,V(),Y()};x.addEventListener("input",()=>{M=Number(x.value),w.textContent=`${M.toFixed(2)}\xD7`,V(),Y()}),y.addEventListener("pointerdown",z=>{T=!0,_=z.clientX,$=z.clientY,Q=I,B=D,y.setPointerCapture(z.pointerId)}),y.addEventListener("pointermove",z=>{T&&(I=Q+(z.clientX-_),D=B+(z.clientY-$),V(),Y())}),y.addEventListener("pointerup",z=>{T=!1,y.releasePointerCapture(z.pointerId)}),y.addEventListener("pointerleave",()=>{T=!1});let we=()=>{c.remove()},ze=()=>{we(),l(null)},Lt=async()=>{let z=document.createElement("canvas");z.width=t.width,z.height=t.height;let se=z.getContext("2d");if(!se){we(),l(null);return}let ue=M,ge=Math.max(z.width/E,z.height/S)*ue,_e=z.width/y.width,He=I*_e,$e=D*_e,he=z.width/2-E*ge/2+He,Be=z.height/2-S*ge/2+$e;se.drawImage(s,he,Be,E*ge,S*ge);let Ae=await new Promise(kt=>{z.toBlob(Pt=>kt(Pt),e.type||"image/png")});if(we(),!Ae){l(null);return}l(new File([Ae],e.name,{type:Ae.type}))};C==null||C.addEventListener("click",ze),k==null||k.addEventListener("click",ze),O==null||O.addEventListener("click",X),P==null||P.addEventListener("click",()=>{Lt()}),c.addEventListener("click",z=>{z.target===c&&ze()}),document.body.appendChild(c),X()})}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 ai=class{constructor(){this.root=null;this.options=null}render(){return`
884
834
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
885
835
  <div class="scene-panel-header" data-panel-handle>
886
836
  <div class="panel-title">
@@ -946,10 +896,10 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
946
896
  </div>
947
897
  </div>
948
898
  </div>
949
- `}initialize(e,t){var y,v,x,w,C,k,P,O,j,T,E,S,A,M,I,D;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var _;let L=window.getEditableEngineConfig;if(typeof L=="function"){let $=L();return(_=$==null?void 0:$.loading)!=null?_:{}}return{}})(),r=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");r&&(r.value=n.type==="image"?"image":"color",r.addEventListener("change",()=>{var L,_;(_=(L=this.options)==null?void 0:L.onUpdateLoading)==null||_.call(L,{type:r.value}),this.updateFieldVisibility(r.value)}));let s=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var L,_;(_=(L=this.options)==null?void 0:L.onUpdateLoading)==null||_.call(L,{background_color:s.value})}));let o=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((C=n.overlay_alpha)!=null?C:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var _,$;let L=Number(o.value);l&&(l.textContent=L.toFixed(2)),($=(_=this.options)==null?void 0:_.onUpdateLoading)==null||$.call(_,{overlay_alpha:L})}));let c=(k=this.root)==null?void 0:k.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var L,_;(_=(L=this.options)==null?void 0:L.onUpdateLoading)==null||_.call(L,{text:c.value})}));let p=(P=this.root)==null?void 0:P.querySelector("#loading-text-scale"),d=(O=this.root)==null?void 0:O.querySelector("#loading-text-scale-value");p&&(p.value=String((j=n.text_scale)!=null?j:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var _,$;let L=Number(p.value);d&&(d.textContent=L.toFixed(2)),($=(_=this.options)==null?void 0:_.onUpdateLoading)==null||$.call(_,{text_scale:L})}));let u=(T=this.root)==null?void 0:T.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var L,_;(_=(L=this.options)==null?void 0:L.onUpdateLoading)==null||_.call(L,{enabled:u.checked})}));let g=(E=this.root)==null?void 0:E.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var L,_;(_=(L=this.options)==null?void 0:L.onUpdateLoading)==null||_.call(L,{blur_enabled:g.checked})}));let f=(S=this.root)==null?void 0:S.querySelector("#loading-blur-strength"),h=(A=this.root)==null?void 0:A.querySelector("#loading-blur-strength-value");f&&(f.value=String((M=n.blur_strength)!=null?M:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var L,_;h&&(h.textContent=f.value),(_=(L=this.options)==null?void 0:L.onUpdateLoading)==null||_.call(L,{blur_strength:Number(f.value)})}));let m=(I=this.root)==null?void 0:I.querySelector("#loading-show-btn"),b=(D=this.root)==null?void 0:D.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var L,_;(_=(L=this.options)==null?void 0:L.onShowLoadingScreen)==null||_.call(L)}),b==null||b.addEventListener("click",()=>{var L,_;(_=(L=this.options)==null?void 0:L.onHideLoadingScreen)==null||_.call(L)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,r;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Assets as ni}from"pixi.js";async function Ja(a,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",o);let l=await ni.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of p)le[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 d=window.gameObjectManager;if(d)for(let u of p){let g=d.get(u);if(g){let f=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Za(a,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,s=typeof r=="function"?r():null,o=(t=s==null?void 0:s.slots)==null?void 0:t.find(m=>m.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await ni.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,g=e.replace(/s$/,""),f=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of f)le[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let h=window.gameObjectManager;if(h)for(let m of f){let b=h.get(m);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Qa(a,e,t,i){var n,r,s,o,l,c,p,d,u,g,f,h,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let x=Date.now(),w=`/raw/library/${i}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",w);let C=await ni.load(w);if(!C){console.error("[LIBRARY] Failed to load texture:",w);return}console.log("[LIBRARY] \u2705 Texture loaded"),le[v]=C,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let k=window.CustomAssets;k!=null&&k[v]&&(k[v].texture=C,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let P=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!P),P){let j=Array.from(((n=P.keys)==null?void 0:n.call(P))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",j);let T=P.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!T),T){let E=((r=T.getDisplayObject)==null?void 0:r.call(T))||T.pixiObject||T.pixi||T,S=(s=E==null?void 0:E.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",E),console.log("[LIBRARY] displayObject type:",S),console.log("[LIBRARY] has texture?",!!(E!=null&&E.texture)),E!=null&&E.texture)E.texture=C,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(S==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:A}=await import("pixi.js"),M=E.parent,I=(l=(o=M==null?void 0:M.getChildIndex)==null?void 0:o.call(M,E))!=null?l:0,D={x:E.x,y:E.y},L={x:(p=(c=E.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=E.anchor)==null?void 0:d.y)!=null?u:.5},_={x:(f=(g=E.scale)==null?void 0:g.x)!=null?f:1,y:(m=(h=E.scale)==null?void 0:h.y)!=null?m:1},$=(b=E.alpha)!=null?b:1,Q=(y=E.visible)!=null?y:!0,B=new A(C);B.anchor.set(L.x,L.y),B.position.set(D.x,D.y),B.scale.set(_.x,_.y),B.alpha=$,B.visible=Q,M&&(M.removeChild(E),M.addChildAt(B,I),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),T.pixiObject&&(T.pixiObject=B),T.pixi&&(T.pixi=B),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(E!=null&&E.children){let A=E.children.find(M=>M.texture);A?(A.texture=C,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let O=`raw/library/${i}/${t}`;ot({objectId:v,path:"render.asset.path",value:O}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",O)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function er(a,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let r=e.startsWith("json.")?e.replace("json.",""):e,s=Date.now(),o=`/raw/${t}?t=${s}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await ni.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}le[r]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+r);let c=window.CustomAssets;c!=null&&c[r]&&(c[r].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+r+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(r);if(d){let u=((n=d.getDisplayObject)==null?void 0:n.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}ot({objectId:r,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",r)}catch(r){console.error("[LIBRARY] Error resetting slot asset:",r)}}import{Graphics as rr,Point as us}from"pixi.js";import{Point as tr}from"pixi.js";var Te=()=>window.debugConfig||{},ir=()=>window.resolveAnchorVec2||(a=>({x:.5,y:.5})),nr=()=>window.resolveScreenAnchorPoint||(()=>new tr),ar=()=>window.resolveScreenRatioPoint||(()=>new tr);function sr(a){ai(a)&&(a.objectDebugRaf||(a.objectDebugRaf=window.requestAnimationFrame(()=>ri(a))))}function or(a){a.objectDebugRaf&&(window.cancelAnimationFrame(a.objectDebugRaf),a.objectDebugRaf=null),dt(a)}function ai(a){return a.isDebugOpen}function ri(a){var r,s,o;if(!ai(a)){a.objectDebugRaf=null;return}a.objectDebugRaf=window.requestAnimationFrame(()=>ri(a));let e=Ki(a);if(!e){ct(a,null),dt(a);return}let t=Xi(a,e);if(!t){ct(a,null),dt(a);return}let i=new us;(r=t.getGlobalPosition)==null||r.call(t,i);let n=Ji(a,t);ct(a,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),a.highlightObject?tn(a,t):an(a),a.highlightAnchor&&n?nn(a,n):rn(a)}function Ki(a){var n;let e=a.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 Xi(a,e){var n,r;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((r=i.getDisplayObject)==null?void 0:r.call(i))||i.pixiObject||i:null}function pt(a){let e=a.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Ji(a,e){var s,o;let t=pt(a);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=Zi(a);if(!n)return null;if(i.position_ratio!=null)return ar()(n.width,n.height,i.position_ratio);let r=(o=i.anchor)!=null?o:"center";return nr()(n.width,n.height,r)}function Zi(a){var r;let e=(r=a.container)==null?void 0:r.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 Qi(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectBoundsGfx&&a.objectBoundsGfx.parent!==e.stage&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectBoundsGfx||(a.objectBoundsGfx=new rr,a.objectBoundsGfx.zIndex=999999,e.stage.addChild(a.objectBoundsGfx)),a.objectBoundsGfx):null}function en(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectAnchorGfx&&a.objectAnchorGfx.parent!==e.stage&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null),a.objectAnchorGfx||(a.objectAnchorGfx=new rr,a.objectAnchorGfx.zIndex=1e6,e.stage.addChild(a.objectAnchorGfx)),a.objectAnchorGfx):null}function tn(a,e){var n;let t=Qi(a);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 nn(a,e){let t=en(a);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 an(a){a.objectBoundsGfx&&a.objectBoundsGfx.clear()}function rn(a){a.objectAnchorGfx&&a.objectAnchorGfx.clear()}function dt(a){a.objectBoundsGfx&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectAnchorGfx&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null)}function ct(a,e){a.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function lr(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function cr(a,e,t){var s;let i=e.split("."),n=i.pop(),r=a;for(let o of i)r[o]=(s=r[o])!=null?s:{},r=r[o];r[n]=t}function sn(a){var i,n,r,s,o;if(!a)return!1;if((i=a.transform)!=null&&i.offset)return!0;let e=((r=(n=a.identity)==null?void 0:n.category)!=null?r:"").toString().toLowerCase(),t=((o=(s=a.identity)==null?void 0:s.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function oi(a){let e=Te();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 dr(a){window.location.reload()}function li(a){let e=JSON.stringify(Te(),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 pr(a,e){var t,i,n;if(!(!a.configViewer||!a.container))try{let r=window.getEditableObjectConfig,s=typeof r=="function"?r(e):null;if(!s){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-VESWPZAY.js"),d=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!d)return;let u=await l(d.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),si(a,u),(i=a.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),si(a,s),(n=a.configViewer)==null||n.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function si(a,e){var d,u,g,f,h,m,b,y,v,x;if(!a.container)return;let t=a.container.querySelector("#config-pos-x"),i=a.container.querySelector("#config-pos-y"),n=a.container.querySelector("#config-scale"),r=a.container.querySelector("#config-anchor-x"),s=a.container.querySelector("#config-anchor-y"),l=sn(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((m=(h=e.transform)==null?void 0:h.scale)!=null?m:1));let c=(x=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?x:{x:.5,y:.5},p=ir()(c);r&&(r.value=String(p.x)),s&&(s.value=String(p.y))}function ur(a){var l,c,p,d,u,g,f,h,m,b;let e=a.selectedObjectId;if(!e||!a.container)return;let t=(c=(l=a.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=a.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(g=(u=a.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",r=(h=(f=a.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",s=(b=(m=a.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",o=`${e}:
899
+ `}initialize(e,t){var y,v,x,w,C,k,P,O,j,L,E,S,A,M,I,D;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var _;let T=window.getEditableEngineConfig;if(typeof T=="function"){let $=T();return(_=$==null?void 0:$.loading)!=null?_:{}}return{}})(),r=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");r&&(r.value=n.type==="image"?"image":"color",r.addEventListener("change",()=>{var T,_;(_=(T=this.options)==null?void 0:T.onUpdateLoading)==null||_.call(T,{type:r.value}),this.updateFieldVisibility(r.value)}));let s=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var T,_;(_=(T=this.options)==null?void 0:T.onUpdateLoading)==null||_.call(T,{background_color:s.value})}));let o=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((C=n.overlay_alpha)!=null?C:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var _,$;let T=Number(o.value);l&&(l.textContent=T.toFixed(2)),($=(_=this.options)==null?void 0:_.onUpdateLoading)==null||$.call(_,{overlay_alpha:T})}));let c=(k=this.root)==null?void 0:k.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var T,_;(_=(T=this.options)==null?void 0:T.onUpdateLoading)==null||_.call(T,{text:c.value})}));let d=(P=this.root)==null?void 0:P.querySelector("#loading-text-scale"),p=(O=this.root)==null?void 0:O.querySelector("#loading-text-scale-value");d&&(d.value=String((j=n.text_scale)!=null?j:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var _,$;let T=Number(d.value);p&&(p.textContent=T.toFixed(2)),($=(_=this.options)==null?void 0:_.onUpdateLoading)==null||$.call(_,{text_scale:T})}));let u=(L=this.root)==null?void 0:L.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var T,_;(_=(T=this.options)==null?void 0:T.onUpdateLoading)==null||_.call(T,{enabled:u.checked})}));let g=(E=this.root)==null?void 0:E.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var T,_;(_=(T=this.options)==null?void 0:T.onUpdateLoading)==null||_.call(T,{blur_enabled:g.checked})}));let f=(S=this.root)==null?void 0:S.querySelector("#loading-blur-strength"),h=(A=this.root)==null?void 0:A.querySelector("#loading-blur-strength-value");f&&(f.value=String((M=n.blur_strength)!=null?M:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var T,_;h&&(h.textContent=f.value),(_=(T=this.options)==null?void 0:T.onUpdateLoading)==null||_.call(T,{blur_strength:Number(f.value)})}));let m=(I=this.root)==null?void 0:I.querySelector("#loading-show-btn"),b=(D=this.root)==null?void 0:D.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var T,_;(_=(T=this.options)==null?void 0:T.onShowLoadingScreen)==null||_.call(T)}),b==null||b.addEventListener("click",()=>{var T,_;(_=(T=this.options)==null?void 0:T.onHideLoadingScreen)==null||_.call(T)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,r;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Assets as ri}from"pixi.js";async function Ja(a,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",o);let l=await ri.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)le[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let f=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Za(a,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,s=typeof r=="function"?r():null,o=(t=s==null?void 0:s.slots)==null?void 0:t.find(m=>m.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let p=await ri.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),f=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of f)le[m]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let h=window.gameObjectManager;if(h)for(let m of f){let b=h.get(m);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:",m))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Qa(a,e,t,i){var n,r,s,o,l,c,d,p,u,g,f,h,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let x=Date.now(),w=`/raw/library/${i}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",w);let C=await ri.load(w);if(!C){console.error("[LIBRARY] Failed to load texture:",w);return}console.log("[LIBRARY] \u2705 Texture loaded"),le[v]=C,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let k=window.CustomAssets;k!=null&&k[v]&&(k[v].texture=C,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let P=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!P),P){let j=Array.from(((n=P.keys)==null?void 0:n.call(P))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",j);let L=P.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!L),L){let E=((r=L.getDisplayObject)==null?void 0:r.call(L))||L.pixiObject||L.pixi||L,S=(s=E==null?void 0:E.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",E),console.log("[LIBRARY] displayObject type:",S),console.log("[LIBRARY] has texture?",!!(E!=null&&E.texture)),E!=null&&E.texture)E.texture=C,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(S==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:A}=await import("pixi.js"),M=E.parent,I=(l=(o=M==null?void 0:M.getChildIndex)==null?void 0:o.call(M,E))!=null?l:0,D={x:E.x,y:E.y},T={x:(d=(c=E.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=E.anchor)==null?void 0:p.y)!=null?u:.5},_={x:(f=(g=E.scale)==null?void 0:g.x)!=null?f:1,y:(m=(h=E.scale)==null?void 0:h.y)!=null?m:1},$=(b=E.alpha)!=null?b:1,Q=(y=E.visible)!=null?y:!0,B=new A(C);B.anchor.set(T.x,T.y),B.position.set(D.x,D.y),B.scale.set(_.x,_.y),B.alpha=$,B.visible=Q,M&&(M.removeChild(E),M.addChildAt(B,I),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),L.pixiObject&&(L.pixiObject=B),L.pixi&&(L.pixi=B),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(E!=null&&E.children){let A=E.children.find(M=>M.texture);A?(A.texture=C,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let O=`raw/library/${i}/${t}`;ot({objectId:v,path:"render.asset.path",value:O}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",O)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function er(a,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let r=e.startsWith("json.")?e.replace("json.",""):e,s=Date.now(),o=`/raw/${t}?t=${s}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await ri.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}le[r]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+r);let c=window.CustomAssets;c!=null&&c[r]&&(c[r].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+r+" to default"));let d=window.gameObjectManager;if(d){let p=d.get(r);if(p){let u=((n=p.getDisplayObject)==null?void 0:n.call(p))||p.pixiObject||p;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}ot({objectId:r,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",r)}catch(r){console.error("[LIBRARY] Error resetting slot asset:",r)}}import{Graphics as rr,Point as us}from"pixi.js";import{Point as tr}from"pixi.js";var Le=()=>window.debugConfig||{},ir=()=>window.resolveAnchorVec2||(a=>({x:.5,y:.5})),nr=()=>window.resolveScreenAnchorPoint||(()=>new tr),ar=()=>window.resolveScreenRatioPoint||(()=>new tr);function sr(a){si(a)&&(a.objectDebugRaf||(a.objectDebugRaf=window.requestAnimationFrame(()=>oi(a))))}function or(a){a.objectDebugRaf&&(window.cancelAnimationFrame(a.objectDebugRaf),a.objectDebugRaf=null),pt(a)}function si(a){return a.isDebugOpen}function oi(a){var r,s,o;if(!si(a)){a.objectDebugRaf=null;return}a.objectDebugRaf=window.requestAnimationFrame(()=>oi(a));let e=Ki(a);if(!e){dt(a,null),pt(a);return}let t=Xi(a,e);if(!t){dt(a,null),pt(a);return}let i=new us;(r=t.getGlobalPosition)==null||r.call(t,i);let n=Ji(a,t);dt(a,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),a.highlightObject?tn(a,t):an(a),a.highlightAnchor&&n?nn(a,n):rn(a)}function Ki(a){var n;let e=a.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 Xi(a,e){var n,r;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((r=i.getDisplayObject)==null?void 0:r.call(i))||i.pixiObject||i:null}function ut(a){let e=a.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Ji(a,e){var s,o;let t=ut(a);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=Zi(a);if(!n)return null;if(i.position_ratio!=null)return ar()(n.width,n.height,i.position_ratio);let r=(o=i.anchor)!=null?o:"center";return nr()(n.width,n.height,r)}function Zi(a){var r;let e=(r=a.container)==null?void 0:r.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 Qi(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectBoundsGfx&&a.objectBoundsGfx.parent!==e.stage&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectBoundsGfx||(a.objectBoundsGfx=new rr,a.objectBoundsGfx.zIndex=999999,e.stage.addChild(a.objectBoundsGfx)),a.objectBoundsGfx):null}function en(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectAnchorGfx&&a.objectAnchorGfx.parent!==e.stage&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null),a.objectAnchorGfx||(a.objectAnchorGfx=new rr,a.objectAnchorGfx.zIndex=1e6,e.stage.addChild(a.objectAnchorGfx)),a.objectAnchorGfx):null}function tn(a,e){var n;let t=Qi(a);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 nn(a,e){let t=en(a);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 an(a){a.objectBoundsGfx&&a.objectBoundsGfx.clear()}function rn(a){a.objectAnchorGfx&&a.objectAnchorGfx.clear()}function pt(a){a.objectBoundsGfx&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectAnchorGfx&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null)}function dt(a,e){a.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function lr(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function cr(a,e,t){var s;let i=e.split("."),n=i.pop(),r=a;for(let o of i)r[o]=(s=r[o])!=null?s:{},r=r[o];r[n]=t}function sn(a){var i,n,r,s,o;if(!a)return!1;if((i=a.transform)!=null&&i.offset)return!0;let e=((r=(n=a.identity)==null?void 0:n.category)!=null?r:"").toString().toLowerCase(),t=((o=(s=a.identity)==null?void 0:s.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function ci(a){let e=Le();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 dr(a){window.location.reload()}function di(a){let e=JSON.stringify(Le(),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 pr(a,e){var t,i,n;if(!(!a.configViewer||!a.container))try{let r=window.getEditableObjectConfig,s=typeof r=="function"?r(e):null;if(!s){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-VESWPZAY.js"),p=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!p)return;let u=await l(p.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),li(a,u),(i=a.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),li(a,s),(n=a.configViewer)==null||n.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function li(a,e){var p,u,g,f,h,m,b,y,v,x;if(!a.container)return;let t=a.container.querySelector("#config-pos-x"),i=a.container.querySelector("#config-pos-y"),n=a.container.querySelector("#config-scale"),r=a.container.querySelector("#config-anchor-x"),s=a.container.querySelector("#config-anchor-y"),l=sn(e)?(p=e.transform)==null?void 0:p.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((m=(h=e.transform)==null?void 0:h.scale)!=null?m:1));let c=(x=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?x:{x:.5,y:.5},d=ir()(c);r&&(r.value=String(d.x)),s&&(s.value=String(d.y))}function ur(a){var l,c,d,p,u,g,f,h,m,b;let e=a.selectedObjectId;if(!e||!a.container)return;let t=(c=(l=a.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=a.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=a.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",r=(h=(f=a.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",s=(b=(m=a.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",o=`${e}:
950
900
  position: (${t}, ${i})
951
901
  scale: ${n}
952
- anchor: (${r}, ${s})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function on(a,e){var d,u,g,f,h,m,b,y,v,x,w;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!a.container)return;let t=a.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=a.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(g=a.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),r=Number((m=(h=a.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),s=Number((y=(b=a.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),o=Number((x=(v=a.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:r,anchorX:s,anchorY:o});let{applyConfigOverride:l}=await import("./ConfigOverride-JLWPHR4L.js");l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:s,y:o}},{silent:e==null?void 0:e.silent});let c=pt(a);sn(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let C=(w=window.getEditableObjectConfig)==null?void 0:w.call(window,t);C?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,C)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function gr(a,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-JLWPHR4L.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(([p,d])=>{var u;if(p)if(p.includes(".")){let g=p.split("."),f=c;for(let h=0;h<g.length-1;h++){let m=g[h];f[m]=(u=f[m])!=null?u:{},f=f[m]}f[g[g.length-1]]=d}else c[p]=d}),l.ui=c,n({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!r,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function hr(a){a.selectedObjectId&&(a.objectAutoApplyTimer&&window.clearTimeout(a.objectAutoApplyTimer),a.objectAutoApplyTimer=window.setTimeout(()=>{a.objectAutoApplyTimer=null,on(a,{silent:!0})},150))}var gs=3e3;function fr(a,e,t){let i=t!=null?t:a.offsetParent;if(!i)return;e.style.cursor="move";let n=0,r=0,s=0,o=0,l=!1,c=d=>{if(!l)return;let u=d.clientX-n,g=d.clientY-r;a.style.left=`${s+u}px`,a.style.top=`${o+g}px`},p=()=>{l&&(l=!1,window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",d=>{if(d.button!==0)return;let u=d.target;if(u!=null&&u.closest("button, input, select, textarea"))return;d.preventDefault();let g=a.getBoundingClientRect(),f=i.getBoundingClientRect();s=Math.max(0,g.left-f.left),o=Math.max(0,g.top-f.top);let h=g.width,m=g.height,b=f.width,y=f.height;s=Math.min(s,b-h),o=Math.min(o,y-m),n=d.clientX,r=d.clientY,a.style.left=`${s}px`,a.style.top=`${o}px`,a.style.right="auto",a.style.bottom="auto",a.style.zIndex=String(++gs);let v=a.getBoundingClientRect();(v.left<0||v.top<0||v.right>window.innerWidth||v.bottom>window.innerHeight)&&(a.style.left="16px",a.style.top="72px",a.style.right="auto",a.style.bottom="auto"),l=!0,window.addEventListener("pointermove",c),window.addEventListener("pointerup",p)})}function mr(a,e,t){e.style.cursor="nwse-resize";let i=0,n=0,r=0,s=0,o=!1,l=p=>{if(!o)return;let d=p.clientX-r,u=p.clientY-s,g=Math.max(100,i+d),f=Math.max(100,n+u);a.style.width=`${g}px`,a.style.height=`${f}px`,t==null||t(g,f)},c=()=>{o&&(o=!1,window.removeEventListener("pointermove",l),window.removeEventListener("pointerup",c))};e.addEventListener("pointerdown",p=>{if(p.button!==0)return;p.preventDefault(),p.stopPropagation();let d=a.getBoundingClientRect();i=d.width,n=d.height,r=p.clientX,s=p.clientY,o=!0,window.addEventListener("pointermove",l),window.addEventListener("pointerup",c)})}function ln(a,e){var h,m,b;let t=(b=(m=(h=a.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:a.debugOverlay)!=null?b:e.offsetParent;if(!t)return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),r=12,s=Math.max(250,Math.floor(i.width-r*2)),o=Math.max(200,Math.floor(i.height-r*2));n.width>s&&(e.style.width=`${s}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(r,i.width-l.width-r),u=Math.max(r,i.height-l.height-r),g=Math.min(Math.max(c,r),d),f=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function Ie(a){if(!a.container)return;let e=a.container.querySelector("#debug-workbench");if(!e)return;ln(a,e);let t={activeTab:a.activeTab,width:e.style.width,height:e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function ci(a){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(a.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n;let i=(n=a.container)==null?void 0:n.querySelector("#debug-workbench");i&&(t.width&&(i.style.width=t.width),t.height&&(i.style.height=t.height),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),ln(a,i))})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function br(a,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",ln(a,e),Ie(a))}function yr(a){var n,r,s;if(!a.container)return;let e=a.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=a.toggleDebug)==null||o.call(a)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=a.toggleDebug)==null?void 0:o.call(a,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>oi(a)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>li(a)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;a.activeTab=l,cn(a),Ie(a)})}),pn(a,e),dn(a,e)}function cn(a){if(!a.container)return;let e=a.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let r=n.dataset.tab;n.classList.toggle("active",r===a.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let r=n.dataset.tabPanel;n.classList.toggle("active",r===a.activeTab)})}function dn(a,e){ae(a,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ae(a,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ae(a,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ae(a,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ae(a,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ae(a,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ae(a,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ae(a,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ae(a,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=Te();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("#",""),r=parseInt(n,16),s=Te();s.layout&&(s.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function vr(a){if(!a.container||!a.debugOverlay)return;let e=a.container.querySelector("#debug-workbench"),t=a.container.querySelector("#workbench-handle"),i=a.container.querySelector("#workbench-resize");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),fr(e,t,a.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Ie(a),br(a,e)},10)})),e&&i&&mr(e,i,()=>Ie(a)),ci(a)}function pn(a,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(a,e,t,i,n){let r=e.querySelector(`#${t}`),s=e.querySelector(n);if(!r||!s)return;let o=lr(Te(),i);typeof o=="number"&&(r.value=String(o),s.textContent=String(o)),r.addEventListener("input",()=>{let l=Number(r.value);s.textContent=String(l),cr(Te(),i,l)})}var di=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=ta(),{hasChanges:t,overrideCount:i,overrides:n}=e,r={};for(let l of n){let c=l.objectId||"Engine";r[c]||(r[c]=[]),r[c].push(l)}let s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never";return`
902
+ anchor: (${r}, ${s})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function on(a,e){var p,u,g,f,h,m,b,y,v,x,w;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!a.container)return;let t=a.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=a.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((f=(g=a.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),r=Number((m=(h=a.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),s=Number((y=(b=a.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),o=Number((x=(v=a.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:r,anchorX:s,anchorY:o});let{applyConfigOverride:l}=await import("./ConfigOverride-JLWPHR4L.js");l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:s,y:o}},{silent:e==null?void 0:e.silent});let c=ut(a);sn(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let d=window.applyEditableObjectConfig;if(typeof d=="function"){let C=(w=window.getEditableObjectConfig)==null?void 0:w.call(window,t);C?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,C)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function gr(a,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-JLWPHR4L.js");Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),f=c;for(let h=0;h<g.length-1;h++){let m=g[h];f[m]=(u=f[m])!=null?u:{},f=f[m]}f[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!r,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function hr(a){a.selectedObjectId&&(a.objectAutoApplyTimer&&window.clearTimeout(a.objectAutoApplyTimer),a.objectAutoApplyTimer=window.setTimeout(()=>{a.objectAutoApplyTimer=null,on(a,{silent:!0})},150))}var gs=3e3;function fr(a,e,t){let i=t!=null?t:a.offsetParent;if(!i)return;e.style.cursor="move";let n=0,r=0,s=0,o=0,l=!1,c=p=>{if(!l)return;let u=p.clientX-n,g=p.clientY-r;a.style.left=`${s+u}px`,a.style.top=`${o+g}px`},d=()=>{l&&(l=!1,window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",p=>{if(p.button!==0)return;let u=p.target;if(u!=null&&u.closest("button, input, select, textarea"))return;p.preventDefault();let g=a.getBoundingClientRect(),f=i.getBoundingClientRect();s=Math.max(0,g.left-f.left),o=Math.max(0,g.top-f.top);let h=g.width,m=g.height,b=f.width,y=f.height;s=Math.min(s,b-h),o=Math.min(o,y-m),n=p.clientX,r=p.clientY,a.style.left=`${s}px`,a.style.top=`${o}px`,a.style.right="auto",a.style.bottom="auto",a.style.zIndex=String(++gs);let v=a.getBoundingClientRect();(v.left<0||v.top<0||v.right>window.innerWidth||v.bottom>window.innerHeight)&&(a.style.left="16px",a.style.top="72px",a.style.right="auto",a.style.bottom="auto"),l=!0,window.addEventListener("pointermove",c),window.addEventListener("pointerup",d)})}function mr(a,e,t,i=280,n=200){e.style.cursor="nwse-resize";let r=0,s=0,o=0,l=0,c=!1,d=u=>{if(!c)return;let g=u.clientX-o,f=u.clientY-l,h=Math.max(i,r+g),m=Math.max(n,s+f);a.style.width=`${h}px`,a.style.height=`${m}px`,t==null||t(h,m)},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=a.getBoundingClientRect();r=g.width,s=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function ln(a,e){var h,m,b;let t=(b=(m=(h=a.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:a.debugOverlay)!=null?b:e.offsetParent;if(!t)return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),r=12,s=Math.max(250,Math.floor(i.width-r*2)),o=Math.max(200,Math.floor(i.height-r*2));n.width>s&&(e.style.width=`${s}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(r,i.width-l.width-r),u=Math.max(r,i.height-l.height-r),g=Math.min(Math.max(c,r),p),f=Math.min(Math.max(d,r),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function Ie(a){if(!a.container)return;let e=a.container.querySelector("#debug-workbench");if(!e)return;ln(a,e);let t={activeTab:a.activeTab,width:e.style.width,height:e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function pi(a){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(a.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n;let i=(n=a.container)==null?void 0:n.querySelector("#debug-workbench");i&&(t.width&&(i.style.width=t.width),t.height&&(i.style.height=t.height),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),ln(a,i))})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function br(a,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",ln(a,e),Ie(a))}function yr(a){var n,r,s;if(!a.container)return;let e=a.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=a.toggleDebug)==null||o.call(a)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=a.toggleDebug)==null?void 0:o.call(a,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>ci(a)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>di(a)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;a.activeTab=l,cn(a),Ie(a)})}),pn(a,e),dn(a,e)}function cn(a){if(!a.container)return;let e=a.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let r=n.dataset.tab;n.classList.toggle("active",r===a.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let r=n.dataset.tabPanel;n.classList.toggle("active",r===a.activeTab)})}function dn(a,e){ae(a,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ae(a,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ae(a,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ae(a,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ae(a,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ae(a,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ae(a,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ae(a,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ae(a,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=Le();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("#",""),r=parseInt(n,16),s=Le();s.layout&&(s.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function vr(a){if(!a.container||!a.debugOverlay)return;let e=a.container.querySelector("#debug-workbench"),t=a.container.querySelector("#workbench-handle"),i=a.container.querySelector("#workbench-resize");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),fr(e,t,a.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Ie(a),br(a,e)},10)})),e&&i&&mr(e,i,()=>Ie(a)),pi(a)}function pn(a,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(a,e,t,i,n){let r=e.querySelector(`#${t}`),s=e.querySelector(n);if(!r||!s)return;let o=lr(Le(),i);typeof o=="number"&&(r.value=String(o),s.textContent=String(o)),r.addEventListener("input",()=>{let l=Number(r.value);s.textContent=String(l),cr(Le(),i,l)})}var ui=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=ea(),{hasChanges:t,overrideCount:i,overrides:n}=e,r={};for(let l of n){let c=l.objectId||"Engine";r[c]||(r[c]=[]),r[c].push(l)}let s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never";return`
953
903
  <div class="config-persistence-panel">
954
904
  <div class="persistence-status-bar ${t?"has-changes":"no-changes"}">
955
905
  ${t?`
@@ -967,14 +917,25 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
967
917
  </div>
968
918
 
969
919
  <div class="persistence-main-actions">
970
- <button
971
- id="apply-to-project-btn"
920
+ <button
921
+ id="create-version-btn"
972
922
  class="persistence-btn primary-action"
973
923
  ${t?"":"disabled"}
974
- title="Saves all staged changes to the actual configuration files on disk."
924
+ title="Creates a new version snapshot with backup. Safe for production use."
975
925
  >
976
- \u{1F4BE} APPLY ALL CHANGES TO PROJECT
926
+ \u{1F4DD} CREATE NEW VERSION
977
927
  </button>
928
+
929
+ ${this.currentVersion?`
930
+ <button
931
+ id="apply-current-btn"
932
+ class="persistence-btn secondary-action"
933
+ ${t?"":"disabled"}
934
+ title="Updates the currently active version: ${this.currentVersion}"
935
+ >
936
+ \u{1F4BE} APPLY TO CURRENT VERSION (${this.currentVersion})
937
+ </button>
938
+ `:""}
978
939
  </div>
979
940
 
980
941
  <div class="version-management-section">
@@ -993,23 +954,20 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
993
954
  `).join("")}
994
955
  </select>
995
956
  </div>
996
- <button id="create-version-btn" class="persistence-btn" ${t?"":"disabled"}>
997
- \u{1F4DD} Create New Version
998
- </button>
999
957
  </div>
1000
958
  </div>
1001
959
 
1002
960
  ${this.isDevelopmentMode&&t?`
1003
961
  <div class="dev-only-section">
1004
962
  <div class="dev-warning">
1005
- \u26A0\uFE0F Developer Mode Only
963
+ \u26A0\uFE0F DEVELOPER MODE ONLY - DANGER ZONE
1006
964
  </div>
1007
- <button id="direct-apply-btn" class="persistence-btn danger-action">
1008
- \u{1F527} APPLY DIRECTLY (No Snapshot)
965
+ <button id="apply-base-btn" class="persistence-btn danger-action">
966
+ \u{1F527} APPLY TO BASE (No Version)
1009
967
  </button>
1010
968
  <p class="dev-hint">
1011
- This will directly modify base configs without creating a version snapshot.
1012
- Use with caution!
969
+ Directly modifies base config files without creating a version snapshot.
970
+ Use ONLY during active development. Requires Git for safety.
1013
971
  </p>
1014
972
  </div>
1015
973
  `:""}
@@ -1028,13 +986,13 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1028
986
  <span class="group-id">${l}</span>
1029
987
  </div>
1030
988
  <div class="staging-items">
1031
- ${c.map(p=>`
989
+ ${c.map(d=>`
1032
990
  <div class="staging-item">
1033
- <div class="item-path">${p.path}</div>
1034
- <div class="item-value" title="${JSON.stringify(p.value)}">
1035
- ${this.formatValue(p.value)}
991
+ <div class="item-path">${d.path}</div>
992
+ <div class="item-value" title="${JSON.stringify(d.value)}">
993
+ ${this.formatValue(d.value)}
1036
994
  </div>
1037
- <button class="item-remove" data-remove-path="${p.path}" data-remove-id="${p.objectId||""}" title="Discard this change">\xD7</button>
995
+ <button class="item-remove" data-remove-path="${d.path}" data-remove-id="${d.objectId||""}" title="Discard this change">\xD7</button>
1038
996
  </div>
1039
997
  `).join("")}
1040
998
  </div>
@@ -1062,10 +1020,25 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1062
1020
  </div>
1063
1021
 
1064
1022
  <div class="persistence-info">
1065
- <p><strong>Apply to Project</strong> writes the current preview state to your local .json files in /configs/ folder. This state will be used for the dashboard build.</p>
1023
+ <p><strong>Three Apply Options:</strong></p>
1024
+ <ul>
1025
+ <li><strong>Create New Version</strong> - Creates a new version snapshot with backup (safe for production)</li>
1026
+ <li><strong>Apply to Current Version</strong> - Updates the active version without creating a new one</li>
1027
+ <li><strong>Apply to BASE (Dev Only)</strong> - Directly edits base configs without versioning (use Git for safety)</li>
1028
+ </ul>
1066
1029
  </div>
1067
1030
  </div>
1068
- `}formatValue(e){return e===null?"null":typeof e=="string"?e.length>25?e.substring(0,22)+"...":e:typeof e=="object"?"{...}":String(e)}setupEventListeners(){if(!this.container)return;let e=this.container.querySelector("#apply-to-project-btn");e==null||e.addEventListener("click",async()=>{var p;if(!(e.getAttribute("disabled")!==null||!confirm("This will permanently update your project configuration files on disk. Are you sure?")))try{let d=localStorage.getItem("handler_last_version_name")||"",g=((p=prompt("Version name for this Apply (e.g. v1, ab_red_cta, 2026-01-17a):",d))!=null?p:"").trim();if(!g){alert("Version name is required to Apply. (No changes were written.)");return}localStorage.setItem("handler_last_version_name",g),e.textContent="\u23F3 Writing to disk...",e.setAttribute("disabled","true"),await ji(g),this.showSuccessNotification(),this.refreshPanel()}catch(d){console.error("[ConfigPersistence] Apply failed:",d),alert(`\u274C Apply failed: ${d.message}`),e.textContent="\u{1F4BE} APPLY ALL CHANGES TO PROJECT",e.removeAttribute("disabled")}}),this.container.querySelectorAll(".item-remove").forEach(c=>{c.addEventListener("click",()=>{let p=c.dataset.removePath,d=c.dataset.removeId;Qn(d||void 0,p)})});let i=this.container.querySelector("#clear-all-overrides");i==null||i.addEventListener("click",()=>{confirm("Discard all staged changes?")&&Di()});let n=this.container.querySelector("#reset-to-applied-btn");n==null||n.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&Di()});let r=this.container.querySelector("#reset-to-original-btn");r==null||r.addEventListener("click",async()=>{await ia()});let s=this.container.querySelector("#version-selector");s==null||s.addEventListener("change",async c=>{let d=c.target.value;await this.switchVersion(d)});let o=this.container.querySelector("#create-version-btn");o==null||o.addEventListener("click",async()=>{var p;if(!(o.getAttribute("disabled")!==null||!confirm("This will create a new version snapshot and save your changes. Continue?")))try{let d=localStorage.getItem("handler_last_version_name")||"",g=((p=prompt("Version name (e.g. v1, test_2024):",d))!=null?p:"").trim();if(!g){alert("Version name is required. (No changes were written.)");return}localStorage.setItem("handler_last_version_name",g),o.textContent="\u23F3 Creating version...",o.setAttribute("disabled","true"),await ji(g),this.showSuccessNotification(),await this.loadVersionsList(),this.refreshPanel()}catch(d){console.error("[ConfigPersistence] Create version failed:",d),alert(`\u274C Failed to create version: ${d.message}`),o.textContent="\u{1F4DD} Create New Version",o.removeAttribute("disabled")}});let l=this.container.querySelector("#direct-apply-btn");l==null||l.addEventListener("click",async()=>{await this.directApply()})}showSuccessNotification(){let e=document.createElement("div");e.className="persistence-notification success",e.innerHTML=`
1031
+ `}formatValue(e){return e===null?"null":typeof e=="string"?e.length>25?e.substring(0,22)+"...":e:typeof e=="object"?"{...}":String(e)}setupEventListeners(){if(!this.container)return;let e=this.container.querySelector("#create-version-btn");e==null||e.addEventListener("click",async()=>{var d;if(!(e.getAttribute("disabled")!==null||!confirm("Create a new version snapshot? This will save all changes with backup.")))try{let p=localStorage.getItem("handler_last_version_name")||"",g=((d=prompt("Version name (e.g. v1, test_2024):",p))!=null?d:"").trim();if(!g){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",g),e.textContent="\u23F3 Creating version...",e.setAttribute("disabled","true"),await ta(g),this.showSuccessNotification(),await this.loadVersionsList(),this.refreshPanel()}catch(p){console.error("[ConfigPersistence] Create version failed:",p),alert(`\u274C Failed to create version: ${p.message}`),e.textContent="\u{1F4DD} CREATE NEW VERSION",e.removeAttribute("disabled")}});let t=this.container.querySelector("#apply-current-btn");t==null||t.addEventListener("click",async()=>{if(!(t.getAttribute("disabled")!==null||!confirm(`Update current version "${this.currentVersion}"? This will overwrite the existing version.`)))try{t.textContent="\u23F3 Updating version...",t.setAttribute("disabled","true");let d=Ot(),p={};for(let[g,f]of Object.entries(d.objects)){let h=f,m=g;/^(json\.|ui\.|effects\.|engine\.)/.test(m)||(m=`json.${g}`),h&&typeof h=="object"&&(h.identity||(h.identity={}),h.identity.id=m),p[`objects/${m}.json`]=h}d.engine&&(d.engine.runtime&&(p["engine/engine.runtime.json"]=d.engine.runtime),d.engine.assets&&(p["engine/engine.assets.json"]=d.engine.assets),d.engine.splash&&(p["engine/engine.splash.json"]=d.engine.splash),d.engine.loading&&(p["engine/engine.loading.json"]=d.engine.loading),d.engine.start&&(p["engine/engine.start.json"]=d.engine.start),d.engine.tutorial&&(p["engine/engine.tutorial.json"]=d.engine.tutorial),d.engine.endgame&&(p["engine/engine.endgame.json"]=d.engine.endgame),!d.engine.runtime&&!d.engine.assets&&(p["engine/engine.json"]=d.engine));for(let[g,f]of Object.entries(d.scenes)){let h=g.startsWith("scene.")?g:`scene.${g}`;p[`scenes/${h}.json`]=f}let u=await fetch("/api/apply-current",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:p,assets:{},hadCacheAtApply:!0})});if(!u.ok){let g=await u.json();throw new Error(g.error||"Apply to current version failed")}lt(),this.showSuccessNotification(),this.refreshPanel()}catch(d){console.error("[ConfigPersistence] Apply current failed:",d),alert(`\u274C Apply to current version failed: ${d.message}`),t.textContent=`\u{1F4BE} APPLY TO CURRENT VERSION (${this.currentVersion})`,t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1032
+
1033
+ This will DIRECTLY MODIFY base configuration files.
1034
+
1035
+ NO version snapshot will be created.
1036
+
1037
+ This is ONLY for active development.
1038
+
1039
+ Make sure your project is under Git version control.
1040
+
1041
+ Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let d=Ot(),p={};for(let[g,f]of Object.entries(d.objects)){let h=f,m=g;/^(json\.|ui\.|effects\.|engine\.)/.test(m)||(m=`json.${g}`),h&&typeof h=="object"&&(h.identity||(h.identity={}),h.identity.id=m),p[`objects/${m}.json`]=h}d.engine&&(d.engine.runtime&&(p["engine/engine.runtime.json"]=d.engine.runtime),d.engine.assets&&(p["engine/engine.assets.json"]=d.engine.assets),d.engine.splash&&(p["engine/engine.splash.json"]=d.engine.splash),d.engine.loading&&(p["engine/engine.loading.json"]=d.engine.loading),d.engine.start&&(p["engine/engine.start.json"]=d.engine.start),d.engine.tutorial&&(p["engine/engine.tutorial.json"]=d.engine.tutorial),d.engine.endgame&&(p["engine/engine.endgame.json"]=d.engine.endgame),!d.engine.runtime&&!d.engine.assets&&(p["engine/engine.json"]=d.engine));for(let[g,f]of Object.entries(d.scenes)){let h=g.startsWith("scene.")?g:`scene.${g}`;p[`scenes/${h}.json`]=f}let u=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:p,assets:{}})});if(!u.ok){let g=await u.json();throw new Error(g.error||"Apply to base failed")}lt(),this.showSuccessNotification(),this.refreshPanel()}catch(d){console.error("[ConfigPersistence] Apply to base failed:",d),alert(`\u274C Apply to base failed: ${d.message}`),i.textContent="\u{1F527} APPLY TO BASE (No Version)",i.removeAttribute("disabled")}});let n=this.container.querySelector("#version-selector");n==null||n.addEventListener("change",async c=>{let p=c.target.value;await this.switchVersion(p)}),this.container.querySelectorAll(".item-remove").forEach(c=>{c.addEventListener("click",()=>{let d=c.dataset.removePath,p=c.dataset.removeId;Qn(p||void 0,d)})});let s=this.container.querySelector("#clear-all-overrides");s==null||s.addEventListener("click",()=>{confirm("Discard all staged changes?")&&Di()});let o=this.container.querySelector("#reset-to-applied-btn");o==null||o.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&Di()});let l=this.container.querySelector("#reset-to-original-btn");l==null||l.addEventListener("click",async()=>{await ia()})}showSuccessNotification(){let e=document.createElement("div");e.className="persistence-notification success",e.innerHTML=`
1069
1042
  <div class="notify-icon">\u2705</div>
1070
1043
  <div class="notify-content">
1071
1044
  <strong>Changes Applied!</strong>
@@ -1073,13 +1046,13 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1073
1046
  </div>
1074
1047
  `,document.body.appendChild(e),setTimeout(()=>{e.classList.add("out"),setTimeout(()=>e.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){if(confirm(`Switch to version "${e||"original"}"?
1075
1048
 
1076
- All unsaved changes in the current version will be lost.`))try{let i=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!i.ok){let n=await i.json();throw new Error(n.error||"Failed to switch version")}Ri(),window.location.reload()}catch(i){alert(`\u274C Failed to switch version: ${i.message}`)}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
1049
+ All unsaved changes in the current version will be lost.`))try{let i=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!i.ok){let n=await i.json();throw new Error(n.error||"Failed to switch version")}lt(),window.location.reload()}catch(i){alert(`\u274C Failed to switch version: ${i.message}`)}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
1077
1050
 
1078
1051
  This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snapshot.
1079
1052
 
1080
1053
  This cannot be undone unless you have git commits or backups.
1081
1054
 
1082
- Are you absolutely sure?`))try{let t=ea(),i={};for(let[r,s]of Object.entries(t.objects)){let o=s,l=r;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${r}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[r,s]of Object.entries(t.scenes)){let o=r.startsWith("scene.")?r:`scene.${r}`;i[`scenes/${o}.json`]=s}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let r=await n.json();throw new Error(r.error||"Direct apply failed")}Ri(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var pi=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new Dt;this.sceneToolsPanel=new zt;this.nudgePanel=new Ht;this.inspectorPanel=new Jt;this.libraryPanel=new $t;this.brandVisionPanel=new ei;this.customizeSettingsPanel=new ti;this.configPersistencePanel=new di;this.loadingScreenPanel=new ii}applyAssetChange(e,t){return Ja(this,e,t)}resetAsset(e){return Za(this,e)}applySlotAsset(e,t,i){return Qa(this,e,t,i)}resetSlotAsset(e,t,i){return er(this,e,t,i)}startObjectVisuals(){return sr(this)}stopObjectVisuals(){return or(this)}shouldRunObjectVisuals(){return ai(this)}updateObjectVisuals(){return ri(this)}getSelectedInstanceId(){return Ki(this)}getDisplayObjectById(e){return Xi(this,e)}getSelectedObjectConfig(){return pt(this)}getConfigAnchorWorldPoint(e){return Ji(this,e)}getScreenSize(){return Zi(this)}ensureBoundsGfx(){return Qi(this)}ensureAnchorGfx(){return en(this)}drawBounds(e){return tn(this,e)}drawAnchor(e){return nn(this,e)}clearBounds(){return an(this)}clearAnchor(){return rn(this)}clearObjectVisuals(){return dt(this)}updateObjectInfo(e){return ct(this,e)}resetDebugConfig(){return oi(this)}applyDebugConfig(){return dr(this)}exportDebugConfig(){return li(this)}loadObjectConfig(e){return pr(this,e)}fillConfigViewer(e){return si(this,e)}copyConfigValues(){return ur(this)}applyObjectConfig(e){return on(this,e)}applyCustomizeSettings(e,t){return gr(this,e,t)}scheduleObjectAutoApply(){return hr(this)}setupDebugEventListeners(){return yr(this)}setupDebugInputListeners(e){return dn(this,e)}setupPanelLayout(){return vr(this)}setupCollapsiblePanels(e){return pn(this,e)}setupRangeInput(e,t,i,n){return ae(this,e,t,i,n)}updateWorkbenchTabs(){return cn(this)}saveWorkbenchState(){return Ie(this)}loadWorkbenchState(){return ci(this)}initialize(e){var r;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let s=localStorage.getItem("preview_workbench_state");if(s){let o=JSON.parse(s);o.activeTab&&(this.activeTab=o.activeTab)}}catch(s){console.warn("[PREVIEW] Failed to load workbench tab state",s)}this.sceneObjectsPanel.initialize(e,{onSelect:s=>this.handleObjectSelect(s)}),this.libraryPanel.initialize(e,{onApply:(s,o,l)=>this.applySlotAsset(s,o,l),onReset:(s,o,l)=>this.resetSlotAsset(s,o,l)}),this.inspectorPanel.initialize(e,{onPropertyChange:(s,o,l)=>{console.log("[Inspector] Property changed:",s,o,l)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let s="/dashboard";window.location.pathname!==s&&(window.location.href=s)}),this.customizeSettingsPanel.initialize(e,{onApply:(s,o)=>this.applyCustomizeSettings(s,o)});let t=e.querySelector("#scene-tools-container");t&&(t.innerHTML=this.sceneToolsPanel.render());let i=e.querySelector("#nudge-panel-container");i&&(i.innerHTML=this.nudgePanel.render()),this.sceneToolsPanel.initialize(t||e,{onHighlightObject:s=>{this.highlightObject=s,s?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:s=>{this.highlightAnchor=s,s?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(s,o)=>this.nudgeSelectedObject(s,o),onShowSplash:()=>{let s=window;typeof s.__previewShowSplash=="function"&&s.__previewShowSplash()},onUpdateSplash:s=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({splash:s})}}),this.nudgePanel.initialize(i||e,{onNudge:async(s,o)=>{var f,h,m,b,y,v;if(!this.selectedObjectId)return;let l=this.getSelectedObjectConfig();if(!l)return;let c=(f=l.transform)==null?void 0:f.position,p=((h=c==null?void 0:c.x)!=null?h:0)+s,d=((m=c==null?void 0:c.y)!=null?m:0)+o,{applyConfigOverride:u}=await import("./ConfigOverride-JLWPHR4L.js");u({objectId:this.selectedObjectId,path:"transform.position",value:{x:p,y:d}},{silent:!0,emitEvent:!0});let g=window.applyEditableObjectConfig;if(typeof g=="function"){let x=window.__editableConfig,w=(v=(y=(b=x==null?void 0:x.objects)==null?void 0:b.get)==null?void 0:y.call(b,this.selectedObjectId))!=null?v:l;await g(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async s=>{var u,g,f,h,m;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=(u=o.transform)==null?void 0:u.scale)!=null?g:1,c=Math.max(.1,l+s),{applyConfigOverride:p}=await import("./ConfigOverride-JLWPHR4L.js");p({objectId:this.selectedObjectId,path:"transform.scale",value:c},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let b=window.__editableConfig,y=(m=(h=(f=b==null?void 0:b.objects)==null?void 0:f.get)==null?void 0:h.call(f,this.selectedObjectId))!=null?m:o;await d(this.selectedObjectId,y)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let n=t==null?void 0:t.querySelector("#debug-nudge-enabled");n==null||n.addEventListener("change",()=>{n.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let s=window;typeof s.__previewShowLoading=="function"?s.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let s=window;typeof s.__previewHideLoading=="function"?s.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:s=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({loading:s}),typeof o.__previewUpdateLoading=="function"?o.__previewUpdateLoading(s):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(s,o,l,c)=>{this.customizeSettingsPanel.openAiEditor(s,o,l,c)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(r=this.debugOverlay)==null||r.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=s=>this.selectObject(s),window.addEventListener("config:changed",s=>{var o,l;((o=s.detail)==null?void 0:o.action)!=="remove"&&((l=s.detail)==null?void 0:l.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(s,o,l)=>this.applySlotAsset(s,o,l),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var o;let s=window.getActiveConfig;if(typeof s=="function"){let l=s();return((o=l==null?void 0:l.engine)==null?void 0:o.splash)||null}return null},window.addAssetToRegistry=(s,o)=>{let l=window.getEditableAssets;if(typeof l=="function"){let c=l();if(c!=null&&c.libraryAssets&&(c.libraryAssets[s]||(c.libraryAssets[s]=[]),!c.libraryAssets[s].some(d=>d.filename===o))){let d=o.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");c.libraryAssets[s].unshift({filename:o,displayName:d}),console.log(`[DEBUG] Added ${o} to registry category ${s}`)}}}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&(this.activeTab="inspector",this.updateWorkbenchTabs())}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`
1055
+ Are you absolutely sure?`))try{let t=Ot(),i={};for(let[r,s]of Object.entries(t.objects)){let o=s,l=r;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${r}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[r,s]of Object.entries(t.scenes)){let o=r.startsWith("scene.")?r:`scene.${r}`;i[`scenes/${o}.json`]=s}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let r=await n.json();throw new Error(r.error||"Direct apply failed")}lt(),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 Ht;this.sceneToolsPanel=new $t;this.nudgePanel=new Bt;this.inspectorPanel=new Qt;this.libraryPanel=new Nt;this.brandVisionPanel=new ii;this.customizeSettingsPanel=new ni;this.configPersistencePanel=new ui;this.loadingScreenPanel=new ai}applyAssetChange(e,t){return Ja(this,e,t)}resetAsset(e){return Za(this,e)}applySlotAsset(e,t,i){return Qa(this,e,t,i)}resetSlotAsset(e,t,i){return er(this,e,t,i)}startObjectVisuals(){return sr(this)}stopObjectVisuals(){return or(this)}shouldRunObjectVisuals(){return si(this)}updateObjectVisuals(){return oi(this)}getSelectedInstanceId(){return Ki(this)}getDisplayObjectById(e){return Xi(this,e)}getSelectedObjectConfig(){return ut(this)}getConfigAnchorWorldPoint(e){return Ji(this,e)}getScreenSize(){return Zi(this)}ensureBoundsGfx(){return Qi(this)}ensureAnchorGfx(){return en(this)}drawBounds(e){return tn(this,e)}drawAnchor(e){return nn(this,e)}clearBounds(){return an(this)}clearAnchor(){return rn(this)}clearObjectVisuals(){return pt(this)}updateObjectInfo(e){return dt(this,e)}resetDebugConfig(){return ci(this)}applyDebugConfig(){return dr(this)}exportDebugConfig(){return di(this)}loadObjectConfig(e){return pr(this,e)}fillConfigViewer(e){return li(this,e)}copyConfigValues(){return ur(this)}applyObjectConfig(e){return on(this,e)}applyCustomizeSettings(e,t){return gr(this,e,t)}scheduleObjectAutoApply(){return hr(this)}setupDebugEventListeners(){return yr(this)}setupDebugInputListeners(e){return dn(this,e)}setupPanelLayout(){return vr(this)}setupCollapsiblePanels(e){return pn(this,e)}setupRangeInput(e,t,i,n){return ae(this,e,t,i,n)}updateWorkbenchTabs(){return cn(this)}saveWorkbenchState(){return Ie(this)}loadWorkbenchState(){return pi(this)}initialize(e){var r;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let s=localStorage.getItem("preview_workbench_state");if(s){let o=JSON.parse(s);o.activeTab&&(this.activeTab=o.activeTab)}}catch(s){console.warn("[PREVIEW] Failed to load workbench tab state",s)}this.sceneObjectsPanel.initialize(e,{onSelect:s=>this.handleObjectSelect(s)}),this.libraryPanel.initialize(e,{onApply:(s,o,l)=>this.applySlotAsset(s,o,l),onReset:(s,o,l)=>this.resetSlotAsset(s,o,l)}),this.inspectorPanel.initialize(e,{onPropertyChange:(s,o,l)=>{console.log("[Inspector] Property changed:",s,o,l)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let s="/dashboard";window.location.pathname!==s&&(window.location.href=s)}),this.customizeSettingsPanel.initialize(e,{onApply:(s,o)=>this.applyCustomizeSettings(s,o)});let t=e.querySelector("#scene-tools-container");t&&(t.innerHTML=this.sceneToolsPanel.render());let i=e.querySelector("#nudge-panel-container");i&&(i.innerHTML=this.nudgePanel.render()),this.sceneToolsPanel.initialize(t||e,{onHighlightObject:s=>{this.highlightObject=s,s?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:s=>{this.highlightAnchor=s,s?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(s,o)=>this.nudgeSelectedObject(s,o),onShowSplash:()=>{let s=window;typeof s.__previewShowSplash=="function"&&s.__previewShowSplash()},onUpdateSplash:s=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({splash:s})}}),this.nudgePanel.initialize(i||e,{onNudge:async(s,o)=>{var f,h,m,b,y,v;if(!this.selectedObjectId)return;let l=this.getSelectedObjectConfig();if(!l)return;let c=(f=l.transform)==null?void 0:f.position,d=((h=c==null?void 0:c.x)!=null?h:0)+s,p=((m=c==null?void 0:c.y)!=null?m:0)+o,{applyConfigOverride:u}=await import("./ConfigOverride-JLWPHR4L.js");u({objectId:this.selectedObjectId,path:"transform.position",value:{x:d,y:p}},{silent:!0,emitEvent:!0});let g=window.applyEditableObjectConfig;if(typeof g=="function"){let x=window.__editableConfig,w=(v=(y=(b=x==null?void 0:x.objects)==null?void 0:b.get)==null?void 0:y.call(b,this.selectedObjectId))!=null?v:l;await g(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async s=>{var u,g,f,h,m;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=(u=o.transform)==null?void 0:u.scale)!=null?g:1,c=Math.max(.1,l+s),{applyConfigOverride:d}=await import("./ConfigOverride-JLWPHR4L.js");d({objectId:this.selectedObjectId,path:"transform.scale",value:c},{silent:!0,emitEvent:!0});let p=window.applyEditableObjectConfig;if(typeof p=="function"){let b=window.__editableConfig,y=(m=(h=(f=b==null?void 0:b.objects)==null?void 0:f.get)==null?void 0:h.call(f,this.selectedObjectId))!=null?m:o;await p(this.selectedObjectId,y)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let n=t==null?void 0:t.querySelector("#debug-nudge-enabled");n==null||n.addEventListener("change",()=>{n.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let s=window;typeof s.__previewShowLoading=="function"?s.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let s=window;typeof s.__previewHideLoading=="function"?s.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:s=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({loading:s}),typeof o.__previewUpdateLoading=="function"?o.__previewUpdateLoading(s):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(s,o,l,c)=>{this.customizeSettingsPanel.openAiEditor(s,o,l,c)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(r=this.debugOverlay)==null||r.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=s=>this.selectObject(s),window.addEventListener("config:changed",s=>{var o,l;((o=s.detail)==null?void 0:o.action)!=="remove"&&((l=s.detail)==null?void 0:l.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(s,o,l)=>this.applySlotAsset(s,o,l),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var o;let s=window.getActiveConfig;if(typeof s=="function"){let l=s();return((o=l==null?void 0:l.engine)==null?void 0:o.splash)||null}return null},window.addAssetToRegistry=(s,o)=>{let l=window.getEditableAssets;if(typeof l=="function"){let c=l();if(c!=null&&c.libraryAssets&&(c.libraryAssets[s]||(c.libraryAssets[s]=[]),!c.libraryAssets[s].some(p=>p.filename===o))){let p=o.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");c.libraryAssets[s].unshift({filename:o,displayName:p}),console.log(`[DEBUG] Added ${o} to registry category ${s}`)}}},window.__highlightLibrarySlot=(s,o)=>{this.libraryPanel.highlightSlot(s,o)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&(this.activeTab="inspector",this.updateWorkbenchTabs())}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`
1083
1056
  <div class="debug-overlay hidden" id="debug-overlay">
1084
1057
  <div class="debug-workbench" id="debug-workbench">
1085
1058
  <div class="workbench-header" id="workbench-handle">
@@ -1121,8 +1094,12 @@ Are you absolutely sure?`))try{let t=ea(),i={};for(let[r,s]of Object.entries(t.o
1121
1094
 
1122
1095
  <!-- Standalone Hierarchy Panel -->
1123
1096
  ${this.sceneObjectsPanel.render()}
1097
+
1098
+ <!-- Scene Tools and Nudge Panels - siblings of hierarchy panel -->
1099
+ <div id="scene-tools-container"></div>
1100
+ <div id="nudge-panel-container"></div>
1124
1101
  </div>
1125
- `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.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()}nudgeSelectedObject(e,t){var p,d,u;if(!this.selectedObjectId||!this.container)return;let i=this.nudgePanel.getNudgeStep(),n=this.container.querySelector("#config-pos-x"),r=this.container.querySelector("#config-pos-y");if(!n||!r)return;let s=Number((p=n.value)!=null?p:0),o=Number((d=r.value)!=null?d:0),l=s+e*i,c=o+t*i;n&&(n.value=String(l)),r&&(r.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function hs(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function fs(a){var n;let[e,t]=a.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 ms(a){return`
1102
+ `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.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()}nudgeSelectedObject(e,t){var d,p,u;if(!this.selectedObjectId||!this.container)return;let i=this.nudgePanel.getNudgeStep(),n=this.container.querySelector("#config-pos-x"),r=this.container.querySelector("#config-pos-y");if(!n||!r)return;let s=Number((d=n.value)!=null?d:0),o=Number((p=r.value)!=null?p:0),l=s+e*i,c=o+t*i;n&&(n.value=String(l)),r&&(r.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function hs(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function fs(a){var n;let[e,t]=a.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 ms(a){return`
1126
1103
  Analyze these screenshots of a brand or game and extract its "Brand DNA".
1127
1104
 
1128
1105
  Provide a concise summary (2-3 sentences) covering:
@@ -1139,9 +1116,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
1139
1116
  ${a?`
1140
1117
  ADDITIONAL RULES/NOTES:
1141
1118
  ${a}`:""}
1142
- `.trim()}function xr(){let a=[],e="",t=null;return{async addSources(i){let n=[];for(let r of i){let s=await hs(r),o=fs(s),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:r.name,base64:o.base64,mimeType:o.mimeType,dataUrl:s};a.push(l),n.push(l)}return n},getSources(){return a.slice()},async analyze(i,n,r){if(a.length===0)throw new Error("No screenshots to analyze.");let s=ms(n),o=a.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await Qt(i,s,o,{model:r}),c=e,p=[],d=l.split(`
1143
- `);for(let u of d)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(f=>{p.includes(f.toUpperCase())||p.push(f.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
1144
- Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Oe="handler_api_key_";var We=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},r=`${Oe}${e}`;localStorage.setItem(r,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Oe}${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=`${Oe}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Oe}${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(Oe)){let n=i.substring(Oe.length),r=localStorage.getItem(i);if(r){let s=JSON.parse(r);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(Oe)&&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}}},un=()=>We.getKey("gemini"),gn=(a,e)=>We.setKey("gemini",a,e),bs=()=>We.hasKey("gemini");window.ApiKeyStorage=We;window.getGeminiApiKey=un;window.setGeminiApiKey=gn;window.hasGeminiApiKey=bs;var fn=class{constructor(){this.modal=null;this.options=null;this.analyzer=xr();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
1119
+ `.trim()}function xr(){let a=[],e="",t=null;return{async addSources(i){let n=[];for(let r of i){let s=await hs(r),o=fs(s),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:r.name,base64:o.base64,mimeType:o.mimeType,dataUrl:s};a.push(l),n.push(l)}return n},getSources(){return a.slice()},async analyze(i,n,r){if(a.length===0)throw new Error("No screenshots to analyze.");let s=ms(n),o=a.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await ti(i,s,o,{model:r}),c=e,d=[],p=l.split(`
1120
+ `);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(f=>{d.includes(f.toUpperCase())||d.push(f.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
1121
+ 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 Oe="handler_api_key_";var We=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},r=`${Oe}${e}`;localStorage.setItem(r,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Oe}${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=`${Oe}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Oe}${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(Oe)){let n=i.substring(Oe.length),r=localStorage.getItem(i);if(r){let s=JSON.parse(r);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(Oe)&&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}}},un=()=>We.getKey("gemini"),gn=(a,e)=>We.setKey("gemini",a,e),bs=()=>We.hasKey("gemini");window.ApiKeyStorage=We;window.getGeminiApiKey=un;window.setGeminiApiKey=gn;window.hasGeminiApiKey=bs;var fn=class{constructor(){this.modal=null;this.options=null;this.analyzer=xr();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
1145
1122
  <div class="ai-modal-card">
1146
1123
  <div class="ai-modal-header">
1147
1124
  <div class="ai-modal-actions">
@@ -1222,12 +1199,12 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0
1222
1199
  </div>
1223
1200
  `,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var n;this.currentPrompt=((n=this.promptInput)==null?void 0:n.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",n=>{var o;let r=n.target;switch(r.dataset.action||((o=r.closest("[data-action]"))==null?void 0:o.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",n=>{let r=n.target;if(r.classList.contains("ai-gallery-item")||r.closest(".ai-gallery-item")){let s=r.closest(".ai-gallery-item"),o=parseInt(s.dataset.index||"-1");o>=0&&this.selectImage(o)}}),this.modal.addEventListener("click",n=>{n.target===this.modal&&this.close()}),this.updateGenerateButton()}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var t;let e=(t=this.modal)==null?void 0:t.querySelector("#ai-use-dna");if(e!=null&&e.checked)try{let i=this.analyzer.getResult();if(i!=null&&i.summary&&this.promptInput){let n=`${this.currentPrompt}
1224
1201
 
1225
- 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 r=this.getApiKey();if(!r){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 Zt(this.options.currentValue);c&&(s=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let o=await Ye(r,this.currentPrompt,s,{aspectRatio:"1:1"}),l=await Ve(o);this.generatedImages.push(l||o),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(r){console.error("[AiEditorModal] Generation failed:",r),alert(`Generation failed: ${r instanceof Error?r.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)=>`
1202
+ 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 r=this.getApiKey();if(!r){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 ei(this.options.currentValue);c&&(s=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let o=await Ye(r,this.currentPrompt,s,{aspectRatio:"1:1"}),l=await Ve(o);this.generatedImages.push(l||o),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(r){console.error("[AiEditorModal] Generation failed:",r),alert(`Generation failed: ${r instanceof Error?r.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)=>`
1226
1203
  <div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
1227
1204
  <img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
1228
1205
  <div class="ai-gallery-label">#${i+1}</div>
1229
1206
  </div>
1230
- `).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=un();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return gn(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}},hn=null;window.__openAiEditor=function(a,e,t,i){hn||(hn=new fn),hn.open({objectId:a,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let r=window.updateManager;if(r)r.updateProperty(a,i.path,n);else{let s=window.getEditableObjectConfig,o=s==null?void 0:s(a);if(o){let l=i.path.split("."),c=o;for(let p=0;p<l.length-1;p++)c[l[p]]||(c[l[p]]={}),c=c[l[p]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var mn=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",r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
1207
+ `).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=un();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return gn(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}},hn=null;window.__openAiEditor=function(a,e,t,i){hn||(hn=new fn),hn.open({objectId:a,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let r=window.updateManager;if(r)r.updateProperty(a,i.path,n);else{let s=window.getEditableObjectConfig,o=s==null?void 0:s(a);if(o){let l=i.path.split("."),c=o;for(let d=0;d<l.length-1;d++)c[l[d]]||(c[l[d]]={}),c=c[l[d]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var mn=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",r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
1231
1208
  <div class="asset-preview-card">
1232
1209
  <div class="asset-preview-header">
1233
1210
  <div class="asset-preview-title">${n}</div>
@@ -1305,7 +1282,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1305
1282
  <button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
1306
1283
  </div>
1307
1284
  </div>
1308
- `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+i-r,t],[e,t+n-r],[e+i-r,t+n-r]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,r=i/this.cropHeight,s=Math.min(n,r),o=this.cropWidth*s,l=this.cropHeight*s,c=(i-o)/2,p=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,p,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(a){new bn().open(a)};var yn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.comparePresets=[Ge("playable-portrait"),Ge("iphone-14"),Ge("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.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;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=Ge(e.defaultDevice||Ui.id),this.debugPanel=new pi,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}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(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.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,r;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=Ge(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(r=(n=this.options).onDeviceChange)==null||r.call(n,this.getEffectivePreset()),this.emitScreenChange()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell",e.innerHTML=`
1285
+ `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+i-r,t],[e,t+n-r],[e+i-r,t+n-r]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,r=i/this.cropHeight,s=Math.min(n,r),o=this.cropWidth*s,l=this.cropHeight*s,c=(i-o)/2,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(a){new bn().open(a)};var yn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.comparePresets=[Ge("playable-portrait"),Ge("iphone-14"),Ge("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.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;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=Ge(e.defaultDevice||Ui.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.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}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(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.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,r;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=Ge(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(r=(n=this.options).onDeviceChange)==null||r.call(n,this.getEffectivePreset()),this.emitScreenChange()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell",e.innerHTML=`
1309
1286
  <div class="preview-toolbar">
1310
1287
  <div class="preview-toolbar-left">
1311
1288
  <span class="preview-logo">PREVIEWER</span>
@@ -1368,9 +1345,6 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1368
1345
  </div>
1369
1346
 
1370
1347
  <div class="preview-main">
1371
- <!-- Scene Tools and Nudge Panels - positioned relative to preview-main -->
1372
- <div id="scene-tools-container"></div>
1373
- <div id="nudge-panel-container"></div>
1374
1348
 
1375
1349
  <div class="preview-container">
1376
1350
  <div class="preview-stage" data-preview-stage="single">
@@ -1444,7 +1418,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1444
1418
  <div class="console-messages" id="console-messages"></div>
1445
1419
  </div>
1446
1420
  </div>
1447
- `,this.setupEventListeners(e),e}setupEventListeners(e){var n,r,s,o,l,c,p,d,u,g;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",f=>{if(this.viewMode==="compare")return;let h=f.target.value;this.setDevice(h)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(f=>{f.addEventListener("click",()=>{let h=f.dataset.viewToggle;h&&this.setViewMode(h)})}),(n=e.querySelector("#rotate-btn"))==null||n.addEventListener("click",()=>this.toggleRotation()),(r=e.querySelector("#zoom-in-btn"))==null||r.addEventListener("click",()=>this.adjustUserZoom(.1)),(s=e.querySelector("#zoom-out-btn"))==null||s.addEventListener("click",()=>this.adjustUserZoom(-.1)),(o=e.querySelector("#refresh-btn"))==null||o.addEventListener("click",()=>this.refresh()),(l=e.querySelector("#console-toggle"))==null||l.addEventListener("click",()=>this.toggleConsole()),(c=e.querySelector("#console-close"))==null||c.addEventListener("click",()=>this.toggleConsole(!1)),(p=e.querySelector("#console-clear"))==null||p.addEventListener("click",()=>this.clearConsole()),(d=e.querySelector("#corner-zoom-in-btn"))==null||d.addEventListener("click",()=>this.adjustUserZoom(.1)),(u=e.querySelector("#corner-zoom-out-btn"))==null||u.addEventListener("click",()=>this.adjustUserZoom(-.1)),(g=e.querySelector("#corner-grab-btn"))==null||g.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)})}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:"0 20px 50px rgba(0,0,0,0.5)",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.gameReady||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),r=Math.max(0,i.height);if(n<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let s=n/t.width,o=r/t.height;if(this.autoScale=Math.max(.01,Math.min(s,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){var r;if(!this.gameReady||this.viewMode==="compare")return;let e=this.frameWrapper.getBoundingClientRect(),t=(r=this.container.querySelector(".preview-main"))==null?void 0:r.getBoundingClientRect();if(!t)return;let i=this.container.querySelector("#scene-tools-container");if(i&&i.children.length>0){let o=e.left-t.left+e.width/2,l=e.top-t.top-80;i.style.position="absolute",i.style.left=`${o}px`,i.style.top=`${l}px`,i.style.transform="translate(-50%, -100%)",i.style.zIndex="100"}let n=this.container.querySelector("#nudge-panel-container");if(n&&n.children.length>0){let o=e.left-t.left-16,l=e.bottom-t.top+16;n.style.position="absolute",n.style.left=`${o}px`,n.style.top=`${l}px`,n.style.transform="translate(-100%, 0)",n.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}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=console.log.bind(console),t=console.warn.bind(console),i=console.error.bind(console),n=console.info.bind(console),r=(s,...o)=>{let l=o.map(p=>typeof p=="object"?this.safeStringify(p):String(p)).join(" ");this.consoleMessages.push({type:s,message:l,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let c=this.container.querySelector("#console-badge");if(c){let p=this.consoleMessages.filter(d=>d.type==="error").length;c.textContent=p>0?`${p}!`:"0",c.classList.toggle("has-errors",p>0)}};console.log=(...s)=>{e(...s),r("log",...s)},console.warn=(...s)=>{t(...s),r("warn",...s)},console.error=(...s)=>{i(...s),r("error",...s)},console.info=(...s)=>{n(...s),r("info",...s)}}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(d=>d.id===i);if(!n)return;let r=t.querySelector("[data-compare-slot]"),s=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!r||!s||!o||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:r,ghost:s,wrapper:o,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var r,s;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(s=(r=this.options).onDeviceChange)==null||s.call(r,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 r=i/e.preset.width,s=n/e.preset.height,o=Math.max(.01,Math.min(r,s));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let r=t.canvas.width,s=t.canvas.height,o=Math.min(r/i.width,s/i.height),l=i.width*o,c=i.height*o,p=(r-l)/2,d=(s-c)/2;n.clearRect(0,0,r,s),n.drawImage(i,p,d,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function wr(a={}){let e=new yn(a);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as ys,Container as Er}from"pixi.js";var vs=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",vn=vs;if(typeof window!="undefined")try{let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);e!=null&&e.buildMode&&(vn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${vn}`))}}catch{}function xs(a){var t,i,n,r,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(a);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(a))return{x:(t=a[0])!=null?t:.5,y:(i=a[1])!=null?i:.5};if(a&&typeof a=="object"&&"x"in a&&"y"in a)return{x:(n=a.x)!=null?n:.5,y:(r=a.y)!=null?r:.5};if(typeof a=="string"){let o=a.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var ke=class{static async create(e,t,i){var l,c,p,d,u,g,f;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 h=new Er;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let r=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${n.type}, path: ${n.path}`);let s=await Mi.load(e,n,i,r);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=s==null?void 0:s.constructor)==null?void 0:p.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new ys(s),console.log("[ObjectFactory] Created object:",o,"type:",(d=o==null?void 0:o.constructor)==null?void 0:d.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=s==null?void 0:s.constructor)==null?void 0:u.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof Er)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let b of h)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(f=o==null?void 0:o.constructor)==null?void 0:f.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=s)}else o=s;else o=s,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,r,s,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((s=t.position.x)!=null?s:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=xs(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};function xn(a){try{if(a&&typeof a.keys=="function")return Array.from(a.keys())}catch{}return[]}function Ar(a){var e;return a?((e=a.getDisplayObject)==null?void 0:e.call(a))||a.pixiObject||a:null}function ws(a,e){if(!a||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);a.eventMode=i?"static":"none",a.interactive=i,i&&(a.cursor=t.draggable?"move":"pointer")}function Sr(a,e){var l,c,p;if(!a||!e)return;let t=e.transform||{};ws(a,e);let i=t.position||{},n=t.offset||{},r=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),s=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=a.position)!=null&&l.set?a.position.set(r,s):(typeof a.x=="number"&&(a.x=r),typeof a.y=="number"&&(a.y=s)),typeof t.scale=="number"&&((c=a.scale)!=null&&c.set?a.scale.set(t.scale):a.scale&&(a.scale.x=t.scale,a.scale.y=t.scale));let o=t.anchor;if(o&&((p=a.anchor)!=null&&p.set)){let d=null;typeof window!="undefined"&&window.resolveAnchorVec2?d=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?d=o:Array.isArray(o)&&o.length===2&&(d={x:o[0],y:o[1]}),d&&typeof d.x=="number"&&typeof d.y=="number"&&a.anchor.set(d.x,d.y)}}function Cr(a){if(typeof window=="undefined")return;let e=a==null?void 0:a.objects,t=xn(e),i=r=>{try{let s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return r;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?r.filter(c=>l[c]===s):r}catch{return r}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(r=>n.set(r,[r])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Cr(window.__editableConfig),window.getEditableObjectList=()=>{var r;return i(xn((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return xn((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,g,f;let s=(g=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,r))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return s;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[r];return c&&c===o?s:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let s={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return r}}function Es(){if(typeof window=="undefined")return;let a=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var r,s,o;let n=a(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),p=Date.now(),d=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let g=window.CustomAssets;(r=g==null?void 0:g[t])!=null&&r.texture&&(g[t].texture=u);let f=window.gameObjectManager,h=(s=f==null?void 0:f.get)==null?void 0:s.call(f,t);if(h){let m=((o=h.getDisplayObject)==null?void 0:o.call(h))||h.pixiObject||h.pixi||h;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.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=Ii();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Rt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Ii();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Rt(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[r,s]of Object.entries(t.runtime))n.push({path:`runtime.${r}`,value:s});if(t.assets)for(let[r,s]of Object.entries(t.assets))n.push({path:`assets.${r}`,value:s}),typeof s=="string"&&e(r,s);if(t.splash)for(let[r,s]of Object.entries(t.splash))n.push({path:`splash.${r}`,value:s});if(t.loading)for(let[r,s]of Object.entries(t.loading))n.push({path:`loading.${r}`,value:s});if(t.start)for(let[r,s]of Object.entries(t.start))n.push({path:`start.${r}`,value:s});n.length&&Rt(n,{silent:!0,persist:!0,emitEvent:!0})}}function wn(a){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=a;t&&(t.onObjectRebuildRequired=async(r,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let o=t.get(r),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);o?t.remove(r):l&&l.destroy();let d=window.gameApp,u=await ke.create(r,s,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),g}),typeof window!="undefined"&&(Es(),window.applyEditableObjectConfig=(r,s)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let p=window.__editableConfig;(o=p==null?void 0:p.objects)!=null&&o.set&&(p.objects.set(r,s),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,r);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(s);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=Ar(d);Sr(u,s)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(r,s){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let o=e();(p=o==null?void 0:o.objects)!=null&&p.set&&(o.objects.set(r,s),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,r);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=Ar(l);Sr(u,s)}let c=[r];i==null||i(r,s,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,Cr(r))}};return n.rebuildIndexes(),n}import As from"lottie-web";Cn(Ia);typeof window!="undefined"&&!window.lottie&&(window.lottie=As);var Ke=null,Ss=async()=>{if(!Ke){let a=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(a==null?void 0:a["handler.config"])||(a==null?void 0:a["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);Ke=JSON.parse(i)}else Ke=JSON.parse(e);return Ke}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}Ke=await(await fetch("./handler.config.json")).json()}return Ke},Ln,gt,kr,Xe,An,Sn;function ld(a){Ln=a.initGame,gt=a.CustomAssets,kr=a.updateScreenState,Xe=a.globalResponsiveMultipliers,An=a.layout,Sn=a.clearResponsiveElements}var ui="web_embed",ut="https://example.com",Lr={profile_id:ui},Pe=null,ce=null,En={width:0,height:0},Cs=!0,cd=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let a=await Ss();Lr={...a.ids||{},profile_id:ui},ut=a.destination_url||((p=(c=a.export_profiles)==null?void 0:c[ui])==null?void 0:p.destination_url)||ut,me.init({ids:Lr,profile:ui,destinationUrl:ut});let e=me.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ce=wr({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),Tr()},onRefresh:Tr});let g=ce.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var v,x,w,C,k,P,O,j,T,E,S;let h=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=f.detail;if(En.width=b,En.height=y,kr(b,y),!(!h||!h.renderer)){m&&o(h,m);try{h.renderer.resize(b,y);let A=h.view;A&&(A.style.width="100%",A.style.height="100%",A.style.display="block")}catch(A){console.warn("[SCREEN] Error resizing renderer:",A);return}if(t&&m&&An)try{let A=(v=window.__mainContainer)!=null?v:h.stage,M=(O=(P=(C=window.__tutorialLabel)!=null?C:(w=(x=m.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:w.call(x))!=null?P:(k=m.get("label_1"))==null?void 0:k.pixiObject)!=null?O:m.get("label_1"),I=m.get("background_1"),D=(S=(E=(T=window.__background)!=null?T:(j=I==null?void 0:I.getDisplayObject)==null?void 0:j.call(I))!=null?E:I==null?void 0:I.pixiObject)!=null?S:I;if(A){let L=A===h.stage;An({mainContainer:A,label:M,background:D,backgroundTexture:(D==null?void 0:D.texture)||null,app:h},t,0,En,m,{skipMainContainerTransform:L})}}catch(A){console.warn("[SCREEN] Error in layout:",A)}}})}let t=await It("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Oi(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await It("scene.main"));let i=await Ln(e,t,ut,ce);Pe=i.app;let n=i.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=n;try{window.__liveEditBridge=wn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:gt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ce&&ce.notifyGameLoaded();let r=window.__debugScale;r&&typeof r=="number"&&(Xe.scale=r,console.log(`[DEBUG] Applied persisted debug scale: ${r}`)),o(Pe,n);async function s(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,x=await fetch(v,{cache:"no-cache"});if(!x.ok)return null;let w=await x.text();try{return JSON.parse(w)}catch{return null}},f=await g("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let h=f.screens;if(!h||typeof h!="object")return;let m={},b={};for(let[y,v]of Object.entries(h)){let x=v==null?void 0:v.source;if(typeof x!="string")continue;let w=await g(x),C=w==null?void 0:w.elements;if(!Array.isArray(C))continue;let k=C.map(P=>P==null?void 0:P.instance_id).filter(P=>typeof P=="string");m[y]=k;for(let P of k)b[P]||(b[P]=y)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,f){if(Cs){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${Xe.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((x,w)=>{if(x&&x.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let C=x.scale.x||1,k=x.scale.y||1;x.__originalScale||(x.__originalScale={x:C,y:k},console.log(`${v}[RESPONSIVE] Stored original scale for child[${w}]: ${C.toFixed(3)}, ${k.toFixed(3)}`));let P=x.__originalScale.x*Xe.scale,O=x.__originalScale.y*Xe.scale;typeof x.scale.set=="function"?x.scale.set(P,O):(x.scale.x=P,x.scale.y=O),console.log(`${v}[RESPONSIVE] Child[${w}] scale: ${C.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),m(x,y+1)}else x&&console.log(`${v}[RESPONSIVE] Child[${w}] has no scale (type: ${x.constructor.name})`)})};var h=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(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){Xe.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let f=window.gameApp,h=window.gameObjectManager;f&&h?(o(f,h),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!h}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,me.start()},Tr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let a=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(a){let r=((t=a.getDisplayObject)==null?void 0:t.call(a))||a;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=r.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=r.scale.y)!=null?n:1).toFixed(3)}`)}if(ce){ce.notifyGameDestroyed();try{Sn&&Sn()}catch(r){console.warn("Failed to clear responsive elements",r)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let r=ce.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),Pe){try{Pe.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}Pe=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof gt.resetScene=="function"&&gt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{It("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Oi(o)),Ln(r,o,ut).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=wn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:gt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ce&&ce.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{me.start()}catch{}})})},100)},1e3)}};var be={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Ls=1.25,Ts={fontFamily:"Inter, system-ui, sans-serif"};var Tn=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=`
1421
+ `,this.setupEventListeners(e),e}setupEventListeners(e){var n,r,s,o,l,c,d,p,u,g;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",f=>{if(this.viewMode==="compare")return;let h=f.target.value;this.setDevice(h)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(f=>{f.addEventListener("click",()=>{let h=f.dataset.viewToggle;h&&this.setViewMode(h)})}),(n=e.querySelector("#rotate-btn"))==null||n.addEventListener("click",()=>this.toggleRotation()),(r=e.querySelector("#zoom-in-btn"))==null||r.addEventListener("click",()=>this.adjustUserZoom(.1)),(s=e.querySelector("#zoom-out-btn"))==null||s.addEventListener("click",()=>this.adjustUserZoom(-.1)),(o=e.querySelector("#refresh-btn"))==null||o.addEventListener("click",()=>this.refresh()),(l=e.querySelector("#console-toggle"))==null||l.addEventListener("click",()=>this.toggleConsole()),(c=e.querySelector("#console-close"))==null||c.addEventListener("click",()=>this.toggleConsole(!1)),(d=e.querySelector("#console-clear"))==null||d.addEventListener("click",()=>this.clearConsole()),(p=e.querySelector("#corner-zoom-in-btn"))==null||p.addEventListener("click",()=>this.adjustUserZoom(.1)),(u=e.querySelector("#corner-zoom-out-btn"))==null||u.addEventListener("click",()=>this.adjustUserZoom(-.1)),(g=e.querySelector("#corner-grab-btn"))==null||g.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)})}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:"0 20px 50px rgba(0,0,0,0.5)",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.gameReady||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),r=Math.max(0,i.height);if(n<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let s=n/t.width,o=r/t.height;if(this.autoScale=Math.max(.01,Math.min(s,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector("#scene-tools-container"),t=this.container.querySelector("#nudge-panel-container");e&&e.children.length>0&&(e.style.position="absolute",e.style.left="50%",e.style.top="16px",e.style.transform="translateX(-50%)",e.style.zIndex="100"),t&&t.children.length>0&&(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}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=console.log.bind(console),t=console.warn.bind(console),i=console.error.bind(console),n=console.info.bind(console),r=(s,...o)=>{let l=o.map(d=>typeof d=="object"?this.safeStringify(d):String(d)).join(" ");this.consoleMessages.push({type:s,message:l,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let c=this.container.querySelector("#console-badge");if(c){let d=this.consoleMessages.filter(p=>p.type==="error").length;c.textContent=d>0?`${d}!`:"0",c.classList.toggle("has-errors",d>0)}};console.log=(...s)=>{e(...s),r("log",...s)},console.warn=(...s)=>{t(...s),r("warn",...s)},console.error=(...s)=>{i(...s),r("error",...s)},console.info=(...s)=>{n(...s),r("info",...s)}}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 r=t.querySelector("[data-compare-slot]"),s=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!r||!s||!o||!l||(t.addEventListener("click",p=>{let u=p.target;if(u!=null&&u.closest("[data-compare-focus]")){p.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:r,ghost:s,wrapper:o,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var r,s;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(s=(r=this.options).onDeviceChange)==null||s.call(r,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 r=i/e.preset.width,s=n/e.preset.height,o=Math.max(.01,Math.min(r,s));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let r=t.canvas.width,s=t.canvas.height,o=Math.min(r/i.width,s/i.height),l=i.width*o,c=i.height*o,d=(r-l)/2,p=(s-c)/2;n.clearRect(0,0,r,s),n.drawImage(i,d,p,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function wr(a={}){let e=new yn(a);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as ys,Container as Er}from"pixi.js";var vs=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",vn=vs;if(typeof window!="undefined")try{let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);e!=null&&e.buildMode&&(vn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${vn}`))}}catch{}function xs(a){var t,i,n,r,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(a);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(a))return{x:(t=a[0])!=null?t:.5,y:(i=a[1])!=null?i:.5};if(a&&typeof a=="object"&&"x"in a&&"y"in a)return{x:(n=a.x)!=null?n:.5,y:(r=a.y)!=null?r:.5};if(typeof a=="string"){let o=a.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var ke=class{static async create(e,t,i){var l,c,d,p,u,g,f;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 h=new Er;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let r=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${n.type}, path: ${n.path}`);let s=await Ri.load(e,n,i,r);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=s==null?void 0:s.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new ys(s),console.log("[ObjectFactory] Created object:",o,"type:",(p=o==null?void 0:o.constructor)==null?void 0:p.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=s==null?void 0:s.constructor)==null?void 0:u.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof Er)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let b of h)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(f=o==null?void 0:o.constructor)==null?void 0:f.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=s)}else o=s;else o=s,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,r,s,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((s=t.position.x)!=null?s:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=xs(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};function xn(a){try{if(a&&typeof a.keys=="function")return Array.from(a.keys())}catch{}return[]}function Ar(a){var e;return a?((e=a.getDisplayObject)==null?void 0:e.call(a))||a.pixiObject||a:null}function ws(a,e){if(!a||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);a.eventMode=i?"static":"none",a.interactive=i,i&&(a.cursor=t.draggable?"move":"pointer")}function Sr(a,e){var l,c,d;if(!a||!e)return;let t=e.transform||{};ws(a,e);let i=t.position||{},n=t.offset||{},r=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),s=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=a.position)!=null&&l.set?a.position.set(r,s):(typeof a.x=="number"&&(a.x=r),typeof a.y=="number"&&(a.y=s)),typeof t.scale=="number"&&((c=a.scale)!=null&&c.set?a.scale.set(t.scale):a.scale&&(a.scale.x=t.scale,a.scale.y=t.scale));let o=t.anchor;if(o&&((d=a.anchor)!=null&&d.set)){let p=null;typeof window!="undefined"&&window.resolveAnchorVec2?p=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?p=o:Array.isArray(o)&&o.length===2&&(p={x:o[0],y:o[1]}),p&&typeof p.x=="number"&&typeof p.y=="number"&&a.anchor.set(p.x,p.y)}}function Cr(a){if(typeof window=="undefined")return;let e=a==null?void 0:a.objects,t=xn(e),i=r=>{try{let s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return r;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?r.filter(c=>l[c]===s):r}catch{return r}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(r=>n.set(r,[r])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Cr(window.__editableConfig),window.getEditableObjectList=()=>{var r;return i(xn((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return xn((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var d,p,u,g,f;let s=(g=(u=(p=(d=window.__editableConfig)==null?void 0:d.objects)==null?void 0:p.get)==null?void 0:u.call(p,r))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return s;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[r];return c&&c===o?s:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let s={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return r}}function Es(){if(typeof window=="undefined")return;let a=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var r,s,o;let n=a(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;(r=g==null?void 0:g[t])!=null&&r.texture&&(g[t].texture=u);let f=window.gameObjectManager,h=(s=f==null?void 0:f.get)==null?void 0:s.call(f,t);if(h){let m=((o=h.getDisplayObject)==null?void 0:o.call(h))||h.pixiObject||h.pixi||h;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.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=Oi();Array.isArray(i)&&i.length&&(window.__editableConfig=t,It(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Oi();Array.isArray(i)&&i.length&&(window.__editableConfig=t,It(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[r,s]of Object.entries(t.runtime))n.push({path:`runtime.${r}`,value:s});if(t.assets)for(let[r,s]of Object.entries(t.assets))n.push({path:`assets.${r}`,value:s}),typeof s=="string"&&e(r,s);if(t.splash)for(let[r,s]of Object.entries(t.splash))n.push({path:`splash.${r}`,value:s});if(t.loading)for(let[r,s]of Object.entries(t.loading))n.push({path:`loading.${r}`,value:s});if(t.start)for(let[r,s]of Object.entries(t.start))n.push({path:`start.${r}`,value:s});n.length&&It(n,{silent:!0,persist:!0,emitEvent:!0})}}function wn(a){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=a;t&&(t.onObjectRebuildRequired=async(r,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let o=t.get(r),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(r):l&&l.destroy();let p=window.gameApp,u=await ke.create(r,s,p);c&&(d!==void 0&&d!==-1?c.addChildAt(u,d):c.addChild(u));let g=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),g}),typeof window!="undefined"&&(Es(),window.applyEditableObjectConfig=(r,s)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(r,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,r);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=Ar(p);Sr(u,s)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(r,s){var d,p;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(r,s),console.log("[BRIDGE] \u2705 Updated config"));let l=(p=t==null?void 0:t.get)==null?void 0:p.call(t,r);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=Ar(l);Sr(u,s)}let c=[r];i==null||i(r,s,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,Cr(r))}};return n.rebuildIndexes(),n}import As from"lottie-web";Cn(Ia);typeof window!="undefined"&&!window.lottie&&(window.lottie=As);var Ke=null,Ss=async()=>{if(!Ke){let a=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(a==null?void 0:a["handler.config"])||(a==null?void 0:a["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);Ke=JSON.parse(i)}else Ke=JSON.parse(e);return Ke}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}Ke=await(await fetch("./handler.config.json")).json()}return Ke},Tn,ht,kr,Xe,An,Sn;function ld(a){Tn=a.initGame,ht=a.CustomAssets,kr=a.updateScreenState,Xe=a.globalResponsiveMultipliers,An=a.layout,Sn=a.clearResponsiveElements}var hi="web_embed",gt="https://example.com",Tr={profile_id:hi},Pe=null,ce=null,En={width:0,height:0},Cs=!0,cd=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let a=await Ss();Tr={...a.ids||{},profile_id:hi},gt=a.destination_url||((d=(c=a.export_profiles)==null?void 0:c[hi])==null?void 0:d.destination_url)||gt,me.init({ids:Tr,profile:hi,destinationUrl:gt});let e=me.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ce=wr({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),Lr()},onRefresh:Lr});let g=ce.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var v,x,w,C,k,P,O,j,L,E,S;let h=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=f.detail;if(En.width=b,En.height=y,kr(b,y),!(!h||!h.renderer)){m&&o(h,m);try{h.renderer.resize(b,y);let A=h.view;A&&(A.style.width="100%",A.style.height="100%",A.style.display="block")}catch(A){console.warn("[SCREEN] Error resizing renderer:",A);return}if(t&&m&&An)try{let A=(v=window.__mainContainer)!=null?v:h.stage,M=(O=(P=(C=window.__tutorialLabel)!=null?C:(w=(x=m.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:w.call(x))!=null?P:(k=m.get("label_1"))==null?void 0:k.pixiObject)!=null?O:m.get("label_1"),I=m.get("background_1"),D=(S=(E=(L=window.__background)!=null?L:(j=I==null?void 0:I.getDisplayObject)==null?void 0:j.call(I))!=null?E:I==null?void 0:I.pixiObject)!=null?S:I;if(A){let T=A===h.stage;An({mainContainer:A,label:M,background:D,backgroundTexture:(D==null?void 0:D.texture)||null,app:h},t,0,En,m,{skipMainContainerTransform:T})}}catch(A){console.warn("[SCREEN] Error in layout:",A)}}})}let t=await jt("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=ji(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 jt("scene.main"));let i=await Tn(e,t,gt,ce);Pe=i.app;let n=i.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=n;try{window.__liveEditBridge=wn({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:ht})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ce&&ce.notifyGameLoaded();let r=window.__debugScale;r&&typeof r=="number"&&(Xe.scale=r,console.log(`[DEBUG] Applied persisted debug scale: ${r}`)),o(Pe,n);async function s(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,x=await fetch(v,{cache:"no-cache"});if(!x.ok)return null;let w=await x.text();try{return JSON.parse(w)}catch{return null}},f=await g("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let h=f.screens;if(!h||typeof h!="object")return;let m={},b={};for(let[y,v]of Object.entries(h)){let x=v==null?void 0:v.source;if(typeof x!="string")continue;let w=await g(x),C=w==null?void 0:w.elements;if(!Array.isArray(C))continue;let k=C.map(P=>P==null?void 0:P.instance_id).filter(P=>typeof P=="string");m[y]=k;for(let P of k)b[P]||(b[P]=y)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,f){if(Cs){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${Xe.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((x,w)=>{if(x&&x.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let C=x.scale.x||1,k=x.scale.y||1;x.__originalScale||(x.__originalScale={x:C,y:k},console.log(`${v}[RESPONSIVE] Stored original scale for child[${w}]: ${C.toFixed(3)}, ${k.toFixed(3)}`));let P=x.__originalScale.x*Xe.scale,O=x.__originalScale.y*Xe.scale;typeof x.scale.set=="function"?x.scale.set(P,O):(x.scale.x=P,x.scale.y=O),console.log(`${v}[RESPONSIVE] Child[${w}] scale: ${C.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),m(x,y+1)}else x&&console.log(`${v}[RESPONSIVE] Child[${w}] has no scale (type: ${x.constructor.name})`)})};var h=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(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){Xe.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let f=window.gameApp,h=window.gameObjectManager;f&&h?(o(f,h),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!h}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,me.start()},Lr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let a=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(a){let r=((t=a.getDisplayObject)==null?void 0:t.call(a))||a;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=r.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=r.scale.y)!=null?n:1).toFixed(3)}`)}if(ce){ce.notifyGameDestroyed();try{Sn&&Sn()}catch(r){console.warn("Failed to clear responsive elements",r)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let r=ce.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),Pe){try{Pe.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}Pe=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof ht.resetScene=="function"&&ht.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{jt("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=ji(o)),Tn(r,o,gt).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=wn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:ht})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ce&&ce.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{me.start()}catch{}})})},100)},1e3)}};var be={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Ts=1.25,Ls={fontFamily:"Inter, system-ui, sans-serif"};var Ln=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=`
1448
1422
  position: fixed;
1449
1423
  inset: 0;
1450
1424
  display: flex;
@@ -1523,7 +1497,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1523
1497
  width: 1.5px;
1524
1498
  background-color: black;
1525
1499
  height: ${u%4===0?"6px":"2px"};
1526
- `,c.appendChild(g)}n.appendChild(r),n.appendChild(o),n.appendChild(c);let p=document.createElement("div");return p.id="handler-load-centered",p.style.cssText=`
1500
+ `,c.appendChild(g)}n.appendChild(r),n.appendChild(o),n.appendChild(c);let d=document.createElement("div");return d.id="handler-load-centered",d.style.cssText=`
1527
1501
  position: absolute;
1528
1502
  top: 48px;
1529
1503
  width: 600px;
@@ -1547,7 +1521,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1547
1521
  align-items: center;
1548
1522
  justify-content: center;
1549
1523
  animation-delay: ${[1.05,.875,.7,.525,.35,.175,0][g]}s;
1550
- `,p.appendChild(f)}),t.appendChild(n),t.appendChild(p),this.authSeq=document.createElement("div"),this.authSeq.style.cssText=`
1524
+ `,d.appendChild(f)}),t.appendChild(n),t.appendChild(d),this.authSeq=document.createElement("div"),this.authSeq.style.cssText=`
1551
1525
  position: absolute;
1552
1526
  bottom: 48px;
1553
1527
  font-size: 8px;
@@ -1643,7 +1617,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1643
1617
  0%, 100% { opacity: 1; }
1644
1618
  50% { opacity: 0.3; }
1645
1619
  }
1646
- `,document.head.appendChild(e)}setProgress(e){this.currentProgress=Math.max(0,Math.min(100,e)),this.progressBar.style.width=`${this.currentProgress}%`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`}mount(e=document.body){e.appendChild(this.container)}unmount(){this.container.parentElement&&this.container.parentElement.removeChild(this.container)}getElement(){return this.container}};var kn=ga.version,ks=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"]);ua();var jr={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"},Dr=Math.random().toString(36).slice(2),Qe=null,Je={...jr},zr="web_embed",Rn={},ft,Pn=!1,ht=!1,bt=!1,Hr=!1,Dn=1,hi=0,bi=!1,ye=!1,Ze="",et=Math.floor(window.innerWidth),tt=Math.floor(window.innerHeight),In=et>tt,ve=!1,mt=!1,Pr=!1,Mr=!1,Mn=!1,fi=null,je=null,On=!1,jn=!1,gi=new Map;function $r(){if(!je)return null;let a=Date.now()-je;return!Number.isFinite(a)||a<0?null:a}function _n(a){if(On)return;let e=$r();e!==null&&(On=!0,R("session_time",{duration_ms:e,reason:a}))}function _r(){if(Qe)return Qe;let a=document.createElement("div");return a.id="handler-root",a.setAttribute("data-handler-root","true"),document.body.appendChild(a),Qe=a,a}function mi(a){switch(a){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return a}}function Br(a,e){return{event_name:a,ts:Date.now(),session_id:Dr,deployment_id:Je.deployment_id,variant_id:Je.variant_id,export_profile_id:Je.profile_id,instance_id:Je.instance_id||"default",env:zr==="mraid"?"mraid":"web",attribution:ft,payload:e}}function R(a,e){let t=mi(a),i=Br(t,e);Hi(i,!!Rn.analytics),jt(t,i),t!==a&&jt(a,i)}function yt(){fi&&(fi(et,tt),fi=null)}function it(a){Dn=a,R("volume",a)}function nt(a){a&&(Hr=!0),!bt&&(bt=!0,R("pause"),it(0))}function vt(a){!a&&Hr||bt&&(bt=!1,R("resume"),it(Dn))}function Me(a,e){et=Math.floor(a||window.innerWidth),tt=Math.floor(e||window.innerHeight),In=et>tt,R("resize",{width:et,height:tt})}function Ps(){if(Ca())try{let a=mraid.getMaxSize();Me(a.width,a.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?vt():nt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Me(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();it(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&it(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),bi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ve=!0,R("boot"),R("view"),R("ready"),ye=!0,yt();else{let t=()=>{ve=!0,R("boot"),R("view"),R("ready"),ye=!0,yt()};mraid.addEventListener("ready",t)}}catch(a){console.warn("MRAID hook skipped",a)}}function Ms(){if(La())try{let a=dapi.getScreenSize();Me(a.width,a.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?vt():nt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Me(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(it(e?1:0),dapi.addEventListener("audioVolumeChange",t=>it(t?1:0)),bi=!0,dapi.isViewable())ve=!0,R("boot"),R("view"),R("ready"),ye=!0,yt();else{let t=()=>{ve=!0,R("boot"),R("view"),R("ready"),ye=!0,yt()};dapi.addEventListener("ready",t)}}catch(a){console.warn("DAPI hook skipped",a)}}function Rr(){let a=()=>{ve||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ve=!0,R("boot"),R("view"),R("ready"),ye=!0,yt(),mt&&(mt=!1,de.start()))};window.addEventListener("resize",()=>Me()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(vt(),a()):nt()}),document.readyState==="complete"||document.readyState==="interactive"?a():window.addEventListener("load",a),bi=!0}function _s(){let a=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Pr=!0),!(Pr&&e instanceof MouseEvent)&&(hi+=1,jn||(jn=!0,R("first_interaction",{count:hi})),R("interaction",hi))};document.addEventListener("mousedown",a),document.addEventListener("touchstart",a)}function Ir(a){var i,n,r,s,o,l,c,p,d,u,g,f;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(a||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ue())(r=(n=window.TJ_API)==null?void 0:n.click)==null||r.call(n);else if(Ta())(o=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||o.call(s);else if(_a())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ma())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(ka()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(a||Ze||""):a&&window.open(a)}else Fe()?(u=window.install)==null||u.call(window):Pa()?(g=window.openAppStore)==null||g.call(window):$i()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):a&&window.open(a)}function Rs(){let a=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(a==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;ee("view",()=>e(t.mraid_viewable)),ee("start",()=>e(t.game_viewable)),ee("engagement",()=>e(t.engagement));let i=()=>e(t.complete);ee("complete",i),Ot("engagement",n=>{var r;((r=n==null?void 0:n.payload)==null?void 0:r.count)>3&&i()}),ee("cta_click",()=>e(t.click))}else if(a==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;ee("view",()=>e(t.Ad_Load_Start)),ee("start",()=>e(t.Ad_Viewable)),ee("engagement",()=>e(t.First_Engagement)),ee("complete",()=>e(t.Gameplay_Complete)),ee("cta_click",()=>e(t.DSP_Click)),ee("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Is(){if(!Ue())return;let a=window.TJ_API;a&&a.setPlayableAPI&&a.setPlayableAPI({skipAd:()=>{try{de.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Or(){var e,t,i;let a=window.TJ_API;(e=a==null?void 0:a.objectiveComplete)==null||e.call(a),(t=a==null?void 0:a.playableFinished)==null||t.call(a),(i=a==null?void 0:a.gameplayFinished)==null||i.call(a)}function Os(){Fe()&&(window.mintGameStart=()=>{vt(!0),Me()},window.mintGameClose=()=>{nt(!0)})}function js(){if(!Bi())return;let a=window.NUC;!a||!a.trigger||(de.on("cta_click",()=>{var e,t;return(t=(e=a.trigger).convert)==null?void 0:t.call(e,Ze)}),de.on("complete",()=>{var e,t;return(t=(e=a.trigger).tryAgain)==null?void 0:t.call(e)}))}var de={init(a={},e){var t;if(zr=a.profile||"web_embed",Rn=a.consent||{},Je={...jr,...a.ids||{}},Qe=a.rootEl||Qe,ft=void 0,ra((t=a.telemetry)!=null&&t.endpoint?a.telemetry:null),je=null,On=!1,jn=!1,gi.clear(),Ze=a.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(fi=e),R("init"),document.body.oncontextmenu=()=>!1,_r(),zs(Qe),Ra(),Ps(),Ms(),!bi){if(document.readyState==="complete")Rr();else if(!Mr){Mr=!0;let i=()=>{Rr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}_s(),Rs(),Is(),Os(),js(),console.log(`%c @handler/playable-sdk %c v${kn} `,"background: #007acc; color: #fff; font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: #e1e4e8; color: #333; font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),ve&&!ye&&(R("boot"),R("view"),R("ready"),mt&&(mt=!1,de.start()),ye=!0),ye=ve},getRoot(){return _r()},get version(){return kn},get maxWidth(){return et},get maxHeight(){return tt},get isLandscape(){return In},get isReady(){return ye},get isStarted(){return Pn},get isPaused(){return bt},get isFinished(){return ht},get volume(){return Dn},get interactions(){return hi},on(a,e){Ot(mi(a),e)},off(a,e){zi(mi(a),e)},start(){var a,e;if(!Pn){if(!ve){mt=!0;return}if(Pn=!0,je||(je=Date.now()),R("start"),Me(),Fe())nt(),(a=window.gameReady)==null||a.call(window);else if(Ue()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:In?"landscape":"portrait",buildID:kn})}}},finish(){var a,e;ht||(ht=!0,R("complete"),_n("complete"),Fe()?(a=window.gameEnd)==null||a.call(window):$i()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ue()&&Or())},install(a){if(!ht){ht=!0,Ue()?(Or(),setTimeout(()=>de.install(a),300)):(R("complete"),setTimeout(()=>de.install(a),0));return}Mn||(Mn=!0,setTimeout(()=>Mn=!1,500),R("cta_click"),R("conversion"),_n("cta"),Ir(a||Ze))},emit(a,e){let t=mi(a);if(!ks.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${a} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Br(t,e);Hi(i,!!Rn.analytics),jt(t,i)},gameStart(){de.start()},gameEnd(){de.finish()},ctaClick(a,e){R("cta_click",{url:a||Ze,manual:!0}),(e==null?void 0:e.open)!==!1&&Ir(a||Ze)},ctaShow(a){R("cta_show",a)},ctaDismiss(a){R("cta_dismiss",a)},getGameTimeMs(){return $r()},endSession(a="manual"){_n(a)},setAttribution(a){ft=a},abTest(a,e){if(!a)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(Ds(`${Dr}:${a}`))%e.length,i=e[t];return ft={...ft||{},experiment_id:a},Je.variant_id=i,R("ab_assign",{experiment_id:a,variant_id:i}),i},levelStart(a,e){je||(je=Date.now()),R("level_start",{level_id:a,...e})},levelComplete(a,e){R("level_complete",{level_id:a,...e})},levelFail(a,e){R("level_fail",{level_id:a,...e})},checkpoint(a,e){R("checkpoint",{checkpoint_id:a,...e})},reward(a,e){R("reward",{reward_id:a,...e})},tutorialStart(a,e){R("tutorial_start",{step_id:a,...e})},tutorialComplete(a,e){R("tutorial_complete",{step_id:a,...e})},tutorialSkip(a,e){R("tutorial_skip",{step_id:a,...e})},timerStart(a){a&&gi.set(a,Date.now())},timerEnd(a,e="custom",t){if(!a)return;let i=gi.get(a);if(!i)return;gi.delete(a);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){R("engagement",{action:"timer",key:a,duration_ms:n,...t});return}R(e,{key:a,duration_ms:n,...t})}},fps(a,e){R("fps",{value:a,...e})},memory(a,e){R("memory",{bytes:a,...e})},assetLoadStart(a,e){R("asset_load_start",{asset_id:a,...e})},assetLoadComplete(a,e){R("asset_load_complete",{asset_id:a,...e})},reportError(a,e,t){R("error",{code:a,message:e,...t})},retry(){var a,e,t;if(Fe())(a=window.gameRetry)==null||a.call(window);else if(Bi()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}R("engagement",{action:"retry"})},pause(){nt(!0)},resume(){vt(!0)},resize(a,e){Me(a,e)}},me=de;function Ds(a){let e=2166136261;for(let t=0;t<a.length;t++)e^=a.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function zs(a){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
1620
+ `,document.head.appendChild(e)}setProgress(e){this.currentProgress=Math.max(0,Math.min(100,e)),this.progressBar.style.width=`${this.currentProgress}%`,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`}mount(e=document.body){e.appendChild(this.container)}unmount(){this.container.parentElement&&this.container.parentElement.removeChild(this.container)}getElement(){return this.container}};var kn=ga.version,ks=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"]);ua();var jr={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"},Dr=Math.random().toString(36).slice(2),Qe=null,Je={...jr},zr="web_embed",Rn={},mt,Pn=!1,ft=!1,yt=!1,Hr=!1,Dn=1,mi=0,vi=!1,ye=!1,Ze="",et=Math.floor(window.innerWidth),tt=Math.floor(window.innerHeight),In=et>tt,ve=!1,bt=!1,Pr=!1,Mr=!1,Mn=!1,bi=null,je=null,On=!1,jn=!1,fi=new Map;function $r(){if(!je)return null;let a=Date.now()-je;return!Number.isFinite(a)||a<0?null:a}function _n(a){if(On)return;let e=$r();e!==null&&(On=!0,R("session_time",{duration_ms:e,reason:a}))}function _r(){if(Qe)return Qe;let a=document.createElement("div");return a.id="handler-root",a.setAttribute("data-handler-root","true"),document.body.appendChild(a),Qe=a,a}function yi(a){switch(a){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return a}}function Br(a,e){return{event_name:a,ts:Date.now(),session_id:Dr,deployment_id:Je.deployment_id,variant_id:Je.variant_id,export_profile_id:Je.profile_id,instance_id:Je.instance_id||"default",env:zr==="mraid"?"mraid":"web",attribution:mt,payload:e}}function R(a,e){let t=yi(a),i=Br(t,e);Hi(i,!!Rn.analytics),zt(t,i),t!==a&&zt(a,i)}function vt(){bi&&(bi(et,tt),bi=null)}function it(a){Dn=a,R("volume",a)}function nt(a){a&&(Hr=!0),!yt&&(yt=!0,R("pause"),it(0))}function xt(a){!a&&Hr||yt&&(yt=!1,R("resume"),it(Dn))}function Me(a,e){et=Math.floor(a||window.innerWidth),tt=Math.floor(e||window.innerHeight),In=et>tt,R("resize",{width:et,height:tt})}function Ps(){if(Ca())try{let a=mraid.getMaxSize();Me(a.width,a.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?xt():nt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Me(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();it(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&it(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),vi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt();else{let t=()=>{ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt()};mraid.addEventListener("ready",t)}}catch(a){console.warn("MRAID hook skipped",a)}}function Ms(){if(Ta())try{let a=dapi.getScreenSize();Me(a.width,a.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?xt():nt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Me(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(it(e?1:0),dapi.addEventListener("audioVolumeChange",t=>it(t?1:0)),vi=!0,dapi.isViewable())ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt();else{let t=()=>{ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt()};dapi.addEventListener("ready",t)}}catch(a){console.warn("DAPI hook skipped",a)}}function Rr(){let a=()=>{ve||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ve=!0,R("boot"),R("view"),R("ready"),ye=!0,vt(),bt&&(bt=!1,de.start()))};window.addEventListener("resize",()=>Me()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(xt(),a()):nt()}),document.readyState==="complete"||document.readyState==="interactive"?a():window.addEventListener("load",a),vi=!0}function _s(){let a=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Pr=!0),!(Pr&&e instanceof MouseEvent)&&(mi+=1,jn||(jn=!0,R("first_interaction",{count:mi})),R("interaction",mi))};document.addEventListener("mousedown",a),document.addEventListener("touchstart",a)}function Ir(a){var i,n,r,s,o,l,c,d,p,u,g,f;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(a||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ue())(r=(n=window.TJ_API)==null?void 0:n.click)==null||r.call(n);else if(La())(o=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||o.call(s);else if(_a())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ma())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(h){console.warn("Smadex redirect failed",h)}else if(ka()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(a||Ze||""):a&&window.open(a)}else Fe()?(u=window.install)==null||u.call(window):Pa()?(g=window.openAppStore)==null||g.call(window):$i()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):a&&window.open(a)}function Rs(){let a=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(a==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;ee("view",()=>e(t.mraid_viewable)),ee("start",()=>e(t.game_viewable)),ee("engagement",()=>e(t.engagement));let i=()=>e(t.complete);ee("complete",i),Dt("engagement",n=>{var r;((r=n==null?void 0:n.payload)==null?void 0:r.count)>3&&i()}),ee("cta_click",()=>e(t.click))}else if(a==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;ee("view",()=>e(t.Ad_Load_Start)),ee("start",()=>e(t.Ad_Viewable)),ee("engagement",()=>e(t.First_Engagement)),ee("complete",()=>e(t.Gameplay_Complete)),ee("cta_click",()=>e(t.DSP_Click)),ee("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Is(){if(!Ue())return;let a=window.TJ_API;a&&a.setPlayableAPI&&a.setPlayableAPI({skipAd:()=>{try{de.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Or(){var e,t,i;let a=window.TJ_API;(e=a==null?void 0:a.objectiveComplete)==null||e.call(a),(t=a==null?void 0:a.playableFinished)==null||t.call(a),(i=a==null?void 0:a.gameplayFinished)==null||i.call(a)}function Os(){Fe()&&(window.mintGameStart=()=>{xt(!0),Me()},window.mintGameClose=()=>{nt(!0)})}function js(){if(!Bi())return;let a=window.NUC;!a||!a.trigger||(de.on("cta_click",()=>{var e,t;return(t=(e=a.trigger).convert)==null?void 0:t.call(e,Ze)}),de.on("complete",()=>{var e,t;return(t=(e=a.trigger).tryAgain)==null?void 0:t.call(e)}))}var de={init(a={},e){var t;if(zr=a.profile||"web_embed",Rn=a.consent||{},Je={...jr,...a.ids||{}},Qe=a.rootEl||Qe,mt=void 0,ra((t=a.telemetry)!=null&&t.endpoint?a.telemetry:null),je=null,On=!1,jn=!1,fi.clear(),Ze=a.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(bi=e),R("init"),document.body.oncontextmenu=()=>!1,_r(),zs(Qe),Ra(),Ps(),Ms(),!vi){if(document.readyState==="complete")Rr();else if(!Mr){Mr=!0;let i=()=>{Rr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}_s(),Rs(),Is(),Os(),js(),console.log(`%c @handler/playable-sdk %c v${kn} `,"background: #007acc; color: #fff; font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: #e1e4e8; color: #333; font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),ve&&!ye&&(R("boot"),R("view"),R("ready"),bt&&(bt=!1,de.start()),ye=!0),ye=ve},getRoot(){return _r()},get version(){return kn},get maxWidth(){return et},get maxHeight(){return tt},get isLandscape(){return In},get isReady(){return ye},get isStarted(){return Pn},get isPaused(){return yt},get isFinished(){return ft},get volume(){return Dn},get interactions(){return mi},on(a,e){Dt(yi(a),e)},off(a,e){zi(yi(a),e)},start(){var a,e;if(!Pn){if(!ve){bt=!0;return}if(Pn=!0,je||(je=Date.now()),R("start"),Me(),Fe())nt(),(a=window.gameReady)==null||a.call(window);else if(Ue()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:In?"landscape":"portrait",buildID:kn})}}},finish(){var a,e;ft||(ft=!0,R("complete"),_n("complete"),Fe()?(a=window.gameEnd)==null||a.call(window):$i()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ue()&&Or())},install(a){if(!ft){ft=!0,Ue()?(Or(),setTimeout(()=>de.install(a),300)):(R("complete"),setTimeout(()=>de.install(a),0));return}Mn||(Mn=!0,setTimeout(()=>Mn=!1,500),R("cta_click"),R("conversion"),_n("cta"),Ir(a||Ze))},emit(a,e){let t=yi(a);if(!ks.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${a} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Br(t,e);Hi(i,!!Rn.analytics),zt(t,i)},gameStart(){de.start()},gameEnd(){de.finish()},ctaClick(a,e){R("cta_click",{url:a||Ze,manual:!0}),(e==null?void 0:e.open)!==!1&&Ir(a||Ze)},ctaShow(a){R("cta_show",a)},ctaDismiss(a){R("cta_dismiss",a)},getGameTimeMs(){return $r()},endSession(a="manual"){_n(a)},setAttribution(a){mt=a},abTest(a,e){if(!a)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(Ds(`${Dr}:${a}`))%e.length,i=e[t];return mt={...mt||{},experiment_id:a},Je.variant_id=i,R("ab_assign",{experiment_id:a,variant_id:i}),i},levelStart(a,e){je||(je=Date.now()),R("level_start",{level_id:a,...e})},levelComplete(a,e){R("level_complete",{level_id:a,...e})},levelFail(a,e){R("level_fail",{level_id:a,...e})},checkpoint(a,e){R("checkpoint",{checkpoint_id:a,...e})},reward(a,e){R("reward",{reward_id:a,...e})},tutorialStart(a,e){R("tutorial_start",{step_id:a,...e})},tutorialComplete(a,e){R("tutorial_complete",{step_id:a,...e})},tutorialSkip(a,e){R("tutorial_skip",{step_id:a,...e})},timerStart(a){a&&fi.set(a,Date.now())},timerEnd(a,e="custom",t){if(!a)return;let i=fi.get(a);if(!i)return;fi.delete(a);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){R("engagement",{action:"timer",key:a,duration_ms:n,...t});return}R(e,{key:a,duration_ms:n,...t})}},fps(a,e){R("fps",{value:a,...e})},memory(a,e){R("memory",{bytes:a,...e})},assetLoadStart(a,e){R("asset_load_start",{asset_id:a,...e})},assetLoadComplete(a,e){R("asset_load_complete",{asset_id:a,...e})},reportError(a,e,t){R("error",{code:a,message:e,...t})},retry(){var a,e,t;if(Fe())(a=window.gameRetry)==null||a.call(window);else if(Bi()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}R("engagement",{action:"retry"})},pause(){nt(!0)},resume(){xt(!0)},resize(a,e){Me(a,e)}},me=de;function Ds(a){let e=2166136261;for(let t=0;t<a.length;t++)e^=a.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function zs(a){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
1647
1621
  (function(){
1648
1622
  var events = ['touchstart','touchend','mousedown','keydown'];
1649
1623
  function unlock(){
@@ -1659,14 +1633,14 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1659
1633
  }
1660
1634
  events.forEach(function(e){ document.addEventListener(e, unlock, false); });
1661
1635
  })();
1662
- `,a.appendChild(e)}async function zn(a,e={}){let t=new Hs;await t.init({resizeTo:a,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var d,u,g,f;if(!t.renderer)return;let o=(d=s==null?void 0:s.width)!=null?d:a.clientWidth,l=(u=s==null?void 0:s.height)!=null?u:a.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,p=l&&l>0?l:(f=window.innerHeight)!=null?f:480;t.renderer.resize(c,p)};a.appendChild(t.canvas),a.style.position="relative",a.style.display="flex",a.style.flexDirection="column",a.style.alignItems="stretch",a.style.width="100%",a.style.height="100dvh",a.style.minHeight="100vh",a.style.maxWidth="100%",a.style.maxHeight="100%",a.style.boxSizing="border-box",a.style.overflow="hidden",e.background&&(a.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(";")),a.appendChild(n),me.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),me.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),me.on("resize",({payload:s})=>{i({width:s==null?void 0:s.width,height:s==null?void 0:s.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(s=>{let o=s[0];if(o&&o.contentRect.width>0&&o.contentRect.height>0){let l=Math.round(o.contentRect.width),c=Math.round(o.contentRect.height);if(i({width:l,height:c}),typeof window!="undefined"&&window.gameApp&&window.gameObjectManager){let p={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:p}))}}}).observe(a),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Hn,Ticker as at,ColorMatrixFilter as $s}from"pixi.js";var yi=class{constructor(e){var n,r;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=(r=e==null?void 0:e.rotation)!=null?r: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)}},vi=class{constructor(e){var t,i,n,r;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=(r=e==null?void 0:e.tint)!=null?r: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}=Yr("handler-playable-sdk/pixi");if(n&&n[t]){let r=n[t];r&&(e.texture=r)}}catch{}}},xi=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 yi(n.transform),this.renderer=new vi(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,p,d,u,g,f,h,m,b,y;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(p=e==null?void 0:e.motion)==null?void 0:p.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(u=(d=this._config)==null?void 0:d.render)==null?void 0:u.asset)==null?void 0:g.type,r=(h=(f=e==null?void 0:e.render)==null?void 0:f.asset)==null?void 0:h.type,s=(b=(m=this._config)==null?void 0:m.ui)==null?void 0:b.renderMode,o=(y=e==null?void 0:e.ui)==null?void 0:y.renderMode;if((n!==r||s!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} to ${r}/${o}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,r,s,o;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(r=(n=this._config)==null?void 0:n.render)==null?void 0:r.anchor,t=(o=(s=this._config)==null?void 0:s.transform)==null?void 0:o.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var r,s,o;if(!((r=this.pixiObject)!=null&&r.scale))return;let e=(s=this._config)==null?void 0:s.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(o=this.transform.scale)!=null?o:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,r,s,o,l,c,p,d;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 Hn;u.blur=(r=e.blur.strength)!=null?r:4,t.push(u)}if((s=e.shadow)!=null&&s.enabled){let u=e.shadow,g=new Hn;g.blur=(o=u.blur)!=null?o:4,g.blendMode="multiply",t.push(g),(u.offsetX!==0||u.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let u=e.glow,g=new Hn;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let f=new $s,h=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;f.tint(h),t.push(f)}}(p=e.stroke)!=null&&p.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(d=e.distortion)!=null&&d.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 p,d,u,g,f,h,m;let e=(p=this._config)==null?void 0:p.motion;if(!e||!((d=e.intro)!=null&&d.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,r=this.transform.position.y,s=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((h=(f=this._config)==null?void 0:f.effects)==null?void 0:h.scale_y)||1);if(this.pixiObject.alpha=(m=t.startAlpha)!=null?m:0,t.startScale!==void 0&&this.pixiObject.scale.set(s*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=r+(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,o);return}let l=0,c=b=>{var O,j,T,E,S,A;if(l+=b.deltaTime/60,l<n)return;let y=i>0?Math.min(1,(l-n)/i):1,v=1-Math.pow(1-y,3),x=this.renderer.alpha,w=this.transform.scale*(((j=(O=this._config)==null?void 0:O.effects)==null?void 0:j.scale_x)||1),C=this.transform.scale*(((E=(T=this._config)==null?void 0:T.effects)==null?void 0:E.scale_y)||1),k=this.transform.position.y,P=this.transform.position.x;if(this.pixiObject.alpha=((S=t.startAlpha)!=null?S:0)+(x-((A=t.startAlpha)!=null?A:0))*v,t.startScale!==void 0){let M=t.startScale+(1-t.startScale)*v;this.pixiObject.scale.set(w*M,C*M)}t.startYOffset!==void 0&&(this.pixiObject.y=k+t.startYOffset+(k-(k+t.startYOffset))*v),y>=1&&(at.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=x,this.pixiObject.x=P,this.pixiObject.y=k,this.pixiObject.scale.set(w,C))};this._introTicker=c,at.shared.add(c)}applyMotion(){var n,r,s;let e=(n=this._config)==null?void 0:n.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(!(this._lastMotionStr===i&&this._tickerCleanup)){if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),(r=e.pulse)!=null&&r.enabled||(s=e.swing)!=null&&s.enabled){let o=0,l=c=>{var h,m,b,y,v,x,w,C,k,P,O;o+=c.deltaTime*.05;let p=this.transform.scale,d=p*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_x)||1),u=p*(((y=(b=this._config)==null?void 0:b.effects)==null?void 0:y.scale_y)||1),g=this.transform.position.x,f=this.transform.position.y;if((v=e.pulse)!=null&&v.enabled){let j=(x=e.pulse.intensity)!=null?x:.1,T=(w=e.pulse.speed)!=null?w:1,S=1+Math.sin(o*T)*j;(C=this.pixiObject.scale)!=null&&C.set?this.pixiObject.scale.set(d*S,u*S):this.pixiObject.scale&&(this.pixiObject.scale.x=d*S,this.pixiObject.scale.y=u*S)}if((k=e.swing)!=null&&k.enabled){let j=(P=e.swing.amplitude)!=null?P:10,T=(O=e.swing.speed)!=null?O:1,E=Math.sin(o*T)*j;e.swing.axis==="vertical"?this.pixiObject.y=f+E:e.swing.axis==="both"?(this.pixiObject.x=g+E,this.pixiObject.y=f+E):this.pixiObject.x=g+E}};at.shared.add(l),this._tickerCleanup=()=>{var c,p,d,u,g;if(at.shared.remove(l),this.pixiObject){let f=this.transform.scale*(((p=(c=this._config)==null?void 0:c.effects)==null?void 0:p.scale_x)||1),h=this.transform.scale*(((u=(d=this._config)==null?void 0:d.effects)==null?void 0:u.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,(g=this.pixiObject.scale)!=null&&g.set?this.pixiObject.scale.set(f,h):this.pixiObject.scale&&(this.pixiObject.scale.x=f,this.pixiObject.scale.y=h)}}}}}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)}},xt=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 xi(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(r,s)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,s);o&&this.objects.get(e)===o&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),r.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 wi={"brand.primary":{family:"Arial, sans-serif",weight:"400"},"brand.warning":{family:"Arial Black, Arial, sans-serif",weight:"900"},"brand.heading":{family:"Arial Black, Arial, sans-serif",weight:"800"},"brand.body":{family:"Arial, sans-serif",weight:"400"}};function Bs(a){let e=wi[a];return e?e.family:(console.warn(`Font ID "${a}" not found in registry, using fallback`),"Arial, sans-serif")}function Ns(a){var t;let e=wi[a];return e&&(t=e.weight)!=null?t:"400"}function Fs(a,e){wi[a]=e}function Us(){return Object.keys(wi)}var rt=null;function Gs(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!rt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),rt||(typeof window!="undefined"&&window.lottie?(rt=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(a=>a.toLowerCase().includes("lottie")):"no window"),rt=null)),rt}function qs(a){return!a||a.startsWith("http://")||a.startsWith("https://")||a.startsWith("/")?a:`/${a.replace(/^\.\//,"")}`}function Vs(a){try{let e=new XMLHttpRequest;return e.open("GET",qs(a),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Nr(a){return!a||typeof a!="object"||!Array.isArray(a.layers)?null:(Array.isArray(a.assets)||(a.assets=[]),Array.isArray(a.chars)||(a.chars=[]),a)}function Cn(a){rt=a}function Ys(a,e,t,i){var C,k,P,O,j,T,E,S,A,M,I,D,L,_,$,Q,B,V,Y;let n=t.objects.get(a);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${a}`),null;let r=((C=n.effects)==null?void 0:C.lottie)||{},s=n.transform||{},o=n.render||{};if(r.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[a],c=Nr(l);if(!c){let X=(P=(k=n.render)==null?void 0:k.asset)==null?void 0:P.path;if(typeof X=="string"&&X.toLowerCase().endsWith(".json")){let we=Vs(X);if(c=Nr(we),c)try{i[a]=c}catch{}}}if(!c){let X=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${a}`,{kind:X}),null}let p=Gs();if(!p)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${a}`),null;let d=(O=r.width)!=null?O:300,u=(j=r.height)!=null?j:300,g=(T=s.scale)!=null?T:1,f=((S=(E=s.position)==null?void 0:E.x)!=null?S:0)+((M=(A=s.offset)==null?void 0:A.x)!=null?M:0),h=((D=(I=s.position)==null?void 0:I.y)!=null?D:0)+((_=(L=s.offset)==null?void 0:L.y)!=null?_:0),m=($=s.rotation)!=null?$:0,b=(Q=o.z_index)!=null?Q:100,y=(B=o.alpha)!=null?B:1,v=document.createElement("div");v.style.cssText=`
1636
+ `,a.appendChild(e)}async function zn(a,e={}){let t=new Hs;await t.init({resizeTo:a,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var p,u,g,f;if(!t.renderer)return;let o=(p=s==null?void 0:s.width)!=null?p:a.clientWidth,l=(u=s==null?void 0:s.height)!=null?u:a.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(f=window.innerHeight)!=null?f:480;t.renderer.resize(c,d)};a.appendChild(t.canvas),a.style.position="relative",a.style.display="flex",a.style.flexDirection="column",a.style.alignItems="stretch",a.style.width="100%",a.style.height="100dvh",a.style.minHeight="100vh",a.style.maxWidth="100%",a.style.maxHeight="100%",a.style.boxSizing="border-box",a.style.overflow="hidden",e.background&&(a.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(";")),a.appendChild(n),me.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),me.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),me.on("resize",({payload:s})=>{i({width:s==null?void 0:s.width,height:s==null?void 0:s.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(s=>{let o=s[0];if(o&&o.contentRect.width>0&&o.contentRect.height>0){let l=Math.round(o.contentRect.width),c=Math.round(o.contentRect.height);if(i({width:l,height:c}),typeof window!="undefined"&&window.gameApp&&window.gameObjectManager){let d={width:l,height:c,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:"auto-resize",isLandscape:l>c};window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:d}))}}}).observe(a),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Hn,Ticker as at,ColorMatrixFilter as $s}from"pixi.js";var xi=class{constructor(e){var n,r;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=(r=e==null?void 0:e.rotation)!=null?r: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)}},wi=class{constructor(e){var t,i,n,r;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=(r=e==null?void 0:e.tint)!=null?r: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}=Yr("handler-playable-sdk/pixi");if(n&&n[t]){let r=n[t];r&&(e.texture=r)}}catch{}}},Ei=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 xi(n.transform),this.renderer=new wi(n.render),this.sync()}sync(){this.transform.syncToPixi(this.pixiObject),this.renderer.syncToPixi(this.pixiObject,this.instanceId),this.applyAnchor(),this.applyEffectsScale(),this.applyEffects(),this.syncTextProperties(),(!this._initialized||this._shouldReplayIntro)&&(this.applyIntro(),this._initialized=!0,this._shouldReplayIntro=!1),this.applyMotion()}syncTextProperties(){var t;if(!this.pixiObject||!("text"in this.pixiObject))return;let e=(t=this._config)==null?void 0:t.ui;e&&(e.text!==void 0&&this.pixiObject.text!==e.text&&(this.pixiObject.text=e.text),this.pixiObject.style&&(e.fontSize!==void 0&&(this.pixiObject.style.fontSize=e.fontSize),e.color!==void 0&&(this.pixiObject.style.fill=e.color),e.align!==void 0&&(this.pixiObject.style.align=e.align)))}destroy(){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null),this._introTicker&&(at.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,d,p,u,g,f,h,m,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,r=(h=(f=e==null?void 0:e.render)==null?void 0:f.asset)==null?void 0:h.type,s=(b=(m=this._config)==null?void 0:m.ui)==null?void 0:b.renderMode,o=(y=e==null?void 0:e.ui)==null?void 0:y.renderMode;if((n!==r||s!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} to ${r}/${o}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,r,s,o;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(r=(n=this._config)==null?void 0:n.render)==null?void 0:r.anchor,t=(o=(s=this._config)==null?void 0:s.transform)==null?void 0:o.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var r,s,o;if(!((r=this.pixiObject)!=null&&r.scale))return;let e=(s=this._config)==null?void 0:s.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(o=this.transform.scale)!=null?o:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,r,s,o,l,c,d,p;if(!this.pixiObject)return;let e=(i=this._config)==null?void 0:i.effects;if(!e||e.enabled===!1){this.pixiObject.filters=null;return}let t=[];if((n=e.blur)!=null&&n.enabled){let u=new Hn;u.blur=(r=e.blur.strength)!=null?r:4,t.push(u)}if((s=e.shadow)!=null&&s.enabled){let u=e.shadow,g=new Hn;g.blur=(o=u.blur)!=null?o:4,g.blendMode="multiply",t.push(g),(u.offsetX!==0||u.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let u=e.glow,g=new Hn;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let f=new $s,h=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;f.tint(h),t.push(f)}}(d=e.stroke)!=null&&d.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(p=e.distortion)!=null&&p.enabled&&console.warn("[Effects] Distortion effect requires pixi-filters or a displacement map. Install: npm install pixi-filters"),this.pixiObject.filters=t.length>0?t:null}applyIntro(){var d,p,u,g,f,h,m;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,r=this.transform.position.y,s=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((h=(f=this._config)==null?void 0:f.effects)==null?void 0:h.scale_y)||1);if(this.pixiObject.alpha=(m=t.startAlpha)!=null?m:0,t.startScale!==void 0&&this.pixiObject.scale.set(s*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=r+(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,o);return}let l=0,c=b=>{var O,j,L,E,S,A;if(l+=b.deltaTime/60,l<n)return;let y=i>0?Math.min(1,(l-n)/i):1,v=1-Math.pow(1-y,3),x=this.renderer.alpha,w=this.transform.scale*(((j=(O=this._config)==null?void 0:O.effects)==null?void 0:j.scale_x)||1),C=this.transform.scale*(((E=(L=this._config)==null?void 0:L.effects)==null?void 0:E.scale_y)||1),k=this.transform.position.y,P=this.transform.position.x;if(this.pixiObject.alpha=((S=t.startAlpha)!=null?S:0)+(x-((A=t.startAlpha)!=null?A:0))*v,t.startScale!==void 0){let M=t.startScale+(1-t.startScale)*v;this.pixiObject.scale.set(w*M,C*M)}t.startYOffset!==void 0&&(this.pixiObject.y=k+t.startYOffset+(k-(k+t.startYOffset))*v),y>=1&&(at.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=x,this.pixiObject.x=P,this.pixiObject.y=k,this.pixiObject.scale.set(w,C))};this._introTicker=c,at.shared.add(c)}applyMotion(){var n,r,s;let e=(n=this._config)==null?void 0:n.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(!(this._lastMotionStr===i&&this._tickerCleanup)){if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),(r=e.pulse)!=null&&r.enabled||(s=e.swing)!=null&&s.enabled){let o=0,l=c=>{var h,m,b,y,v,x,w,C,k,P,O;o+=c.deltaTime*.05;let d=this.transform.scale,p=d*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_x)||1),u=d*(((y=(b=this._config)==null?void 0:b.effects)==null?void 0:y.scale_y)||1),g=this.transform.position.x,f=this.transform.position.y;if((v=e.pulse)!=null&&v.enabled){let j=(x=e.pulse.intensity)!=null?x:.1,L=(w=e.pulse.speed)!=null?w:1,S=1+Math.sin(o*L)*j;(C=this.pixiObject.scale)!=null&&C.set?this.pixiObject.scale.set(p*S,u*S):this.pixiObject.scale&&(this.pixiObject.scale.x=p*S,this.pixiObject.scale.y=u*S)}if((k=e.swing)!=null&&k.enabled){let j=(P=e.swing.amplitude)!=null?P:10,L=(O=e.swing.speed)!=null?O:1,E=Math.sin(o*L)*j;e.swing.axis==="vertical"?this.pixiObject.y=f+E:e.swing.axis==="both"?(this.pixiObject.x=g+E,this.pixiObject.y=f+E):this.pixiObject.x=g+E}};at.shared.add(l),this._tickerCleanup=()=>{var c,d,p,u,g;if(at.shared.remove(l),this.pixiObject){let f=this.transform.scale*(((d=(c=this._config)==null?void 0:c.effects)==null?void 0:d.scale_x)||1),h=this.transform.scale*(((u=(p=this._config)==null?void 0:p.effects)==null?void 0:u.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,(g=this.pixiObject.scale)!=null&&g.set?this.pixiObject.scale.set(f,h):this.pixiObject.scale&&(this.pixiObject.scale.x=f,this.pixiObject.scale.y=h)}}}}}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)}},wt=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 Ei(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(r,s)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,s);o&&this.objects.get(e)===o&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),r.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 Ai={"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 Bs(a){let e=Ai[a];return e?e.family:(console.warn(`Font ID "${a}" not found in registry, using fallback`),"Arial, sans-serif")}function Ns(a){var t;let e=Ai[a];return e&&(t=e.weight)!=null?t:"400"}function Fs(a,e){Ai[a]=e}function Us(){return Object.keys(Ai)}var rt=null;function Gs(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!rt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),rt||(typeof window!="undefined"&&window.lottie?(rt=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(a=>a.toLowerCase().includes("lottie")):"no window"),rt=null)),rt}function qs(a){return!a||a.startsWith("http://")||a.startsWith("https://")||a.startsWith("/")?a:`/${a.replace(/^\.\//,"")}`}function Vs(a){try{let e=new XMLHttpRequest;return e.open("GET",qs(a),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Nr(a){return!a||typeof a!="object"||!Array.isArray(a.layers)?null:(Array.isArray(a.assets)||(a.assets=[]),Array.isArray(a.chars)||(a.chars=[]),a)}function Cn(a){rt=a}function Ys(a,e,t,i){var C,k,P,O,j,L,E,S,A,M,I,D,T,_,$,Q,B,V,Y;let n=t.objects.get(a);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${a}`),null;let r=((C=n.effects)==null?void 0:C.lottie)||{},s=n.transform||{},o=n.render||{};if(r.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[a],c=Nr(l);if(!c){let X=(P=(k=n.render)==null?void 0:k.asset)==null?void 0:P.path;if(typeof X=="string"&&X.toLowerCase().endsWith(".json")){let we=Vs(X);if(c=Nr(we),c)try{i[a]=c}catch{}}}if(!c){let X=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${a}`,{kind:X}),null}let d=Gs();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${a}`),null;let p=(O=r.width)!=null?O:300,u=(j=r.height)!=null?j:300,g=(L=s.scale)!=null?L:1,f=((S=(E=s.position)==null?void 0:E.x)!=null?S:0)+((M=(A=s.offset)==null?void 0:A.x)!=null?M:0),h=((D=(I=s.position)==null?void 0:I.y)!=null?D:0)+((_=(T=s.offset)==null?void 0:T.y)!=null?_:0),m=($=s.rotation)!=null?$:0,b=(Q=o.z_index)!=null?Q:100,y=(B=o.alpha)!=null?B:1,v=document.createElement("div");v.style.cssText=`
1663
1637
  position: absolute;
1664
1638
  top: calc(50% + ${h}px);
1665
1639
  left: calc(50% + ${f}px);
1666
1640
  transform: translate(-50%, -50%) scale(${g}) rotate(${m}deg);
1667
- width: ${d}px;
1641
+ width: ${p}px;
1668
1642
  height: ${u}px;
1669
1643
  pointer-events: none;
1670
1644
  z-index: ${b};
1671
1645
  opacity: ${y};
1672
- `,e.appendChild(v);let x;try{x=p.loadAnimation({container:v,renderer:r.renderer||"svg",loop:(V=r.loop)!=null?V:!1,autoplay:(Y=r.autoplay)!=null?Y:!0,animationData:c})}catch(X){return v.parentNode&&v.parentNode.removeChild(v),console.warn(`[LottieOverlay] Failed to start animation: ${a}`,X),null}r.speed!==void 0&&x.setSpeed(r.speed);let w=()=>{x.destroy(),v.parentNode&&v.parentNode.removeChild(v)};return r.loop||x.addEventListener("complete",w),{animation:x,cleanup:w}}var $n=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 zn(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 xt(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 wt=class{setContext(e){this.context=e}};var Et=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 Fr from"pixi.js";var Ws=Fr;typeof window!="undefined"&&(window.__basePixi=Fr);import{Sprite as Ks,Text as Xs,TextStyle as Js,Texture as Ur}from"pixi.js";var Gr=a=>a*Math.PI/180;function Zs(a,e){var s,o,l,c,p;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 Js({fontFamily:(o=t.font)!=null?o:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(p=t.letterSpacing)!=null?p:0}),r=new Xs({text:t.text,style:n});return r.label=a,r}function Qs(a){var p,d,u,g,f,h,m,b,y,v;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:r,denyList:s}=a,o={},l={},c={};t.sortableChildren=!0;for(let[x,w]of i.objects.entries()){if(s!=null&&s.has(x)||r&&!r.has(x)||(w==null?void 0:w.enabled)===!1)continue;let C=(d=(p=w==null?void 0:w.render)==null?void 0:p.asset)==null?void 0:d.path,k=(g=(u=w==null?void 0:w.render)==null?void 0:u.asset)==null?void 0:g.type,P=!!(C&&k==="image"),O=!!((f=w==null?void 0:w.ui)!=null&&f.text),j=O?(h=w==null?void 0:w.ui)==null?void 0:h.renderMode:void 0,T;if(j==="png"&&P?T="png":j==="text"&&O?T="text":P?T="png":O?T="text":T="skip",T!=="skip"){if(T==="text"){let E=Zs(x,w);if(!E)continue;let S=w.render;E.alpha=typeof(S==null?void 0:S.alpha)=="number"?S.alpha:1,E.visible=(S==null?void 0:S.visible)!==!1,E.zIndex=typeof(S==null?void 0:S.z_index)=="number"?S.z_index:0,S!=null&&S.anchor&&typeof S.anchor.x=="number"&&typeof S.anchor.y=="number"?E.anchor.set(S.anchor.x,S.anchor.y):E.anchor.set(.5,.5);let A=w.transform,M=(A==null?void 0:A.position)||(A==null?void 0:A.offset);M&&E.position.set((m=M.x)!=null?m:0,(b=M.y)!=null?b:0);let I=typeof(A==null?void 0:A.scale)=="number"?A.scale:1;E.scale.set(I,I);let D=typeof(A==null?void 0:A.rotation)=="number"?A.rotation:0;E.rotation=Gr(D),E.parent||t.addChild(E);try{n.create(x,E)}catch{}o[x]=E,c[x]=E}else if(T==="png"){let E=le[x]||(typeof Ur!="undefined"?Ur.EMPTY:void 0),S=new Ks(E);S.label=x;let A=w.render;S.alpha=typeof(A==null?void 0:A.alpha)=="number"?A.alpha:1,S.visible=(A==null?void 0:A.visible)!==!1,S.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"&&S.anchor.set(A.anchor.x,A.anchor.y);let M=w.transform,I=(M==null?void 0:M.position)||(M==null?void 0:M.offset);I&&S.position.set((y=I.x)!=null?y:0,(v=I.y)!=null?v:0);let D=typeof(M==null?void 0:M.scale)=="number"?M.scale:1;S.scale.set(D,D);let L=typeof(M==null?void 0:M.rotation)=="number"?M.rotation:0;S.rotation=Gr(L),S.parent||t.addChild(S);try{n.create(x,S)}catch{}o[x]=S,l[x]=S}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var Bn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Et}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 r=>{var o;let s=this.registry.get(r);if(!s){console.warn("[Assets] No config found for object:",r);return}try{let l=await ke.create(r,s,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));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 ke.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},qr=new Bn,eo=new Proxy(qr,{get(a,e){if(e in a&&typeof a[e]=="function")return a[e].bind(a);if(a.get(e))return a.get(e)}});function to(a,e){qr.init(a,e)}var Nn=class extends wt{async init(){_i(this.context.config,this.context.app),await le.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};import{Graphics as io,Point as no}from"pixi.js";var xe={width:400,height:600,designWidth:400,scaleFactor:1},Ai={scale:1,position:1},Si=[];function ao(a,e,t,i,n,r,s){Si.push({element:a,originalScale:r,positionHelper:e,heightPercent:n}),e(a,t,i,n,r,s,!1)}function ro(){Si.forEach(({element:a,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*xe.scaleFactor;t(a,xe.width,xe.height,i,n,!0,!1)})}function so(){Si.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function Fn(a,e){console.log(`[SCREEN] updateScreenState called: ${a}x${e}`),xe.width=a,xe.height=e,xe.scaleFactor=Math.min(a/xe.designWidth,1.15),Ai.scale=xe.scaleFactor,Ai.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Ai.scale.toFixed(3)}`),ro()}var U={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 oo(a,e,t){let i=U[a];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${a}.${e} = ${t}`))}function lo(){return U}var co={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 Ei(a,e){return typeof a=="number"&&Number.isFinite(a)?a:e}function st(a,e={x:.5,y:.5}){var t;if(Array.isArray(a))return{x:Ei(a[0],e.x),y:Ei(a[1],e.y)};if(a&&typeof a=="object"){let i=a;return{x:Ei(i.x,e.x),y:Ei(i.y,e.y)}}if(typeof a=="string"){let i=a.trim().toLowerCase();return(t=co[i])!=null?t:e}return e}function St(a,e,t,i={}){var g,f,h,m,b,y;let n=st(t),r=(g=i.inset)!=null?g:{},s=(f=i.padding)!=null?f:{x:0,y:0},o=((h=r.left)!=null?h:0)+s.x,l=((m=r.right)!=null?m:0)+s.x,c=((b=r.top)!=null?b:0)+s.y,p=((y=r.bottom)!=null?y:0)+s.y,d=Math.max(0,a-o-l),u=Math.max(0,e-c-p);return{x:o+d*n.x,y:c+u*n.y}}function Ct(a,e,t,i={}){var h,m,b,y,v,x;let n=(h=i.inset)!=null?h:{},r=(m=i.padding)!=null?m:{x:0,y:0},s=((b=n.left)!=null?b:0)+r.x,o=((y=n.right)!=null?y:0)+r.x,l=((v=n.top)!=null?v:0)+r.y,c=((x=n.bottom)!=null?x:0)+r.y,p=Math.max(0,a-s-o),d=Math.max(0,e-l-c),u=st(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:s+p*g,y:l+d*f}}function Un(a,e,t,i={}){var p,d,u;if(!a)return;let n=i.positionRatio?Ct(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):St(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),r=(p=i.offset)!=null?p:{x:0,y:0},s=n.x+r.x,o=n.y+r.y;a.anchor&&i.renderAnchor&&a.anchor.set(i.renderAnchor.x,i.renderAnchor.y),re(a,s,o);let l=(d=i.scale)!=null?d:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&pe(a,l*c)}if(typeof window!="undefined"){let a=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==a||n!==e)&&(a=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=oo,window.getDebugConfig=lo,window.copyConfig=wo,window.applyConfig=At,window.applyConfigForRatio=Eo,window.positionAtBottom=Vr,window.positionAtTop=go,window.positionAtCenter=ho,window.positionAtLeft=fo,window.positionAtRight=mo,window.positionAtBottomLeft=bo,window.positionAtBottomRight=yo,window.positionAtTopLeft=vo,window.positionAtTopRight=xo,window.applyPositionContract=uo,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 Ci(a,e,t=0){return a*e+t}function Li(a,e,t=0){return a*(1-e)+t}function Ti(a,e,t=0){return a*e+t}function ki(a,e,t=0){return a*(1-e)+t}function ie(a,e=0){return a/2+e}function po(a,e){return a*e}function uo(a,e,t,i){var s,o,l,c,p,d,u,g,f,h,m,b,y,v,x,w,C,k,P,O;let n=0,r=0;switch(i.type){case"top":n=ie(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),r=Ci(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ie(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),r=Li(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Ti(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),r=ie(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=ki(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),r=ie(t,(w=(x=i.offset)==null?void 0:x.y)!=null?w:0);break;case"center":n=ie(e,(k=(C=i.offset)==null?void 0:C.x)!=null?k:0),r=ie(t,(O=(P=i.offset)==null?void 0:P.y)!=null?O:0);break}a.position?a.position.set(n,r):(a.x=n,a.y=r),i.scale!==void 0&&i.scale!==1&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(i.scale,i.scale):(a.scale.x=i.scale,a.scale.y=i.scale))}function Vr(a,e,t,i=.2,n=1,r=!0,s=!1){let o=po(t,i),l=Li(t,i/2);re(a,ie(e),l);let c=r?n*xe.scaleFactor:n;pe(a,c),s&&!Si.find(p=>p.element===a)&&ao(a,Vr,e,t,i,n,r)}function go(a,e,t,i=.1,n=1){re(a,ie(e),Ci(t,i)),pe(a,n)}function ho(a,e,t,i=0,n=0,r=1){re(a,ie(e,i),ie(t,n)),pe(a,r)}function fo(a,e,t,i=.1,n=1){re(a,Ti(e,i),ie(t)),pe(a,n)}function mo(a,e,t,i=.1,n=1){re(a,ki(e,i),ie(t)),pe(a,n)}function bo(a,e,t,i=.05,n=.05,r=1){re(a,Ti(e,n),Li(t,i)),pe(a,r)}function yo(a,e,t,i=.05,n=.05,r=1){re(a,ki(e,n),Li(t,i)),pe(a,r)}function vo(a,e,t,i=.05,n=.05,r=1){re(a,Ti(e,n),Ci(t,i)),pe(a,r)}function xo(a,e,t,i=.05,n=.05,r=1){re(a,ki(e,n),Ci(t,i)),pe(a,r)}function re(a,e,t){a&&a.position?typeof a.position.set=="function"?a.position.set(e,t):(a.position.x=e,a.position.y=t):a&&(a.x=e,a.y=t)}function pe(a,e){e!==1&&a&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(e,e):a.scale.x!==void 0&&a.scale.y!==void 0&&(a.scale.x=e,a.scale.y=e))}var De={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 wo(a){return a&&De[a]?JSON.parse(JSON.stringify(De[a])):JSON.parse(JSON.stringify(U))}function At(a){Object.keys(a).forEach(e=>{let t=e;U[t]&&a[t]&&Object.assign(U[t],a[t])}),console.log("Config applied:",a)}function Eo(a,e){let t=a/e;t>1.6?(At(De.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(At(De.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(At(De.square),console.log("Applied SQUARE config for ratio:",t)):(At(De.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let a=window;a.configPresets=De,a.resolveAnchorVec2=a.resolveAnchorVec2||st,a.resolveScreenAnchorPoint=a.resolveScreenAnchorPoint||St,a.resolveScreenRatioPoint=a.resolveScreenRatioPoint||Ct}var Z=null;function Ao(a,e,t,i,n,r={}){var D,L,_,$,Q,B,V,Y,X,we,ze,Lt,z,se,ue,Ee,ge,_e,He,$e,he,Be,Ae,Tt,kt,Gn,qn,Vn,Yn,Wn,Kn,Xn,Jn,Zn;let s=(D=r.enableDebugLogs)!=null?D:!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:",r));let{mainContainer:o,label:l,background:c,backgroundTexture:p,app:d}=a;if(!d||!d.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:d.renderer.width,height:d.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:d.screen.width,height:d.screen.height}));let u=i.width,g=i.height;s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:u,baseHeight:g});let f=u*U.layout.screen_scale_x,h=g*U.layout.screen_scale_y,m=u/2,b=e.engine.runtime||{},y=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:U.layout.screen_scale_x,screen_scale_y:U.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:f,height:h,midX:m}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",y));let v=y.design_width_portrait||400,x=f/v;x=Math.min(x,1.15);let w=x*((L=U.engine.scale)!=null?L:1),C=(_=r.skipMainContainerTransform)!=null?_:!1;!C&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(w):(o.scale.x=w,o.scale.y=w));let k=($=y.main_container_anchor)!=null?$:"center",P=(Q=y.main_container_position_ratio)!=null?Q:{x:.5,y:.5},O=(B=y.main_container_offset)!=null?B:{x:0,y:0},j=y.main_container_position_ratio?Ct(u,g,P):St(u,g,k),T=j.x+O.x+U.layout.position_offset.x,E=j.y+O.y+U.layout.position_offset.y;if(!C&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(T,E):(o.position.x=T,o.position.y=E)),n&&(o!=null&&o.toLocal))for(let[J,K]of e.objects.entries()){let N=K==null?void 0:K.transform;if(!N||((V=N.position_mode)!=null?V:"static")!=="static")continue;let H=(Y=n.get)==null?void 0:Y.call(n,J),oe=((X=H==null?void 0:H.getDisplayObject)==null?void 0:X.call(H))||(H==null?void 0:H.pixiObject)||H;if(!oe||oe.parent!==o)continue;let Pt=N.position_ratio!=null?Ct(u,g,N.position_ratio):St(u,g,(we=N.anchor)!=null?we:"center"),Mt=o.toLocal(new no(Pt.x,Pt.y)),_t=(ze=N.position)!=null?ze:{x:0,y:0},Re=Mt.x+_t.x,Pi=Mt.y+_t.y;typeof(H==null?void 0:H.setPosition)=="function"?H.setPosition(Re,Pi):(re(oe,Re,Pi),(Lt=H==null?void 0:H.transform)!=null&&Lt.position&&(H.transform.position.x=Re,H.transform.position.y=Pi))}let S=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,M=((S==null?void 0:S.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(U.layout.debug_rect_visible&&M){(!Z||Z.parent!==d.stage)&&(Z==null||Z.destroy(),Z=new io,Z.zIndex=9999,d.stage.addChild(Z)),Z.clear();let J=U.layout.debug_rect_scale_x,K=U.layout.debug_rect_scale_y,N=(u-4)*J,Se=(g-4)*K,H=(u-N)/2,oe=(g-Se)/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:N,rectH:Se,offsetX:H,offsetY:oe}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+H,y:2+oe,width:N,height:Se})),Z.rect(2+H,2+oe,N,Se).stroke({width:U.layout.debug_rect_thickness,color:U.layout.debug_rect_color})}else Z&&(Z.destroy(),Z=null);let I=((z=a.label)==null?void 0:z.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&I){let J=(ue=(se=I==null?void 0:I.transform)==null?void 0:se.anchor)!=null?ue:"center",K=(Ee=I==null?void 0:I.transform)==null?void 0:Ee.position_ratio,N=((ge=I==null?void 0:I.transform)==null?void 0:ge.offset)||{x:0,y:0};Un(l,u,g,{anchor:J,positionRatio:K,offset:{x:N.x*w,y:N.y*w},renderAnchor:st(J)})}if(l&&l.alpha>0){let J=1+Math.sin(t*U.engine.label_pulse_speed)*U.engine.label_pulse_intensity,K=(He=(_e=I==null?void 0:I.transform)==null?void 0:_e.scale)!=null?He:1,N=J*w*K;l.scale&&(typeof l.scale.set=="function"?l.scale.set(N):(l.scale.x=N,l.scale.y=N))}if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING ====="),c){s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",($e=c.constructor)==null?void 0:$e.name)),c.alpha=((Be=(he=b.background)==null?void 0:he.alpha)!=null?Be:.98)*U.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let J=e.objects.get("background_1");s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",J);let K=(J==null?void 0:J.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",K);let N=K.offset||{x:0,y:0},Se=((Tt=(Ae=b.background)==null?void 0:Ae.offset_y)!=null?Tt:0)+U.engine.background_offset_y,H=(kt=K.anchor)!=null?kt:"center",oe=K.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:N,bgRuntimeOffsetY:Se,bgScreenAnchor:H,bgPositionRatio:oe,baseWidth:u,baseHeight:g,finalScale:w}),Un(c,u,g,{anchor:H,positionRatio:oe,offset:{x:N.x*w,y:N.y*w+Se},renderAnchor:st(H)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(Gn=c.scale)==null?void 0:Gn.x,scaleY:(qn=c.scale)==null?void 0:qn.y,anchorX:(Vn=c.anchor)==null?void 0:Vn.x,anchorY:(Yn=c.anchor)==null?void 0:Yn.y,pivotX:(Wn=c.pivot)==null?void 0:Wn.x,pivotY:(Kn=c.pivot)==null?void 0:Kn.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:p==null?void 0:p.width,textureHeight:p==null?void 0:p.height})),p){let Pt=Math.max(f/p.width,h/p.height),Mt=(Jn=(Xn=b.background)==null?void 0:Xn.scale_multiplier)!=null?Jn:1.05,_t=(Zn=K.scale)!=null?Zn:1,Re=Pt*Mt*U.engine.background_scale*_t;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Re):(c.scale.x=Re,c.scale.y=Re))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-f/2,-h/2,f,h).fill({color:1444375}))}}function So(a){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:r}=a,s=((l=(o=n.engine)==null?void 0:o.runtime)==null?void 0:l.timeline)||{};e(r.showHook),setTimeout(()=>{t(1),i(1),e(r.waitInput),console.log("[GAME] \u23F3 Game ready for user input - tutorial shown")},(c=s.tutorial_delay_ms)!=null?c:1500)}export{Ia as a,zn as b,yi as c,vi as d,xi as e,xt as f,Bs as g,Ns as h,Fs as i,Us as j,Cn as k,Ys as l,ke as m,$n as n,wt as o,Et as p,Ws as q,Qs as r,eo as s,to as t,Nn as u,Ai as v,so as w,Fn as x,st as y,St as z,Ct as A,Un as B,Ao as C,So as D,Oa as E,ja as F,Ui as G,Ge as H,zo as I,pi as J,yn as K,wr as L,wn as M,ld as N,cd as O,be as P,Ls as Q,Ts as R,Tn as S,de as T,me as U};
1646
+ `,e.appendChild(v);let x;try{x=d.loadAnimation({container:v,renderer:r.renderer||"svg",loop:(V=r.loop)!=null?V:!1,autoplay:(Y=r.autoplay)!=null?Y:!0,animationData:c})}catch(X){return v.parentNode&&v.parentNode.removeChild(v),console.warn(`[LottieOverlay] Failed to start animation: ${a}`,X),null}r.speed!==void 0&&x.setSpeed(r.speed);let w=()=>{x.destroy(),v.parentNode&&v.parentNode.removeChild(v)};return r.loop||x.addEventListener("complete",w),{animation:x,cleanup:w}}var $n=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 zn(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 wt(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 Et=class{setContext(e){this.context=e}};var At=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 Fr from"pixi.js";var Ws=Fr;typeof window!="undefined"&&(window.__basePixi=Fr);import{Sprite as Ks,Text as Xs,TextStyle as Js,Texture as Ur}from"pixi.js";var Gr=a=>a*Math.PI/180;function Zs(a,e){var s,o,l,c,d;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(s=e.render)!=null&&s.tint&&(i=e.render.tint);let n=new Js({fontFamily:(o=t.font)!=null?o:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(d=t.letterSpacing)!=null?d:0}),r=new Xs({text:t.text,style:n});return r.label=a,r}function Qs(a){var d,p,u,g,f,h,m,b,y,v;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:r,denyList:s}=a,o={},l={},c={};t.sortableChildren=!0;for(let[x,w]of i.objects.entries()){if(s!=null&&s.has(x)||r&&!r.has(x)||(w==null?void 0:w.enabled)===!1)continue;let C=(p=(d=w==null?void 0:w.render)==null?void 0:d.asset)==null?void 0:p.path,k=(g=(u=w==null?void 0:w.render)==null?void 0:u.asset)==null?void 0:g.type,P=!!(C&&k==="image"),O=!!((f=w==null?void 0:w.ui)!=null&&f.text),j=O?(h=w==null?void 0:w.ui)==null?void 0:h.renderMode:void 0,L;if(j==="png"&&P?L="png":j==="text"&&O?L="text":P?L="png":O?L="text":L="skip",L!=="skip"){if(L==="text"){let E=Zs(x,w);if(!E)continue;let S=w.render;E.alpha=typeof(S==null?void 0:S.alpha)=="number"?S.alpha:1,E.visible=(S==null?void 0:S.visible)!==!1,E.zIndex=typeof(S==null?void 0:S.z_index)=="number"?S.z_index:0,S!=null&&S.anchor&&typeof S.anchor.x=="number"&&typeof S.anchor.y=="number"?E.anchor.set(S.anchor.x,S.anchor.y):E.anchor.set(.5,.5);let A=w.transform,M=(A==null?void 0:A.position)||(A==null?void 0:A.offset);M&&E.position.set((m=M.x)!=null?m:0,(b=M.y)!=null?b:0);let I=typeof(A==null?void 0:A.scale)=="number"?A.scale:1;E.scale.set(I,I);let D=typeof(A==null?void 0:A.rotation)=="number"?A.rotation:0;E.rotation=Gr(D),E.parent||t.addChild(E);try{n.create(x,E)}catch{}o[x]=E,c[x]=E}else if(L==="png"){let E=le[x]||(typeof Ur!="undefined"?Ur.EMPTY:void 0),S=new Ks(E);S.label=x;let A=w.render;S.alpha=typeof(A==null?void 0:A.alpha)=="number"?A.alpha:1,S.visible=(A==null?void 0:A.visible)!==!1,S.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"&&S.anchor.set(A.anchor.x,A.anchor.y);let M=w.transform,I=(M==null?void 0:M.position)||(M==null?void 0:M.offset);I&&S.position.set((y=I.x)!=null?y:0,(v=I.y)!=null?v:0);let D=typeof(M==null?void 0:M.scale)=="number"?M.scale:1;S.scale.set(D,D);let T=typeof(M==null?void 0:M.rotation)=="number"?M.rotation:0;S.rotation=Gr(T),S.parent||t.addChild(S);try{n.create(x,S)}catch{}o[x]=S,l[x]=S}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var Bn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new At}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 r=>{var o;let s=this.registry.get(r);if(!s){console.warn("[Assets] No config found for object:",r);return}try{let l=await ke.create(r,s,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));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 ke.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},qr=new Bn,eo=new Proxy(qr,{get(a,e){if(e in a&&typeof a[e]=="function")return a[e].bind(a);if(a.get(e))return a.get(e)}});function to(a,e){qr.init(a,e)}var Nn=class extends Et{async init(){Ii(this.context.config,this.context.app),await le.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};import{Graphics as io,Point as no}from"pixi.js";var xe={width:400,height:600,designWidth:400,scaleFactor:1},Ci={scale:1,position:1},Ti=[];function ao(a,e,t,i,n,r,s){Ti.push({element:a,originalScale:r,positionHelper:e,heightPercent:n}),e(a,t,i,n,r,s,!1)}function ro(){Ti.forEach(({element:a,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*xe.scaleFactor;t(a,xe.width,xe.height,i,n,!0,!1)})}function so(){Ti.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function Fn(a,e){console.log(`[SCREEN] updateScreenState called: ${a}x${e}`),xe.width=a,xe.height=e,xe.scaleFactor=Math.min(a/xe.designWidth,1.15),Ci.scale=xe.scaleFactor,Ci.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Ci.scale.toFixed(3)}`),ro()}var U={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 oo(a,e,t){let i=U[a];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${a}.${e} = ${t}`))}function lo(){return U}var co={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 Si(a,e){return typeof a=="number"&&Number.isFinite(a)?a:e}function st(a,e={x:.5,y:.5}){var t;if(Array.isArray(a))return{x:Si(a[0],e.x),y:Si(a[1],e.y)};if(a&&typeof a=="object"){let i=a;return{x:Si(i.x,e.x),y:Si(i.y,e.y)}}if(typeof a=="string"){let i=a.trim().toLowerCase();return(t=co[i])!=null?t:e}return e}function Ct(a,e,t,i={}){var g,f,h,m,b,y;let n=st(t),r=(g=i.inset)!=null?g:{},s=(f=i.padding)!=null?f:{x:0,y:0},o=((h=r.left)!=null?h:0)+s.x,l=((m=r.right)!=null?m:0)+s.x,c=((b=r.top)!=null?b:0)+s.y,d=((y=r.bottom)!=null?y:0)+s.y,p=Math.max(0,a-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function Tt(a,e,t,i={}){var h,m,b,y,v,x;let n=(h=i.inset)!=null?h:{},r=(m=i.padding)!=null?m:{x:0,y:0},s=((b=n.left)!=null?b:0)+r.x,o=((y=n.right)!=null?y:0)+r.x,l=((v=n.top)!=null?v:0)+r.y,c=((x=n.bottom)!=null?x:0)+r.y,d=Math.max(0,a-s-o),p=Math.max(0,e-l-c),u=st(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:s+d*g,y:l+p*f}}function Un(a,e,t,i={}){var d,p,u;if(!a)return;let n=i.positionRatio?Tt(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Ct(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),r=(d=i.offset)!=null?d:{x:0,y:0},s=n.x+r.x,o=n.y+r.y;a.anchor&&i.renderAnchor&&a.anchor.set(i.renderAnchor.x,i.renderAnchor.y),re(a,s,o);let l=(p=i.scale)!=null?p:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&pe(a,l*c)}if(typeof window!="undefined"){let a=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==a||n!==e)&&(a=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=oo,window.getDebugConfig=lo,window.copyConfig=wo,window.applyConfig=St,window.applyConfigForRatio=Eo,window.positionAtBottom=Vr,window.positionAtTop=go,window.positionAtCenter=ho,window.positionAtLeft=fo,window.positionAtRight=mo,window.positionAtBottomLeft=bo,window.positionAtBottomRight=yo,window.positionAtTopLeft=vo,window.positionAtTopRight=xo,window.applyPositionContract=uo,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 Li(a,e,t=0){return a*e+t}function ki(a,e,t=0){return a*(1-e)+t}function Pi(a,e,t=0){return a*e+t}function Mi(a,e,t=0){return a*(1-e)+t}function ie(a,e=0){return a/2+e}function po(a,e){return a*e}function uo(a,e,t,i){var s,o,l,c,d,p,u,g,f,h,m,b,y,v,x,w,C,k,P,O;let n=0,r=0;switch(i.type){case"top":n=ie(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),r=Li(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ie(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),r=ki(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Pi(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),r=ie(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=Mi(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),r=ie(t,(w=(x=i.offset)==null?void 0:x.y)!=null?w:0);break;case"center":n=ie(e,(k=(C=i.offset)==null?void 0:C.x)!=null?k:0),r=ie(t,(O=(P=i.offset)==null?void 0:P.y)!=null?O:0);break}a.position?a.position.set(n,r):(a.x=n,a.y=r),i.scale!==void 0&&i.scale!==1&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(i.scale,i.scale):(a.scale.x=i.scale,a.scale.y=i.scale))}function Vr(a,e,t,i=.2,n=1,r=!0,s=!1){let o=po(t,i),l=ki(t,i/2);re(a,ie(e),l);let c=r?n*xe.scaleFactor:n;pe(a,c),s&&!Ti.find(d=>d.element===a)&&ao(a,Vr,e,t,i,n,r)}function go(a,e,t,i=.1,n=1){re(a,ie(e),Li(t,i)),pe(a,n)}function ho(a,e,t,i=0,n=0,r=1){re(a,ie(e,i),ie(t,n)),pe(a,r)}function fo(a,e,t,i=.1,n=1){re(a,Pi(e,i),ie(t)),pe(a,n)}function mo(a,e,t,i=.1,n=1){re(a,Mi(e,i),ie(t)),pe(a,n)}function bo(a,e,t,i=.05,n=.05,r=1){re(a,Pi(e,n),ki(t,i)),pe(a,r)}function yo(a,e,t,i=.05,n=.05,r=1){re(a,Mi(e,n),ki(t,i)),pe(a,r)}function vo(a,e,t,i=.05,n=.05,r=1){re(a,Pi(e,n),Li(t,i)),pe(a,r)}function xo(a,e,t,i=.05,n=.05,r=1){re(a,Mi(e,n),Li(t,i)),pe(a,r)}function re(a,e,t){a&&a.position?typeof a.position.set=="function"?a.position.set(e,t):(a.position.x=e,a.position.y=t):a&&(a.x=e,a.y=t)}function pe(a,e){e!==1&&a&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(e,e):a.scale.x!==void 0&&a.scale.y!==void 0&&(a.scale.x=e,a.scale.y=e))}var De={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 wo(a){return a&&De[a]?JSON.parse(JSON.stringify(De[a])):JSON.parse(JSON.stringify(U))}function St(a){Object.keys(a).forEach(e=>{let t=e;U[t]&&a[t]&&Object.assign(U[t],a[t])}),console.log("Config applied:",a)}function Eo(a,e){let t=a/e;t>1.6?(St(De.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(St(De.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(St(De.square),console.log("Applied SQUARE config for ratio:",t)):(St(De.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let a=window;a.configPresets=De,a.resolveAnchorVec2=a.resolveAnchorVec2||st,a.resolveScreenAnchorPoint=a.resolveScreenAnchorPoint||Ct,a.resolveScreenRatioPoint=a.resolveScreenRatioPoint||Tt}var Z=null;function Ao(a,e,t,i,n,r={}){var D,T,_,$,Q,B,V,Y,X,we,ze,Lt,z,se,ue,Ee,ge,_e,He,$e,he,Be,Ae,kt,Pt,Gn,qn,Vn,Yn,Wn,Kn,Xn,Jn,Zn;let s=(D=r.enableDebugLogs)!=null?D:!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:",r));let{mainContainer:o,label:l,background:c,backgroundTexture:d,app:p}=a;if(!p||!p.renderer){s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] App renderer dimensions:",{width:p.renderer.width,height:p.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:p.screen.width,height:p.screen.height}));let u=i.width,g=i.height;s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:u,baseHeight:g});let f=u*U.layout.screen_scale_x,h=g*U.layout.screen_scale_y,m=u/2,b=e.engine.runtime||{},y=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:U.layout.screen_scale_x,screen_scale_y:U.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:f,height:h,midX:m}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",y));let v=y.design_width_portrait||400,x=f/v;x=Math.min(x,1.15);let w=x*((T=U.engine.scale)!=null?T:1),C=(_=r.skipMainContainerTransform)!=null?_:!1;!C&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(w):(o.scale.x=w,o.scale.y=w));let k=($=y.main_container_anchor)!=null?$:"center",P=(Q=y.main_container_position_ratio)!=null?Q:{x:.5,y:.5},O=(B=y.main_container_offset)!=null?B:{x:0,y:0},j=y.main_container_position_ratio?Tt(u,g,P):Ct(u,g,k),L=j.x+O.x+U.layout.position_offset.x,E=j.y+O.y+U.layout.position_offset.y;if(!C&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(L,E):(o.position.x=L,o.position.y=E)),n&&(o!=null&&o.toLocal))for(let[J,K]of e.objects.entries()){let N=K==null?void 0:K.transform;if(!N||((V=N.position_mode)!=null?V:"static")!=="static")continue;let H=(Y=n.get)==null?void 0:Y.call(n,J),oe=((X=H==null?void 0:H.getDisplayObject)==null?void 0:X.call(H))||(H==null?void 0:H.pixiObject)||H;if(!oe||oe.parent!==o)continue;let Mt=N.position_ratio!=null?Tt(u,g,N.position_ratio):Ct(u,g,(we=N.anchor)!=null?we:"center"),_t=o.toLocal(new no(Mt.x,Mt.y)),Rt=(ze=N.position)!=null?ze:{x:0,y:0},Re=_t.x+Rt.x,_i=_t.y+Rt.y;typeof(H==null?void 0:H.setPosition)=="function"?H.setPosition(Re,_i):(re(oe,Re,_i),(Lt=H==null?void 0:H.transform)!=null&&Lt.position&&(H.transform.position.x=Re,H.transform.position.y=_i))}let S=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,M=((S==null?void 0:S.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(U.layout.debug_rect_visible&&M){(!Z||Z.parent!==p.stage)&&(Z==null||Z.destroy(),Z=new io,Z.zIndex=9999,p.stage.addChild(Z)),Z.clear();let J=U.layout.debug_rect_scale_x,K=U.layout.debug_rect_scale_y,N=(u-4)*J,Se=(g-4)*K,H=(u-N)/2,oe=(g-Se)/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:N,rectH:Se,offsetX:H,offsetY:oe}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+H,y:2+oe,width:N,height:Se})),Z.rect(2+H,2+oe,N,Se).stroke({width:U.layout.debug_rect_thickness,color:U.layout.debug_rect_color})}else Z&&(Z.destroy(),Z=null);let I=((z=a.label)==null?void 0:z.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&I){let J=(ue=(se=I==null?void 0:I.transform)==null?void 0:se.anchor)!=null?ue:"center",K=(Ee=I==null?void 0:I.transform)==null?void 0:Ee.position_ratio,N=((ge=I==null?void 0:I.transform)==null?void 0:ge.offset)||{x:0,y:0};Un(l,u,g,{anchor:J,positionRatio:K,offset:{x:N.x*w,y:N.y*w},renderAnchor:st(J)})}if(l&&l.alpha>0){let J=1+Math.sin(t*U.engine.label_pulse_speed)*U.engine.label_pulse_intensity,K=(He=(_e=I==null?void 0:I.transform)==null?void 0:_e.scale)!=null?He:1,N=J*w*K;l.scale&&(typeof l.scale.set=="function"?l.scale.set(N):(l.scale.x=N,l.scale.y=N))}if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING ====="),c){s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",($e=c.constructor)==null?void 0:$e.name)),c.alpha=((Be=(he=b.background)==null?void 0:he.alpha)!=null?Be:.98)*U.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let J=e.objects.get("background_1");s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",J);let K=(J==null?void 0:J.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",K);let N=K.offset||{x:0,y:0},Se=((kt=(Ae=b.background)==null?void 0:Ae.offset_y)!=null?kt:0)+U.engine.background_offset_y,H=(Pt=K.anchor)!=null?Pt:"center",oe=K.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:N,bgRuntimeOffsetY:Se,bgScreenAnchor:H,bgPositionRatio:oe,baseWidth:u,baseHeight:g,finalScale:w}),Un(c,u,g,{anchor:H,positionRatio:oe,offset:{x:N.x*w,y:N.y*w+Se},renderAnchor:st(H)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(Gn=c.scale)==null?void 0:Gn.x,scaleY:(qn=c.scale)==null?void 0:qn.y,anchorX:(Vn=c.anchor)==null?void 0:Vn.x,anchorY:(Yn=c.anchor)==null?void 0:Yn.y,pivotX:(Wn=c.pivot)==null?void 0:Wn.x,pivotY:(Kn=c.pivot)==null?void 0:Kn.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 Mt=Math.max(f/d.width,h/d.height),_t=(Jn=(Xn=b.background)==null?void 0:Xn.scale_multiplier)!=null?Jn:1.05,Rt=(Zn=K.scale)!=null?Zn:1,Re=Mt*_t*U.engine.background_scale*Rt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Re):(c.scale.x=Re,c.scale.y=Re))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-f/2,-h/2,f,h).fill({color:1444375}))}}function So(a){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:r}=a,s=((l=(o=n.engine)==null?void 0:o.runtime)==null?void 0:l.timeline)||{};e(r.showHook),setTimeout(()=>{t(1),i(1),e(r.waitInput),console.log("[GAME] \u23F3 Game ready for user input - tutorial shown")},(c=s.tutorial_delay_ms)!=null?c:1500)}export{Ia as a,zn as b,xi as c,wi as d,Ei as e,wt as f,Bs as g,Ns as h,Fs as i,Us as j,Cn as k,Ys as l,ke as m,$n as n,Et as o,At as p,Ws as q,Qs as r,eo as s,to as t,Nn as u,Ci as v,so as w,Fn as x,st as y,Ct as z,Tt as A,Un as B,Ao as C,So as D,Oa as E,ja as F,Ui as G,Ge as H,zo as I,gi as J,yn as K,wr as L,wn as M,ld as N,cd as O,be as P,Ts as Q,Ls as R,Ln as S,de as T,me as U};