handler-playable-sdk 0.5.36 → 0.5.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import{c as Fi,d as be,e as Bi}from"./chunk-I5OOVR5U.js";import{i as Ht}from"./chunk-NHKCXBUZ.js";import{c as ut,d as zt,e as Fe,g as da,h as Ui,j as pa,k as ua,l as Gi,m as Dt,n as $t,o as ga,p as qi,q as ha}from"./chunk-C4GAOSNW.js";import{a as as}from"./chunk-JXBG6UFL.js";import{Application as Zs}from"pixi.js";var Ie={};function Nt(r,e,t=!1){Ie[r]||(Ie[r]=[]),Ie[r].push({fn:e,once:t})}function Vi(r,e){if(Ie[r]){if(!e){delete Ie[r];return}Ie[r]=Ie[r].filter(t=>t.fn!==e)}}function Ft(r,...e){let t=Ie[r];if(t)for(let i of[...t])i.fn(...e),i.once&&Vi(r,i.fn)}function oe(r,e){Nt(r,e,!0)}var K=null,ue=[],qe=null;function ba(r){K=r,ue=[],qe!==null&&(clearTimeout(qe),qe=null)}function va(){var r,e,t;return{endpoint:(K==null?void 0:K.endpoint)||"",transport:(K==null?void 0:K.transport)||"beacon",batchSize:(r=K==null?void 0:K.batchSize)!=null?r:10,flushIntervalMs:(e=K==null?void 0:K.flushIntervalMs)!=null?e:300,maxQueue:(t=K==null?void 0:K.maxQueue)!=null?t:200,debug:!!(K!=null&&K.debug)}}async function fa(r,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(r,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function Yi(r,e){let t=va();if(e&&t.endpoint){if(ue.push(r),ue.length>t.maxQueue&&(ue=ue.slice(ue.length-t.maxQueue)),ue.length>=t.batchSize){ma();return}qe===null&&(qe=window.setTimeout(()=>{qe=null,ma()},t.flushIntervalMs))}}async function ma(){let r=va();if(!r.endpoint||ue.length===0)return;let e=ue.splice(0,r.batchSize);await fa(r.endpoint,{events:e},r.transport,r.debug),ue.length>0&&await fa(r.endpoint,{events:ue.splice(0,r.batchSize)},r.transport,r.debug)}function ya(r){return Math.max(0,Math.min(1,r))}function rs(r){let e=String(r!=null?r:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function gt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function ss(r,e){let t=r==null?void 0:r[e];return typeof t=="number"?t:0}function xa(r,e,t){try{r[e]=t}catch{}}function os(r){let e=r==null?void 0:r.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function wa(r,e){let t=r==null?void 0:r.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Ea(r,e){let t=os(r);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function Sa(){let r=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),r.size>0&&i()})},n=u=>{var p;r.add(u);let d=(p=e.get(u.target))!=null?p:new Set;d.add(u),e.set(u.target,d),i()},a=u=>{r.delete(u);let d=e.get(u.target);d&&(d.delete(u),d.size===0&&e.delete(u.target))},s=u=>{u.killed||(u.killed=!0,a(u))},o=()=>{var d,p;let u=gt();for(let g of Array.from(r)){if(g.killed||g.paused)continue;let f=u-g.startMs-g.delayMs;if(f<0)continue;let h=g.durationMs>0?f/g.durationMs:1,m=ya(h),b=g.repeat>=0?g.repeat+1:1,v=g.repeat>0?Math.min(Math.floor(h),b-1):0;if(g.repeat>0&&h>=1){let S=h-v;m=ya(S)}let y=g.ease(m);g.yoyo&&v%2===1&&(y=1-y);for(let S of g.props)xa(g.target,S.key,S.from+(S.to-S.from)*y);g.scaleFrom&&g.scaleTo&&wa(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*y,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*y});try{(d=g.onUpdate)==null||d.call(g)}catch{}if(h>=b){s(g);try{(p=g.onComplete)==null||p.call(g)}catch{}}}},l=(u,d,p)=>{var S;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+((S=p==null?void 0:p.delayMsOverride)!=null?S:0)),h=rs(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,v=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),y=[];for(let _ of Object.keys(d)){if(v.has(_))continue;let R=d[_];typeof R=="number"&&y.push({key:_,from:ss(u,_),to:R})}let x=Ea(u,d);return{target:u,startMs:gt(),delayMs:f,durationMs:g,ease:h,props:y,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(u,d){let p=l(u,d);return n(p),{kill:()=>s(p),pause:()=>{p.paused||(p.paused=!0,p.pauseAtMs=gt())},resume:()=>{var h;if(!p.paused)return;let g=(h=p.pauseAtMs)!=null?h:gt(),f=gt()-g;p.startMs+=f,p.paused=!1,p.pauseAtMs=null},isActive:()=>!p.killed&&!p.paused}},fromTo(u,d,p){return c.set(u,d),c.to(u,p)},set(u,d){if(!u||!d)return;for(let g of Object.keys(d)){let f=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof f=="number"&&xa(u,g,f)}let p=Ea(u,d);p.to&&wa(u,p.to)},killTweensOf(u){let d=e.get(u);if(d)for(let p of Array.from(d))s(p)},timeline(u={}){let d=[],p=0,g=!1,f=[],h=v=>{if(typeof v=="number")return Math.max(0,v*1e3);let y=typeof v=="string"?v.trim():"";return y.startsWith("+=")?p+Math.max(0,Number(y.slice(2))*1e3||0):y?Math.max(0,Number(y)*1e3||0):p},m=v=>{d.push(v);let y=Math.max(0,(typeof v.vars.duration=="number"?v.vars.duration:.5)*1e3);p=Math.max(p,v.atMs+y)},b={to(v,y,x){return m({kind:"to",target:v,vars:y,atMs:h(x)}),b},fromTo(v,y,x,S){return m({kind:"fromTo",target:v,vars:x,from:y,atMs:h(S)}),b},play(){var v,y;if(g)return b;g=!0,f=[];for(let x of d)x.kind==="fromTo"&&c.set(x.target,(v=x.from)!=null?v:{}),f.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((y=x.vars.delay)!=null?y:0)}));return b},pause(){for(let v of f)v.pause();return b},kill(){for(let v of f)v.kill();f=[],g=!1}};return u.paused||b.play(),b}};return c}function Aa(){if(typeof window=="undefined")return;let r=window;if(!r.gsap)try{r.gsap=Sa()}catch{}}var Ca={name:"handler-playable-sdk",version:"0.5.36",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 le=0,cs=le++,Ta=le++,La=le++,ka=le++,Pa=le++,Ma=le++,_a=le++,Ia=le++,Oa=le++,ja=le++,Ra=le++,za=le++,G=cs;function Da(){return G===Ta}function $a(){return G===La}function Ha(){return G===ka}function Na(){return G===Pa}function Ve(){return G===Ma}function Ye(){return G===_a}function Fa(){return G===Ia}function Ba(){return G===Oa}function Ua(){return G===ja}function Wi(){return G===Ra}function Ki(){return G===za}function Ga(){let r=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(r==="mraid")try{mraid.getState(),G=Ta;return}catch{}else if(r==="dapi")try{dapi.isReady(),G=La;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(G=ka)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(G=Pa)}catch{}else if(e==="mintegral")window.gameReady&&(G=Ma);else if(e==="tapjoy")window.TJ_API&&(G=_a);else if(e==="tiktok")window.openAppStore&&(G=Ia);else if(e==="smadex")try{window.smxTracking&&(G=Oa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(G=ja)}catch{}else e==="vungle"?G=Ra:(r==="nucleo"||e==="nucleo")&&(G=za)}import Xi from"lottie-web";var qa=Xi;typeof window!="undefined"&&(window.lottie=Xi,window.__baseLottie=Xi);function X(r,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(r,e);return`${r/i}:${e/i}`}var Wo=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:X(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:X(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:X(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:X(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:X(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:X(360,780)}],Ko=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:X(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:X(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:X(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:X(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:X(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:X(412,915)}],Xo=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:X(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:X(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:X(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:X(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:X(800,1280)}],Ji=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:X(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:X(768,1024),mraidScale:.7}];var Va=[...Ji],Ya=[{category:"playable",label:"Playable Ad",devices:Ji}],Zi=Ji[0];function We(r){return Va.find(e=>e.id===r)||Zi}function Jo(r){return Va.filter(e=>e.category===r)}var Ke=class{async updateProperty(e,t,i,n={}){var l,c,u;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let s=a(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}ut({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let d=window.__editableConfig,p=(u=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?u:s;await o(e,p),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function Qi(r){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let s=n.result,o=r.category||"misc",c=`${(r.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:s,overwrite:!0})})).json();if(!(d!=null&&d.success)){alert(`Upload failed: ${(d==null?void 0:d.error)||"Unknown error"}`);return}let p=window.addAssetToRegistry;typeof p=="function"&&p(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await r.onApply(d.path)}catch(u){console.error("[QuickActionsBar] Upload error:",u),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Bt=class{constructor(){this.updateManager=new Ke}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let s=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,s);break;case"ai-edit":this.openAIEditor(t,i,s);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,s);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let s=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(u=>u.objectId===a||u.slotId===a)){let u=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:u,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:u,assetType:"image"}),n.categories&&!n.categories.includes(u)&&n.categories.push(u),n.libraryAssets&&!n.libraryAssets[u]&&(n.libraryAssets[u]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(n.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(e),l=(a=o==null?void 0:o.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var s;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((s=n==null?void 0:n.identity)==null?void 0:s.category)||(t.split(".")[0]==="render"?"environment":"ui");Qi({objectId:e,category:a,onApply:async o=>{var u,d;await this.updateManager.updateProperty(e,t,o);let l=window.__debugContext;(d=(u=l==null?void 0:l.options)==null?void 0:u.onPropertyChange)==null||d.call(u,e,t,o);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(n):typeof s.schemas=="object"&&(o=s.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let s=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,s,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var ds=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],ps=["environment","ui","character","system","backgrounds"],us=["bg","world","ui"],Wa={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},Ut=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
1
+ import{c as Fi,d as be,e as Bi}from"./chunk-I5OOVR5U.js";import{i as Ht}from"./chunk-NHKCXBUZ.js";import{c as gt,d as Dt,e as Fe,g as da,h as Ui,j as pa,k as ua,l as Gi,m as $t,n as Be,o as ga,p as qi,q as ha}from"./chunk-C4GAOSNW.js";import{a as as}from"./chunk-JXBG6UFL.js";import{Application as Zs}from"pixi.js";var Ie={};function Nt(r,e,t=!1){Ie[r]||(Ie[r]=[]),Ie[r].push({fn:e,once:t})}function Vi(r,e){if(Ie[r]){if(!e){delete Ie[r];return}Ie[r]=Ie[r].filter(t=>t.fn!==e)}}function Ft(r,...e){let t=Ie[r];if(t)for(let i of[...t])i.fn(...e),i.once&&Vi(r,i.fn)}function oe(r,e){Nt(r,e,!0)}var K=null,ue=[],Ve=null;function ba(r){K=r,ue=[],Ve!==null&&(clearTimeout(Ve),Ve=null)}function va(){var r,e,t;return{endpoint:(K==null?void 0:K.endpoint)||"",transport:(K==null?void 0:K.transport)||"beacon",batchSize:(r=K==null?void 0:K.batchSize)!=null?r:10,flushIntervalMs:(e=K==null?void 0:K.flushIntervalMs)!=null?e:300,maxQueue:(t=K==null?void 0:K.maxQueue)!=null?t:200,debug:!!(K!=null&&K.debug)}}async function fa(r,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(r,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function Yi(r,e){let t=va();if(e&&t.endpoint){if(ue.push(r),ue.length>t.maxQueue&&(ue=ue.slice(ue.length-t.maxQueue)),ue.length>=t.batchSize){ma();return}Ve===null&&(Ve=window.setTimeout(()=>{Ve=null,ma()},t.flushIntervalMs))}}async function ma(){let r=va();if(!r.endpoint||ue.length===0)return;let e=ue.splice(0,r.batchSize);await fa(r.endpoint,{events:e},r.transport,r.debug),ue.length>0&&await fa(r.endpoint,{events:ue.splice(0,r.batchSize)},r.transport,r.debug)}function ya(r){return Math.max(0,Math.min(1,r))}function rs(r){let e=String(r!=null?r:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function ht(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function ss(r,e){let t=r==null?void 0:r[e];return typeof t=="number"?t:0}function xa(r,e,t){try{r[e]=t}catch{}}function os(r){let e=r==null?void 0:r.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function wa(r,e){let t=r==null?void 0:r.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Ea(r,e){let t=os(r);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function Sa(){let r=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),r.size>0&&i()})},n=p=>{var u;r.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},a=p=>{r.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,a(p))},o=()=>{var d,u;let p=ht();for(let g of Array.from(r)){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=ya(h),b=g.repeat>=0?g.repeat+1:1,v=g.repeat>0?Math.min(Math.floor(h),b-1):0;if(g.repeat>0&&h>=1){let x=h-v;m=ya(x)}let y=g.ease(m);g.yoyo&&v%2===1&&(y=1-y);for(let x of g.props)xa(g.target,x.key,x.from+(x.to-x.from)*y);g.scaleFrom&&g.scaleTo&&wa(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*y,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*y});try{(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 x;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+((x=u==null?void 0:u.delayMsOverride)!=null?x:0)),h=rs(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,v=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),y=[];for(let S of Object.keys(d)){if(v.has(S))continue;let O=d[S];typeof O=="number"&&y.push({key:S,from:ss(p,S),to:O})}let w=Ea(p,d);return{target:p,startMs:ht(),delayMs:f,durationMs:g,ease:h,props:y,scaleFrom:w.from,scaleTo:w.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=ht())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:ht(),f=ht()-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"&&xa(p,g,f)}let u=Ea(p,d);u.to&&wa(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=v=>{if(typeof v=="number")return Math.max(0,v*1e3);let y=typeof v=="string"?v.trim():"";return y.startsWith("+=")?u+Math.max(0,Number(y.slice(2))*1e3||0):y?Math.max(0,Number(y)*1e3||0):u},m=v=>{d.push(v);let y=Math.max(0,(typeof v.vars.duration=="number"?v.vars.duration:.5)*1e3);u=Math.max(u,v.atMs+y)},b={to(v,y,w){return m({kind:"to",target:v,vars:y,atMs:h(w)}),b},fromTo(v,y,w,x){return m({kind:"fromTo",target:v,vars:w,from:y,atMs:h(x)}),b},play(){var v,y;if(g)return b;g=!0,f=[];for(let w of d)w.kind==="fromTo"&&c.set(w.target,(v=w.from)!=null?v:{}),f.push(c.to(w.target,{...w.vars,delay:w.atMs/1e3+((y=w.vars.delay)!=null?y:0)}));return b},pause(){for(let v of f)v.pause();return b},kill(){for(let v of f)v.kill();f=[],g=!1}};return p.paused||b.play(),b}};return c}function Aa(){if(typeof window=="undefined")return;let r=window;if(!r.gsap)try{r.gsap=Sa()}catch{}}var Ca={name:"handler-playable-sdk",version:"0.5.38",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 le=0,cs=le++,Ta=le++,La=le++,ka=le++,Pa=le++,Ma=le++,_a=le++,Ia=le++,Oa=le++,ja=le++,Ra=le++,za=le++,G=cs;function Da(){return G===Ta}function $a(){return G===La}function Ha(){return G===ka}function Na(){return G===Pa}function Ye(){return G===Ma}function We(){return G===_a}function Fa(){return G===Ia}function Ba(){return G===Oa}function Ua(){return G===ja}function Wi(){return G===Ra}function Ki(){return G===za}function Ga(){let r=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(r==="mraid")try{mraid.getState(),G=Ta;return}catch{}else if(r==="dapi")try{dapi.isReady(),G=La;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(G=ka)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(G=Pa)}catch{}else if(e==="mintegral")window.gameReady&&(G=Ma);else if(e==="tapjoy")window.TJ_API&&(G=_a);else if(e==="tiktok")window.openAppStore&&(G=Ia);else if(e==="smadex")try{window.smxTracking&&(G=Oa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(G=ja)}catch{}else e==="vungle"?G=Ra:(r==="nucleo"||e==="nucleo")&&(G=za)}import Xi from"lottie-web";var qa=Xi;typeof window!="undefined"&&(window.lottie=Xi,window.__baseLottie=Xi);function X(r,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(r,e);return`${r/i}:${e/i}`}var Wo=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:X(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:X(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:X(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:X(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:X(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:X(360,780)}],Ko=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:X(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:X(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:X(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:X(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:X(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:X(412,915)}],Xo=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:X(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:X(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:X(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:X(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:X(800,1280)}],Ji=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:X(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:X(768,1024),mraidScale:.7}];var Va=[...Ji],Ya=[{category:"playable",label:"Playable Ad",devices:Ji}],Zi=Ji[0];function Ke(r){return Va.find(e=>e.id===r)||Zi}function Jo(r){return Va.filter(e=>e.category===r)}var Xe=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let s=a(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}gt({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let 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 a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function Qi(r){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let s=n.result,o=r.category||"misc",c=`${(r.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:s,overwrite:!0})})).json();if(!(d!=null&&d.success)){alert(`Upload failed: ${(d==null?void 0:d.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await r.onApply(d.path)}catch(p){console.error("[QuickActionsBar] Upload error:",p),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Bt=class{constructor(){this.updateManager=new Xe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let s=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,s);break;case"ai-edit":this.openAIEditor(t,i,s);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,s);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let s=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===a||p.slotId===a)){let p=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category: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 a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(n.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(e),l=(a=o==null?void 0:o.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var s;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((s=n==null?void 0:n.identity)==null?void 0:s.category)||(t.split(".")[0]==="render"?"environment":"ui");Qi({objectId:e,category:a,onApply:async o=>{var p,d;await this.updateManager.updateProperty(e,t,o);let l=window.__debugContext;(d=(p=l==null?void 0:l.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,o);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(n):typeof s.schemas=="object"&&(o=s.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let s=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,s,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var ds=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],ps=["environment","ui","character","system","backgrounds"],us=["bg","world","ui"],Wa={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},Ut=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
2
2
  <div class="wizard-card">
3
3
  <div class="wizard-header">
4
4
  <div class="wizard-title">
@@ -265,8 +265,8 @@ import{c as Fi,d as be,e as Bi}from"./chunk-I5OOVR5U.js";import{i as Ht}from"./c
265
265
  <div class="context-menu-separator"></div>
266
266
  <div class="context-menu-item danger" data-action="delete">Delete</div>
267
267
  `,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,s=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),s>0&&(this.menu.style.top=`${i-s-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let i=e.target.dataset.action;i&&(e.stopPropagation(),this.handleAction(i))}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}handleAction(e){var t,i;switch(e){case"duplicate":this.handleDuplicate();break;case"rename":this.handleRename();break;case"move":this.handleMove();break;case"copy":this.handleCopyConfig();break;case"inspect":this.handleOpenInspector();break;case"delete":(i=(t=this.options).onDeleteRequest)==null||i.call(t,this.options.objectId),this.close();break}}async handleDuplicate(){var n,a,s,o,l;let e=`${this.options.objectId}_copy`,t=window.prompt("New instance ID",e);if(!t)return;if(!this.isInstanceIdUnique(t)){alert(`Instance ID "${t}" already exists.`);return}let i=window.confirm(`Share config with original?
268
- OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sourceId:this.options.objectId,newInstanceId:t,shareConfig:i,screenId:this.options.screenId})}),u=await c.json().catch(()=>({}));if(!c.ok||(u==null?void 0:u.success)===!1){let d=((n=u==null?void 0:u.errors)==null?void 0:n.join(`
269
- `))||(u==null?void 0:u.error)||"Duplicate failed.";alert(d);return}(s=(a=this.options).onRefresh)==null||s.call(a),(l=(o=this.options).onSelect)==null||l.call(o,t),this.close()}catch(c){alert(`Duplicate failed: ${c instanceof Error?c.message:String(c)}`)}}async handleRename(){var t,i,n,a,s;let e=window.prompt("New instance ID",this.options.objectId);if(!(!e||e===this.options.objectId)){if(!this.isInstanceIdUnique(e)){alert(`Instance ID "${e}" already exists.`);return}try{let o=await fetch("/api/objects/rename",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,screenId:this.options.screenId,newInstanceId:e})}),l=await o.json().catch(()=>({}));if(!o.ok||(l==null?void 0:l.success)===!1){let c=((t=l==null?void 0:l.errors)==null?void 0:t.join(`
268
+ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sourceId:this.options.objectId,newInstanceId:t,shareConfig:i,screenId:this.options.screenId})}),p=await c.json().catch(()=>({}));if(!c.ok||(p==null?void 0:p.success)===!1){let d=((n=p==null?void 0:p.errors)==null?void 0:n.join(`
269
+ `))||(p==null?void 0:p.error)||"Duplicate failed.";alert(d);return}(s=(a=this.options).onRefresh)==null||s.call(a),(l=(o=this.options).onSelect)==null||l.call(o,t),this.close()}catch(c){alert(`Duplicate failed: ${c instanceof Error?c.message:String(c)}`)}}async handleRename(){var t,i,n,a,s;let e=window.prompt("New instance ID",this.options.objectId);if(!(!e||e===this.options.objectId)){if(!this.isInstanceIdUnique(e)){alert(`Instance ID "${e}" already exists.`);return}try{let o=await fetch("/api/objects/rename",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,screenId:this.options.screenId,newInstanceId:e})}),l=await o.json().catch(()=>({}));if(!o.ok||(l==null?void 0:l.success)===!1){let c=((t=l==null?void 0:l.errors)==null?void 0:t.join(`
270
270
  `))||(l==null?void 0:l.error)||"Rename failed.";alert(c);return}(n=(i=this.options).onRefresh)==null||n.call(i),(s=(a=this.options).onSelect)==null||s.call(a,e),this.close()}catch(o){alert(`Rename failed: ${o instanceof Error?o.message:String(o)}`)}}}async handleMove(){var i,n,a;let e=window.prompt("Move to screen (loading/start/gameplay/tutorial/endgame)",this.options.screenId);if(!e)return;let t=e.trim();if(!["loading","start","gameplay","tutorial","endgame"].includes(t)){alert("Invalid screen. Use: loading, start, gameplay, tutorial, endgame.");return}if(t!==this.options.screenId)try{let s=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,fromScreenId:this.options.screenId,toScreenId:t})}),o=await s.json().catch(()=>({}));if(!s.ok||(o==null?void 0:o.success)===!1){let l=((i=o==null?void 0:o.errors)==null?void 0:i.join(`
271
271
  `))||(o==null?void 0:o.error)||"Move failed.";alert(l);return}(a=(n=this.options).onRefresh)==null||a.call(n),this.close()}catch(s){alert(`Move failed: ${s instanceof Error?s.message:String(s)}`)}}handleCopyConfig(){var n,a;let e=window.getEditableObjectConfig,t=typeof e=="function"?e(this.options.objectId):null;if(!t){let s=window.__editableObjectConfigs;s&&typeof s.get=="function"&&(t=(n=s.get(this.options.objectId))!=null?n:null)}if(!t){alert("Config not found.");return}let i=JSON.stringify(t,null,2);(a=navigator.clipboard)==null||a.writeText(i).catch(()=>{alert("Failed to copy to clipboard.")}),this.close()}handleOpenInspector(){var t,i;let e=window.__previewSelectObject;typeof e=="function"&&e(this.options.objectId),(i=(t=this.options).onSelect)==null||i.call(t,this.options.objectId),this.close()}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}};var Ka=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],qt=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.templates=[];this.isLoadingTemplates=!1;this.options=e}async open(e){await this.loadTemplates(),this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}async loadTemplates(){if(!this.isLoadingTemplates){this.isLoadingTemplates=!0;try{let e=await fetch("/api/objects/templates");if(e.ok){let t=await e.json();this.templates=Array.isArray(t.templates)?t.templates:[]}}catch(e){console.warn("[AddObjectMenu] Failed to load templates:",e),this.templates=[]}finally{this.isLoadingTemplates=!1}}}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true");let t=this.templates.length>0?this.templates.map(i=>`<div class="context-menu-item" data-action="template" data-template-id="${this.escapeHtml(i.id)}">${this.escapeHtml(i.label)}</div>`).join(""):'<div class="context-menu-item disabled">No templates available</div>';e.innerHTML=`
272
272
  <div class="context-menu-section-title">Objects</div>
@@ -280,9 +280,13 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
280
280
  ${t}
281
281
  <div class="context-menu-separator"></div>
282
282
  <div class="context-menu-section-title">Systems</div>
283
+ <div class="context-menu-item" data-action="system" data-system-type="collectable-system">CollectableSystem</div>
284
+ <div class="context-menu-item" data-action="system" data-system-type="drag-snap-couples">DragSnapCouples</div>
285
+ <div class="context-menu-item" data-action="system" data-system-type="swerve-collect">SwerveCollect</div>
286
+ <div class="context-menu-item" data-action="system" data-system-type="tap-destroy">TapDestroy</div>
283
287
  <div class="context-menu-item" data-action="system" data-system-type="bullet-system">BulletSystem</div>
284
288
  <div class="context-menu-item" data-action="system" data-system-type="spawner">Spawner</div>
285
- `,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,s=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),s>0&&(this.menu.style.top=`${i-s-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let t=e.target,i=t.dataset.action;if(!i)return;e.stopPropagation();let n=t.dataset.objectType,a=t.dataset.systemType,s=t.dataset.templateId;i==="object"&&n?this.handleCreateObject(n):i==="system"&&a?this.handleCreateSystem(a):i==="template"&&s&&this.handleCreateFromTemplate(s)}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}async promptScreen(e="Select Screen"){return new Promise(t=>{var c,u,d;let i=document.createElement("div");i.className="add-menu-modal-overlay",i.innerHTML=`
289
+ `,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,s=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),s>0&&(this.menu.style.top=`${i-s-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let t=e.target,i=t.dataset.action;if(!i)return;e.stopPropagation();let n=t.dataset.objectType,a=t.dataset.systemType,s=t.dataset.templateId;i==="object"&&n?this.handleCreateObject(n):i==="system"&&a?this.handleCreateSystem(a):i==="template"&&s&&this.handleCreateFromTemplate(s)}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}async promptScreen(e="Select Screen"){return new Promise(t=>{var c,p,d;let i=document.createElement("div");i.className="add-menu-modal-overlay",i.innerHTML=`
286
290
  <div class="add-menu-modal">
287
291
  <div class="add-menu-modal-header">
288
292
  <div class="add-menu-modal-title">${this.escapeHtml(e)}</div>
@@ -291,7 +295,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
291
295
  <div class="add-menu-modal-body">
292
296
  <label class="add-menu-modal-label">Screen:</label>
293
297
  <select class="add-menu-modal-select" id="screen-select" required>
294
- ${Ka.map((p,g)=>`<option value="${this.escapeHtml(p.value)}" ${g===2?"selected":""}>${this.escapeHtml(p.label)}</option>`).join("")}
298
+ ${Ka.map((u,g)=>`<option value="${this.escapeHtml(u.value)}" ${g===2?"selected":""}>${this.escapeHtml(u.label)}</option>`).join("")}
295
299
  </select>
296
300
  </div>
297
301
  <div class="add-menu-modal-footer">
@@ -299,7 +303,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
299
303
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
300
304
  </div>
301
305
  </div>
302
- `;let n=()=>{i.parentNode&&i.parentNode.removeChild(i)},a=()=>{let g=i.querySelector("#screen-select").value.trim();if(!g||!Ka.some(f=>f.value===g)){alert("Please select a valid screen.");return}n(),t(g)},s=()=>{n(),t(null)};i.querySelector(".add-menu-modal").addEventListener("click",p=>{p.stopPropagation()}),(c=i.querySelector('[data-action="confirm"]'))==null||c.addEventListener("click",a),(u=i.querySelector('[data-action="cancel"]'))==null||u.addEventListener("click",s),(d=i.querySelector(".add-menu-modal-close"))==null||d.addEventListener("click",s),i.addEventListener("click",p=>{p.target===i&&s()});let l=i.querySelector("#screen-select");l.addEventListener("keydown",p=>{p.key==="Enter"?(p.preventDefault(),a()):p.key==="Escape"&&(p.preventDefault(),s())}),document.body.appendChild(i),l.focus()})}async promptName(e="new_object",t="Enter Object Name"){return new Promise(i=>{var u,d,p;let n=document.createElement("div");n.className="add-menu-modal-overlay",n.innerHTML=`
306
+ `;let n=()=>{i.parentNode&&i.parentNode.removeChild(i)},a=()=>{let g=i.querySelector("#screen-select").value.trim();if(!g||!Ka.some(f=>f.value===g)){alert("Please select a valid screen.");return}n(),t(g)},s=()=>{n(),t(null)};i.querySelector(".add-menu-modal").addEventListener("click",u=>{u.stopPropagation()}),(c=i.querySelector('[data-action="confirm"]'))==null||c.addEventListener("click",a),(p=i.querySelector('[data-action="cancel"]'))==null||p.addEventListener("click",s),(d=i.querySelector(".add-menu-modal-close"))==null||d.addEventListener("click",s),i.addEventListener("click",u=>{u.target===i&&s()});let l=i.querySelector("#screen-select");l.addEventListener("keydown",u=>{u.key==="Enter"?(u.preventDefault(),a()):u.key==="Escape"&&(u.preventDefault(),s())}),document.body.appendChild(i),l.focus()})}async promptName(e="new_object",t="Enter Object Name"){return new Promise(i=>{var p,d,u;let n=document.createElement("div");n.className="add-menu-modal-overlay",n.innerHTML=`
303
307
  <div class="add-menu-modal">
304
308
  <div class="add-menu-modal-header">
305
309
  <div class="add-menu-modal-title">${this.escapeHtml(t)}</div>
@@ -315,11 +319,15 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
315
319
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
316
320
  </div>
317
321
  </div>
318
- `;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},s=()=>{let f=n.querySelector("#name-input").value.trim(),h=this.sanitizeInstanceId(f);if(!h){alert("Invalid name. Use letters, numbers, dots, dashes, or underscores.");return}a(),i(h)},o=()=>{a(),i(null)};n.querySelector(".add-menu-modal").addEventListener("click",g=>{g.stopPropagation()}),(u=n.querySelector('[data-action="confirm"]'))==null||u.addEventListener("click",s),(d=n.querySelector('[data-action="cancel"]'))==null||d.addEventListener("click",o),(p=n.querySelector(".add-menu-modal-close"))==null||p.addEventListener("click",o),n.addEventListener("click",g=>{g.target===n&&o()});let c=n.querySelector("#name-input");c.addEventListener("keydown",g=>{g.key==="Enter"?(g.preventDefault(),s()):g.key==="Escape"&&(g.preventDefault(),o())}),c.select(),document.body.appendChild(n),c.focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e){var o,l,c;this.close();let t=await this.promptScreen();if(!t)return;let i=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",n=await this.promptName(i);if(!n)return;let a=n,s=this.buildDefaultConfig(e,a,n);try{let u=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,instanceId:a,objectConfigId:s.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:s})}),d=await u.json().catch(()=>({}));if(!u.ok||(d==null?void 0:d.success)===!1){let p=((o=d==null?void 0:d.errors)==null?void 0:o.join(`
319
- `))||(d==null?void 0:d.error)||"Failed to create object.";alert(p);return}window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(u){alert(`Failed to create object: ${u instanceof Error?u.message:String(u)}`)}}async handleCreateFromTemplate(e){var a,s,o;this.close();let t=await this.promptScreen();if(!t)return;let i=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",n=await this.promptName(i);if(n)try{let l=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:n,screenId:t})}),c=await l.json().catch(()=>({}));if(!l.ok||(c==null?void 0:c.success)===!1){let u=((a=c==null?void 0:c.errors)==null?void 0:a.join(`
320
- `))||(c==null?void 0:c.error)||"Failed to create from template.";alert(u);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(o=(s=this.options).onRefresh)==null||o.call(s)}catch(l){alert(`Failed to create from template: ${l instanceof Error?l.message:String(l)}`)}}async handleCreateSystem(e){var i,n,a,s,o,l;this.close();let t=await this.promptScreen();if(t){if(e==="bullet-system")try{let c=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),u=await c.json().catch(()=>({}));if(!c.ok||(u==null?void 0:u.success)===!1){let d=((i=u==null?void 0:u.errors)==null?void 0:i.join(`
321
- `))||(u==null?void 0:u.error)||"Failed to create bullet system.";alert(d);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(a=(n=this.options).onRefresh)==null||a.call(n)}catch(c){alert(`Failed to create bullet system: ${c instanceof Error?c.message:String(c)}`)}if(e==="spawner"){let c=await this.promptName("template_id","Enter Template Instance ID");if(!c)return;let u=await this.promptName(`${c}_spawner_1`,"Enter Spawner Instance ID");if(!u)return;try{let d=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,templateId:c,instanceId:u})}),p=await d.json().catch(()=>({}));if(!d.ok||(p==null?void 0:p.success)===!1){let g=((s=p==null?void 0:p.errors)==null?void 0:s.join(`
322
- `))||(p==null?void 0:p.error)||"Failed to create spawner.";alert(g);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(d){alert(`Failed to create spawner: ${d instanceof Error?d.message:String(d)}`)}}}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[AddObjectMenu] Failed to sync screens:",e)}}};var Vt=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all";this.isContextMenuOpen=!1}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
322
+ `;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},s=()=>{let f=n.querySelector("#name-input").value.trim(),h=this.sanitizeInstanceId(f);if(!h){alert("Invalid name. Use letters, numbers, dots, dashes, or underscores.");return}a(),i(h)},o=()=>{a(),i(null)};n.querySelector(".add-menu-modal").addEventListener("click",g=>{g.stopPropagation()}),(p=n.querySelector('[data-action="confirm"]'))==null||p.addEventListener("click",s),(d=n.querySelector('[data-action="cancel"]'))==null||d.addEventListener("click",o),(u=n.querySelector(".add-menu-modal-close"))==null||u.addEventListener("click",o),n.addEventListener("click",g=>{g.target===n&&o()});let c=n.querySelector("#name-input");c.addEventListener("keydown",g=>{g.key==="Enter"?(g.preventDefault(),s()):g.key==="Escape"&&(g.preventDefault(),o())}),c.select(),document.body.appendChild(n),c.focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e){var o,l,c;this.close();let t=await this.promptScreen();if(!t)return;let i=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",n=await this.promptName(i);if(!n)return;let a=n,s=this.buildDefaultConfig(e,a,n);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,instanceId:a,objectConfigId:s.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:s})}),d=await p.json().catch(()=>({}));if(!p.ok||(d==null?void 0:d.success)===!1){let u=((o=d==null?void 0:d.errors)==null?void 0:o.join(`
323
+ `))||(d==null?void 0:d.error)||"Failed to create object.";alert(u);return}window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(p){alert(`Failed to create object: ${p instanceof Error?p.message:String(p)}`)}}async handleCreateFromTemplate(e){var a,s,o;this.close();let t=await this.promptScreen();if(!t)return;let i=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",n=await this.promptName(i);if(n)try{let l=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:n,screenId:t})}),c=await l.json().catch(()=>({}));if(!l.ok||(c==null?void 0:c.success)===!1){let p=((a=c==null?void 0:c.errors)==null?void 0:a.join(`
324
+ `))||(c==null?void 0:c.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(o=(s=this.options).onRefresh)==null||o.call(s)}catch(l){alert(`Failed to create from template: ${l instanceof Error?l.message:String(l)}`)}}async handleCreateSystem(e){var i,n,a,s,o,l,c,p,d,u,g,f,h,m,b,v,y,w;this.close();let t=await this.promptScreen();if(t){if(e==="collectable-system")try{let x=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let O=((i=S==null?void 0:S.errors)==null?void 0:i.join(`
325
+ `))||(S==null?void 0:S.error)||"Failed to create collectable system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(a=(n=this.options).onRefresh)==null||a.call(n)}catch(x){alert(`Failed to create collectable system: ${x instanceof Error?x.message:String(x)}`)}if(e==="drag-snap-couples")try{let x=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let O=((s=S==null?void 0:S.errors)==null?void 0:s.join(`
326
+ `))||(S==null?void 0:S.error)||"Failed to create drag-snap system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(x){alert(`Failed to create drag-snap system: ${x instanceof Error?x.message:String(x)}`)}if(e==="swerve-collect")try{let x=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let O=((c=S==null?void 0:S.errors)==null?void 0:c.join(`
327
+ `))||(S==null?void 0:S.error)||"Failed to create swerve collect system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(d=(p=this.options).onRefresh)==null||d.call(p)}catch(x){alert(`Failed to create swerve collect system: ${x instanceof Error?x.message:String(x)}`)}if(e==="tap-destroy")try{let x=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let O=((u=S==null?void 0:S.errors)==null?void 0:u.join(`
328
+ `))||(S==null?void 0:S.error)||"Failed to create tap destroy system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(f=(g=this.options).onRefresh)==null||f.call(g)}catch(x){alert(`Failed to create tap destroy system: ${x instanceof Error?x.message:String(x)}`)}if(e==="bullet-system")try{let x=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),S=await x.json().catch(()=>({}));if(!x.ok||(S==null?void 0:S.success)===!1){let O=((h=S==null?void 0:S.errors)==null?void 0:h.join(`
329
+ `))||(S==null?void 0:S.error)||"Failed to create bullet system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(b=(m=this.options).onRefresh)==null||b.call(m)}catch(x){alert(`Failed to create bullet system: ${x instanceof Error?x.message:String(x)}`)}if(e==="spawner"){let x=await this.promptName("template_id","Enter Template Instance ID");if(!x)return;let S=await this.promptName(`${x}_spawner_1`,"Enter Spawner Instance ID");if(!S)return;try{let O=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,templateId:x,instanceId:S})}),T=await O.json().catch(()=>({}));if(!O.ok||(T==null?void 0:T.success)===!1){let _=((v=T==null?void 0:T.errors)==null?void 0:v.join(`
330
+ `))||(T==null?void 0:T.error)||"Failed to create spawner.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(w=(y=this.options).onRefresh)==null||w.call(y)}catch(O){alert(`Failed to create spawner: ${O instanceof Error?O.message:String(O)}`)}}}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[AddObjectMenu] Failed to sync screens:",e)}}};var Vt=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all";this.isContextMenuOpen=!1}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
323
331
  <div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects">
324
332
  <div class="scene-panel-header" data-panel-handle>
325
333
  <div class="panel-title">
@@ -354,7 +362,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
354
362
  </div>
355
363
  <div class="panel-resize-handle-v" data-panel-resize-v></div>
356
364
  </div>
357
- `}initialize(e,t){var a,s,o,l,c,u,d;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(s=this.root)==null?void 0:s.querySelector("#scene-object-search"),(o=this.searchInput)==null||o.addEventListener("input",()=>this.refreshObjects());let i=(l=this.root)==null?void 0:l.querySelector("[data-add-object]");i==null||i.addEventListener("click",p=>{p.stopPropagation();let g=i.getBoundingClientRect();this.openAddObjectMenu({x:g.left,y:g.bottom+4})});let n=(c=this.root)==null?void 0:c.querySelector("#scene-screen-filter");if(n){try{let p=window.localStorage.getItem(this.getScreenFilterStorageKey());p&&(this.screenFilter=p)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let p=n.value||"all";this.screenFilter=p;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()})}(u=this.root)==null||u.addEventListener("click",p=>{let g=p.target;if(!g||g.closest("[data-context-menu]"))return;let f=g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;h&&this.select(h)}),(d=this.listContainer)==null||d.addEventListener("contextmenu",p=>{var y;let g=p.target,f=g==null?void 0:g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;if(!h)return;p.preventDefault();let m=window.getEditableObjectConfig,b=typeof m=="function"?m(h):null;if(!b){let x=window.__editableObjectConfigs;x&&typeof x.get=="function"&&(b=(y=x.get(h))!=null?y:null)}let v=this.inferScreen(h,b);this.showContextMenu(h,v,p.clientX,p.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){var s,o,l,c,u;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]"),a=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&a)if(e){let d=window.getEditableObjectConfig,p=typeof d=="function"?d(e):null;if(!p){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(p=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,p),f={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((u=p==null?void 0:p.identity)==null?void 0:u.id)||e).toString(),m=this.formatDisplayName(h);n.textContent=f[g]||g,a.textContent=m,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var g;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 f=window.__editableObjectConfigs;f&&typeof f.keys=="function"&&(n=Array.from(f.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let a=(((g=this.searchInput)==null?void 0:g.value)||"").trim().toLowerCase(),s=["loading","start","gameplay","tutorial","endgame"],o=Object.fromEntries(s.map(f=>[f,[]])),l=Object.fromEntries(s.map(f=>[f,[]])),c=[];n.forEach(f=>{var w,C,E,L;let h=typeof t=="function"?t(f):null;if(!h){let k=window.__editableObjectConfigs;k&&typeof k.get=="function"&&(h=(w=k.get(f))!=null?w:null)}let m=(((C=h==null?void 0:h.identity)==null?void 0:C.category)||"scene").toString(),b=(((E=h==null?void 0:h.identity)==null?void 0:E.id)||f).toString(),v=m.toLowerCase(),y=b.toLowerCase(),x=v.includes("ui")||y.startsWith("ui")||y.includes("label"),S=v==="system",_=this.formatDisplayName(b||f),R=((L=h==null?void 0:h.render)==null?void 0:L.visible)===!1||(h==null?void 0:h.enabled)===!1,T=this.getObjectType(h),M={id:f,label:_,category:m,isUi:x,isUnused:R,objectType:T},I=this.inferScreen(M.id,h);this.screenFilter!=="all"&&I!==this.screenFilter||!(!a||M.id.toLowerCase().includes(a)||M.label.toLowerCase().includes(a))||(S?c.push(M):(M.isUnused?l:o)[I].push(M))});let u={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},d=c.length>0?this.renderSystemGroup(c):"",p=s.map(f=>this.renderGroup(u[f],[...o[f],...l[f]])).join("");if(this.listContainer.innerHTML=d+p,c.length>0){let f=this.listContainer.querySelector("[data-delete-system-group]");f==null||f.addEventListener("click",h=>{h.stopPropagation(),this.deleteSystemGroup(c)})}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 a=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${a}`.toLowerCase();return s.includes("loading")?"loading":s.includes("start")?"start":s.includes("tutorial")?"tutorial":s.includes("endgame")||s.includes("end_card")||s.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,s,o,l,c,u;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.endsWith(".json")?"animation":((o=(s=e.render)==null?void 0:s.asset)==null?void 0:o.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(u=(c=e.gameplay)==null?void 0:c.tuning)!=null&&u.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(a=>{var u,d;let s=typeof i=="function"?i(a.id):null;if(!s){let p=window.__editableObjectConfigs;p&&typeof p.get=="function"&&(s=(u=p.get(a.id))!=null?u:null)}let o=this.getTypeIconByType(a.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`
365
+ `}initialize(e,t){var a,s,o,l,c,p,d;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(s=this.root)==null?void 0:s.querySelector("#scene-object-search"),(o=this.searchInput)==null||o.addEventListener("input",()=>this.refreshObjects());let i=(l=this.root)==null?void 0:l.querySelector("[data-add-object]");i==null||i.addEventListener("click",u=>{u.stopPropagation();let g=i.getBoundingClientRect();this.openAddObjectMenu({x:g.left,y:g.bottom+4})});let n=(c=this.root)==null?void 0:c.querySelector("#scene-screen-filter");if(n){try{let u=window.localStorage.getItem(this.getScreenFilterStorageKey());u&&(this.screenFilter=u)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let u=n.value||"all";this.screenFilter=u;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()})}(p=this.root)==null||p.addEventListener("click",u=>{let g=u.target;if(!g||g.closest("[data-context-menu]"))return;let f=g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;h&&this.select(h)}),(d=this.listContainer)==null||d.addEventListener("contextmenu",u=>{var y;let g=u.target,f=g==null?void 0:g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;if(!h)return;u.preventDefault();let m=window.getEditableObjectConfig,b=typeof m=="function"?m(h):null;if(!b){let w=window.__editableObjectConfigs;w&&typeof w.get=="function"&&(b=(y=w.get(h))!=null?y:null)}let v=this.inferScreen(h,b);this.showContextMenu(h,v,u.clientX,u.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>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]"),a=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&a)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,a.textContent=m,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var g;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 f=window.__editableObjectConfigs;f&&typeof f.keys=="function"&&(n=Array.from(f.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let a=(((g=this.searchInput)==null?void 0:g.value)||"").trim().toLowerCase(),s=["loading","start","gameplay","tutorial","endgame"],o=Object.fromEntries(s.map(f=>[f,[]])),l=Object.fromEntries(s.map(f=>[f,[]])),c=[];n.forEach(f=>{var E,L,A,k;let h=typeof t=="function"?t(f):null;if(!h){let P=window.__editableObjectConfigs;P&&typeof P.get=="function"&&(h=(E=P.get(f))!=null?E:null)}let m=(((L=h==null?void 0:h.identity)==null?void 0:L.category)||"scene").toString(),b=(((A=h==null?void 0:h.identity)==null?void 0:A.id)||f).toString(),v=m.toLowerCase(),y=b.toLowerCase(),w=v.includes("ui")||y.startsWith("ui")||y.includes("label"),x=v==="system",S=this.formatDisplayName(b||f),O=((k=h==null?void 0:h.render)==null?void 0:k.visible)===!1||(h==null?void 0:h.enabled)===!1,T=this.getObjectType(h),_={id:f,label:S,category:m,isUi:w,isUnused:O,objectType:T},I=this.inferScreen(_.id,h);this.screenFilter!=="all"&&I!==this.screenFilter||!(!a||_.id.toLowerCase().includes(a)||_.label.toLowerCase().includes(a))||(x?c.push(_):(_.isUnused?l:o)[I].push(_))});let p={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},d=c.length>0?this.renderSystemGroup(c):"",u=s.map(f=>this.renderGroup(p[f],[...o[f],...l[f]])).join("");if(this.listContainer.innerHTML=d+u,c.length>0){let f=this.listContainer.querySelector("[data-delete-system-group]");f==null||f.addEventListener("click",h=>{h.stopPropagation(),this.deleteSystemGroup(c)})}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 a=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${a}`.toLowerCase();return s.includes("loading")?"loading":s.includes("start")?"start":s.includes("tutorial")?"tutorial":s.includes("endgame")||s.includes("end_card")||s.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,s,o,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.endsWith(".json")?"animation":((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(a=>{var p,d;let s=typeof i=="function"?i(a.id):null;if(!s){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(s=(p=u.get(a.id))!=null?p:null)}let o=this.getTypeIconByType(a.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`
358
366
  <button class="scene-object-item ${a.isUnused?"unused":""}" data-object-id="${a.id}">
359
367
  <span class="scene-object-label">${a.label}</span>
360
368
  ${c?`<span class="scene-object-text-preview">${c}</span>`:""}
@@ -367,7 +375,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
367
375
  ${n}
368
376
  </div>
369
377
  </div>
370
- `}renderSystemGroup(e){if(!e.length)return"";let t=window.getEditableObjectConfig,i=e.map(n=>{var c,u;let a=typeof t=="function"?t(n.id):null;if(!a){let d=window.__editableObjectConfigs;d&&typeof d.get=="function"&&(a=(c=d.get(n.id))!=null?c:null)}let s=this.getTypeIconByType(n.objectType),o=this.getAssetPreview(a),l=(u=a==null?void 0:a.ui)!=null&&u.text?`"${a.ui.text.substring(0,12)}${a.ui.text.length>12?"...":""}"`:"";return`
378
+ `}renderSystemGroup(e){if(!e.length)return"";let t=window.getEditableObjectConfig,i=e.map(n=>{var c,p;let a=typeof t=="function"?t(n.id):null;if(!a){let d=window.__editableObjectConfigs;d&&typeof d.get=="function"&&(a=(c=d.get(n.id))!=null?c:null)}let s=this.getTypeIconByType(n.objectType),o=this.getAssetPreview(a),l=(p=a==null?void 0:a.ui)!=null&&p.text?`"${a.ui.text.substring(0,12)}${a.ui.text.length>12?"...":""}"`:"";return`
371
379
  <button class="scene-object-item ${n.isUnused?"unused":""}" data-object-id="${n.id}">
372
380
  <span class="scene-object-label">${n.label}</span>
373
381
  ${l?`<span class="scene-object-text-preview">${l}</span>`:""}
@@ -384,14 +392,26 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
384
392
  </div>
385
393
  </div>
386
394
  `}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var i,n,a,s,o,l;if(!e)return"\u{1F4E6}";if((i=e.render)!=null&&i.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((n=e.ui)!=null&&n.text)return"\u{1F4DD}";if(((a=e.identity)==null?void 0:a.category)==="ui")return"\u{1F3A8}";if(e.effects||(o=(s=e.identity)==null?void 0:s.id)!=null&&o.includes("effect"))return"\u2728";if(e.audio)return"\u{1F50A}";let t=((l=e.identity)==null?void 0:l.id)||"";return t.includes("background")?"\u{1F5BC}\uFE0F":t.includes("character")?"\u{1F464}":t.includes("key")?"\u{1F511}":t.includes("draggable")?"\u{1F3AF}":t.includes("machine")?"\u2699\uFE0F":t.includes("tutorial")||t.includes("hand")?"\u{1F446}":"\u{1F4E6}"}getAssetPreview(e){var i;if(!e)return null;let t=(i=e.render)==null?void 0:i.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var i,n,a,s;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((a=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:a.panel_bg_color)||((s=e.ui)==null?void 0:s.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var i,n,a,s;if(!e)return"";let t=[];return((i=e.render)==null?void 0:i.visible)===!1&&t.push("hidden"),((n=e.render)==null?void 0:n.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((a=e.interaction)!=null&&a.clickable||(s=e.ui)!=null&&s.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t;this.selectedId=e,this.setSelected(e),(t=this.options)==null||t.onSelect(e)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectMenu(e){try{await new qt({onRefresh:()=>this.refreshObjects(),onClose:()=>{}}).open(e)}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectMenu:",t)}}async openAddObjectWizard(e){try{new Ut().open({screenId:e})}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectWizard:",t)}}async showContextMenu(e,t,i,n){if(!this.isContextMenuOpen){this.isContextMenuOpen=!0;try{new Gt({objectId:e,screenId:t,onSelect:s=>{s&&this.select(s)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:s=>this.deleteObject(s)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var i;if(window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))try{let n=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e})}),a=await n.json().catch(()=>null);if(!n.ok||(a==null?void 0:a.success)===!1){let s=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
387
- `))||(a==null?void 0:a.error)||"Delete failed.";alert(s);return}await this.syncScreens(),this.refreshObjects()}catch(n){alert(`Delete failed: ${n instanceof Error?n.message:String(n)}`)}}async deleteSystemGroup(e){var l;let t=e.length;if(!window.confirm(`Delete all ${t} system object${t!==1?"s":""}? This will remove them from all screens.`))return;let n=e.map(c=>c.id),a=0,s=0,o=[];for(let c of n)try{let u=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:c})}),d=await u.json().catch(()=>null);if(u.ok&&(d==null?void 0:d.success)!==!1)a++;else{s++;let p=((l=d==null?void 0:d.errors)==null?void 0:l.join(`
388
- `))||(d==null?void 0:d.error)||"Delete failed.";o.push(`${c}: ${p}`)}}catch(u){s++,o.push(`${c}: ${u instanceof Error?u.message:String(u)}`)}if(s>0){let c=o.length>0?o.join(`
395
+ `))||(a==null?void 0:a.error)||"Delete failed.";alert(s);return}await this.syncScreens(),this.refreshObjects()}catch(n){alert(`Delete failed: ${n instanceof Error?n.message:String(n)}`)}}async deleteSystemGroup(e){var l;let t=e.length;if(!window.confirm(`Delete all ${t} system object${t!==1?"s":""}? This will remove them from all screens.`))return;let n=e.map(c=>c.id),a=0,s=0,o=[];for(let c of n)try{let p=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:c})}),d=await p.json().catch(()=>null);if(p.ok&&(d==null?void 0:d.success)!==!1)a++;else{s++;let u=((l=d==null?void 0:d.errors)==null?void 0:l.join(`
396
+ `))||(d==null?void 0:d.error)||"Delete failed.";o.push(`${c}: ${u}`)}}catch(p){s++,o.push(`${c}: ${p instanceof Error?p.message:String(p)}`)}if(s>0){let c=o.length>0?o.join(`
389
397
  `):`${s} object(s) failed to delete.`;alert(`Deleted ${a} object(s). Errors:
390
- ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[SceneObjectsPanel] Failed to sync screens:",e)}}};var Yt=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
398
+ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[SceneObjectsPanel] Failed to sync screens:",e)}}};var Yt=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1;this.hasUnsavedChanges=!1}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}render(){let e=Be();return this.hasUnsavedChanges=e.hasChanges,`
391
399
  <div class="scene-tools-corner-panel ${this.isCollapsed?"collapsed":""}" data-panel="scene-tools-corner">
392
400
  <div class="scene-tools-header" data-tools-header data-panel-handle>
393
- <span class="scene-tools-title">Scene Tools</span>
401
+ <div class="scene-tools-title-wrapper">
402
+ <span class="scene-tools-title">Scene Tools${this.hasUnsavedChanges?'<span class="scene-tools-unsaved-star">\u2B50</span>':""}</span>
403
+ </div>
394
404
  <div class="scene-tools-header-actions">
405
+ ${this.hasUnsavedChanges?`
406
+ <button class="scene-tools-save-btn" data-scene-tools-save type="button" title="Save changes (${this.getShortcutKey()} + S)">
407
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
408
+ <path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path>
409
+ <polyline points="17 21 17 13 7 13 7 21"></polyline>
410
+ <polyline points="7 3 7 8 15 8"></polyline>
411
+ </svg>
412
+ <span class="scene-tools-save-text">Save <span class="scene-tools-save-shortcut">(${this.getShortcutKey()} + S)</span></span>
413
+ </button>
414
+ `:""}
395
415
  <div class="scene-tools-status-icons" data-status-icons>
396
416
  <span class="status-icon" data-status="bounds" title="Highlight Bounds">
397
417
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
@@ -432,7 +452,16 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
432
452
  </div>
433
453
  </div>
434
454
  </div>
435
- `}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 a=(c,u)=>{var p;let d=(p=this.root)==null?void 0:p.querySelector(`[data-status="${c}"]`);d&&d.classList.toggle("active",u)},s=this.root.querySelector("#debug-highlight-object");s==null||s.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightObject(!!s.checked),a("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),a("anchor",o.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{a("nudge",l.checked)})}updateInfo(e){}};var Wt=class{constructor(){this.root=null;this.options=null}render(){return`
455
+ `}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)),window.addEventListener("config:changed",()=>{this.refreshUnsavedState()}),this.refreshUnsavedState();let n=this.root.querySelector("[data-scene-tools-save]");n==null||n.addEventListener("click",()=>{let p=document.querySelector("#apply-current-btn");p&&p.getAttribute("disabled")===null&&p.click()});let a=this.root.querySelector("[data-tools-collapse]");a==null||a.addEventListener("click",()=>{var p;this.isCollapsed=!this.isCollapsed,(p=this.root)==null||p.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let s=(p,d)=>{var g;let u=(g=this.root)==null?void 0:g.querySelector(`[data-status="${p}"]`);u&&u.classList.toggle("active",d)},o=this.root.querySelector("#debug-highlight-object");o==null||o.addEventListener("change",()=>{var p;(p=this.options)==null||p.onHighlightObject(!!o.checked),s("bounds",o.checked)});let l=this.root.querySelector("#debug-highlight-anchor");l==null||l.addEventListener("change",()=>{var p;(p=this.options)==null||p.onHighlightAnchor(!!l.checked),s("anchor",l.checked)});let c=this.root.querySelector("#debug-nudge-enabled");c==null||c.addEventListener("change",()=>{s("nudge",c.checked)})}refreshUnsavedState(){if(!this.root)return;let t=Be().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.root.querySelector("[data-tools-header]");if(i){let n=i.querySelector(".scene-tools-title-wrapper"),a=i.querySelector(".scene-tools-header-actions");if(n&&(n.innerHTML=`
456
+ <span class="scene-tools-title">Scene Tools${this.hasUnsavedChanges?'<span class="scene-tools-unsaved-star">\u2B50</span>':""}</span>
457
+ `),a){let s=a.querySelector("[data-status-icons]"),o=a.querySelector("[data-tools-collapse]");if(this.hasUnsavedChanges){if(!a.querySelector("[data-scene-tools-save]")){let c=document.createElement("button");c.className="scene-tools-save-btn",c.setAttribute("data-scene-tools-save",""),c.type="button";let p=this.getShortcutKey();c.title=`Save changes (${p} + S)`,c.innerHTML=`
458
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
459
+ <path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path>
460
+ <polyline points="17 21 17 13 7 13 7 21"></polyline>
461
+ <polyline points="7 3 7 8 15 8"></polyline>
462
+ </svg>
463
+ <span class="scene-tools-save-text">Save <span class="scene-tools-save-shortcut">(${p} + S)</span></span>
464
+ `,c.addEventListener("click",()=>{let d=document.querySelector("#apply-current-btn");d&&d.getAttribute("disabled")===null&&d.click()}),s&&s.parentElement&&s.parentElement.insertBefore(c,s)}}else{let l=a.querySelector("[data-scene-tools-save]");l==null||l.remove()}}}}}updateInfo(e){}};var Wt=class{constructor(){this.root=null;this.options=null}render(){return`
436
465
  <div class="nudge-panel hidden" data-panel="nudge-panel">
437
466
  <div class="nudge-panel-header" data-panel-handle>
438
467
  <span class="nudge-panel-title">Nudge Controls</span>
@@ -489,7 +518,7 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
489
518
  </div>
490
519
  </div>
491
520
  </div>
492
- `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(a=>{a.addEventListener("click",()=>{var l,c,u,d;let s=a.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":(u=this.options)==null||u.onNudge(-o,0);break;case"right":(d=this.options)==null||d.onNudge(o,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(a=>{a.addEventListener("click",()=>{var l;let o=a.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 ht=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||{},a={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},s=Array.isArray(i.slots)?i.slots:[];if(s.length>0&&a.slots.length>0)for(let c of a.slots){let u=s.find(d=>(d==null?void 0:d.slotId)&&d.slotId===(c==null?void 0:c.slotId));u!=null&&u.currentAsset&&u.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=u.currentAsset)}let o=i.libraryAssets||{};for(let[c,u]of Object.entries(o)){if(!Array.isArray(u))continue;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let d=new Set((a.libraryAssets[c]||[]).map(p=>p==null?void 0:p.filename));for(let p of u){let g=p==null?void 0:p.filename;!g||d.has(g)||(a.libraryAssets[c].unshift(p),d.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
521
+ `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(a=>{a.addEventListener("click",()=>{var l,c,p,d;let s=a.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(a=>{a.addEventListener("click",()=>{var l;let o=a.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 ft=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||{},a={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},s=Array.isArray(i.slots)?i.slots:[];if(s.length>0&&a.slots.length>0)for(let c of a.slots){let 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;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let d=new Set((a.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)||(a.libraryAssets[c].unshift(u),d.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
493
522
  <div class="scene-panel library-panel panel-accent-purple" data-panel="library">
494
523
  <div class="scene-panel-header" data-panel-handle>
495
524
  <div class="panel-title">
@@ -508,7 +537,7 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
508
537
  </div>
509
538
  <div class="panel-resize-handle" data-panel-resize></div>
510
539
  </div>
511
- `}initialize(e,t){var a,s,o;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.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(),a=this.mergeRegistries(t,n);window.getEditableAssets=()=>a,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}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 a=document.createElement("div");a.className="library-category";let s=document.createElement("div");s.className="library-category-header",s.textContent=this.formatCategoryName(i),a.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)}a.appendChild(o),this.slotsContainer.appendChild(a)}}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 a=document.createElement("div");a.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),a.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 u=document.createElement("div");u.className="slot-asset",u.textContent=e.currentAsset,l.appendChild(c),l.appendChild(u),a.appendChild(l);let d=document.createElement("div");d.className="slot-actions";let p=document.createElement("button");p.className="slot-ai-edit",p.title="Edit with AI",p.textContent="\u2728 AI",p.addEventListener("click",async m=>{m.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(p);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),d.appendChild(g);let f=document.createElement("button");f.className="slot-reset",f.title="Reset to default",f.textContent="\u21BA",f.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),d.appendChild(f);let h=document.createElement("span");if(h.className="slot-expand-icon",h.textContent=i?"\u25BC":"\u25B6",d.appendChild(h),a.appendChild(d),a.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(a),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var a;let i=document.createElement("div");i.className="slot-library";let n=((a=this.registry)==null?void 0:a.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 u=document.createElement("div");u.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"},u.appendChild(d);let p=document.createElement("div");p.className="library-label",p.textContent=c.displayName,u.appendChild(p),u.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(u)}}),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(),a=[],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," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let a=`raw/library/${e.libraryFolder}/${t}`;n.onPick(a),window.__wizardAssetPicker=null;return}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.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let a=await this.fileToDataUrl(i);if(!a){alert("Failed to read file");return}let o=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",o,"to category:",l);let u=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${o}.png`,data:a,overwrite:!0})})).json();if(u.success){console.log("[Library] \u2705 Upload saved:",u.path);let d=window.addAssetToRegistry;typeof d=="function"&&d(l,`${o}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(p){console.warn("[Library] Setup-library not available:",p)}await this.handleApply(e,`${o}.png`),e.currentAsset=`${o}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",u.error),alert(`Upload failed: ${u.error}`)}catch(a){console.error("[Library] \u274C Upload error:",a),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var s;let a=(s=this.slotsContainer)==null?void 0:s.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Kt=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 Xt=class{render(e,t,i,n){let a=this.formatLabel(t),s=i?this.getThumbnailUrl(i):"";return`
540
+ `}initialize(e,t){var a,s,o;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.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(),a=this.mergeRegistries(t,n);window.getEditableAssets=()=>a,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}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 a=document.createElement("div");a.className="library-category";let s=document.createElement("div");s.className="library-category-header",s.textContent=this.formatCategoryName(i),a.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)}a.appendChild(o),this.slotsContainer.appendChild(a)}}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 a=document.createElement("div");a.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),a.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),a.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 m=>{m.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),d.appendChild(g);let f=document.createElement("button");f.className="slot-reset",f.title="Reset to default",f.textContent="\u21BA",f.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),d.appendChild(f);let h=document.createElement("span");if(h.className="slot-expand-icon",h.textContent=i?"\u25BC":"\u25B6",d.appendChild(h),a.appendChild(d),a.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(a),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var a;let i=document.createElement("div");i.className="slot-library";let n=((a=this.registry)==null?void 0:a.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(),a=[],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," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let a=`raw/library/${e.libraryFolder}/${t}`;n.onPick(a),window.__wizardAssetPicker=null;return}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.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let a=await this.fileToDataUrl(i);if(!a){alert("Failed to read file");return}let o=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",o,"to category:",l);let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${o}.png`,data:a,overwrite:!0})})).json();if(p.success){console.log("[Library] \u2705 Upload saved:",p.path);let d=window.addAssetToRegistry;typeof d=="function"&&d(l,`${o}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(u){console.warn("[Library] Setup-library not available:",u)}await this.handleApply(e,`${o}.png`),e.currentAsset=`${o}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",p.error),alert(`Upload failed: ${p.error}`)}catch(a){console.error("[Library] \u274C Upload error:",a),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var s;let a=(s=this.slotsContainer)==null?void 0:s.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Kt=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 Xt=class{render(e,t,i,n){let a=this.formatLabel(t),s=i?this.getThumbnailUrl(i):"";return`
512
541
  <div class="inspector-property" data-property-type="image">
513
542
  <div class="inspector-property-header">
514
543
  <label class="inspector-label">${a}</label>
@@ -578,42 +607,42 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
578
607
  <span>${this.formatLabel(t)}</span>
579
608
  </label>
580
609
  </div>
581
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ti=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let s=Array.isArray(i)?i:[],o=s.map((c,u)=>{let d=`${n}.${u}`,p=`
610
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ti=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let s=this.registry,o=Array.isArray(i)?i:[],l=o.map((p,d)=>{let u=`${n}.${d}`,g=`
582
611
  <button class="inspector-button inspector-button-small"
583
612
  data-logic-remove="true"
584
613
  data-object-id="${e}"
585
614
  data-property-path="${n}"
586
- data-index="${u}">
615
+ data-index="${d}">
587
616
  Remove
588
617
  </button>
589
- `;if(c&&typeof c=="object"&&!Array.isArray(c)){let f=this.registry.renderProperty(e,"logic",c,d);return`
590
- <div class="inspector-array-item inspector-logic-item">
591
- <div class="inspector-array-item-header">
592
- <span>Logic ${u+1}</span>
593
- ${p}
618
+ `;if(p&&typeof p=="object"&&!Array.isArray(p)){let h=s.renderProperty(e,"logic",p,u);return`
619
+ <div class="inspector-array-item inspector-logic-item">
620
+ <div class="inspector-array-item-header">
621
+ <span>Logic ${d+1}</span>
622
+ ${g}
594
623
  </div>
595
624
  <div class="inspector-array-item-body">
596
- ${f}
625
+ ${h}
597
626
  </div>
598
627
  </div>
599
- `}let g=typeof c=="string"?c:JSON.stringify(c);return`
628
+ `}let f=typeof p=="string"?p:JSON.stringify(p);return`
600
629
  <div class="inspector-array-item inspector-logic-item">
601
630
  <div class="inspector-array-item-header">
602
- <span>Logic ${u+1}</span>
603
- ${p}
631
+ <span>Logic ${d+1}</span>
632
+ ${g}
604
633
  <button class="inspector-button inspector-button-small"
605
634
  data-logic-convert="true"
606
635
  data-object-id="${e}"
607
636
  data-property-path="${n}"
608
- data-index="${u}">
637
+ data-index="${d}">
609
638
  Convert
610
639
  </button>
611
640
  </div>
612
641
  <div class="inspector-array-item-body inspector-array-item-raw">
613
- ${g}
642
+ ${f}
614
643
  </div>
615
644
  </div>
616
- `}).join(""),l=`
645
+ `}).join(""),c=`
617
646
  <button class="inspector-button"
618
647
  data-logic-add="true"
619
648
  data-object-id="${e}"
@@ -622,12 +651,12 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
622
651
  </button>
623
652
  `;return`
624
653
  <div class="inspector-property inspector-property-array">
625
- <label class="inspector-property-label">${this.formatLabel(t)} (${s.length} items)</label>
654
+ <label class="inspector-property-label">${this.formatLabel(t)} (${o.length} items)</label>
626
655
  <div class="inspector-array-list">
627
- ${o||'<div class="inspector-array-empty">Empty array</div>'}
656
+ ${l||'<div class="inspector-array-empty">Empty array</div>'}
628
657
  </div>
629
658
  <div class="inspector-array-actions">
630
- ${l}
659
+ ${c}
631
660
  </div>
632
661
  </div>
633
662
  `}if(!Array.isArray(i)||i.length===0)return`
@@ -642,7 +671,7 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
642
671
  ${a}
643
672
  </div>
644
673
  </div>
645
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ii=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&i&&typeof i=="object"&&!Array.isArray(i))return this.renderLogic(e,t,i,n);let a=[];for(let o in i){let l=i[o],c=`${n}.${o}`,u=this.registry.renderProperty(e,o,l,c);u&&a.push(u)}return a.length===0?"":a.length<=4&&a.every(o=>o.includes("inspector-property"))?`
674
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ii=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&i&&typeof i=="object"&&!Array.isArray(i))return this.renderLogic(e,t,i,n);let a=[];for(let o in i){let l=i[o],c=`${n}.${o}`,p=this.registry.renderProperty(e,o,l,c);p&&a.push(p)}return a.length===0?"":a.length<=4&&a.every(o=>o.includes("inspector-property"))?`
646
675
  <div class="inspector-subsection">
647
676
  <div class="inspector-subsection-title">${this.formatLabel(t)}</div>
648
677
  <div class="inspector-subsection-content">
@@ -656,7 +685,7 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
656
685
  ${a.join("")}
657
686
  </div>
658
687
  </div>
659
- `}renderLogic(e,t,i,n){let a=[],s=typeof(i==null?void 0:i.id)=="string"?i.id:"",o={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let p=window,g=Array.isArray(p==null?void 0:p.__HANDLER_LOGIC_OPTIONS)?p.__HANDLER_LOGIC_OPTIONS:[],h=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(m=>String(m)).filter(m=>m.trim().length>0);return Array.from(new Set(h)).sort((m,b)=>m.localeCompare(b))})(),c=s&&!l.includes(s)?[s,...l]:l;a.push(`
688
+ `}renderLogic(e,t,i,n){let a=[],s=typeof(i==null?void 0:i.id)=="string"?i.id:"",o={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let u=window,g=Array.isArray(u==null?void 0:u.__HANDLER_LOGIC_OPTIONS)?u.__HANDLER_LOGIC_OPTIONS:[],h=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(m=>String(m)).filter(m=>m.trim().length>0);return Array.from(new Set(h)).sort((m,b)=>m.localeCompare(b))})(),c=s&&!l.includes(s)?[s,...l]:l;a.push(`
660
689
  <div class="inspector-property inspector-property-text">
661
690
  <label class="inspector-property-label">Id</label>
662
691
  <div class="inspector-input-group">
@@ -665,41 +694,41 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
665
694
  data-object-id="${e}"
666
695
  data-logic-id-selector="true">
667
696
  <option value="" ${s?"":"selected"}>None</option>
668
- ${c.map(p=>`<option value="${p}" ${p===s?"selected":""}>${p}</option>`).join("")}
697
+ ${c.map(u=>`<option value="${u}" ${u===s?"selected":""}>${u}</option>`).join("")}
669
698
  </select>
670
699
  </div>
671
700
  </div>
672
- `);for(let p in i){if(p==="id")continue;let g=i[p],f=`${n}.${p}`;if(p==="props"&&g&&typeof g=="object"){let m=[];for(let b in g){let v=g[b],y=`${f}.${b}`,x=o[b];if(b==="targetId"||b==="inputId"){let S=this.registry.getObjectIds(),_=typeof v=="string"?v:"",R=_&&!S.includes(_)?[_,...S]:S;m.push(`
701
+ `);for(let u in i){if(u==="id")continue;let g=i[u],f=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let m=[];for(let b in g){let v=g[b],y=`${f}.${b}`,w=o[b];if(b==="targetId"||b==="inputId"){let x=this.registry.getObjectIds(),S=typeof v=="string"?v:"",O=S&&!x.includes(S)?[S,...x]:x;m.push(`
673
702
  <div class="inspector-property inspector-property-text">
674
703
  <label class="inspector-property-label">${this.formatLabel(b)}</label>
675
704
  <div class="inspector-input-group">
676
705
  <select class="inspector-component-select inspector-input"
677
706
  data-property-path="${y}"
678
707
  data-object-id="${e}">
679
- <option value="" ${_?"":"selected"}>None</option>
680
- ${R.map(T=>`<option value="${T}" ${T===_?"selected":""}>${T}</option>`).join("")}
708
+ <option value="" ${S?"":"selected"}>None</option>
709
+ ${O.map(T=>`<option value="${T}" ${T===S?"selected":""}>${T}</option>`).join("")}
681
710
  </select>
682
711
  </div>
683
712
  </div>
684
- `);continue}if(Array.isArray(x)&&x.length)m.push(`
713
+ `);continue}if(Array.isArray(w)&&w.length)m.push(`
685
714
  <div class="inspector-property inspector-property-text">
686
715
  <label class="inspector-property-label">${this.formatLabel(b)}</label>
687
716
  <div class="inspector-input-group">
688
717
  <select class="inspector-component-select inspector-input"
689
718
  data-property-path="${y}"
690
719
  data-object-id="${e}">
691
- ${x.map(S=>`<option value="${String(S)}" ${String(S)===String(v)?"selected":""}>${String(S)}</option>`).join("")}
720
+ ${w.map(x=>`<option value="${String(x)}" ${String(x)===String(v)?"selected":""}>${String(x)}</option>`).join("")}
692
721
  </select>
693
722
  </div>
694
723
  </div>
695
- `);else{let S=this.registry.renderProperty(e,b,v,y);S&&m.push(S)}}m.length&&a.push(`
724
+ `);else{let x=this.registry.renderProperty(e,b,v,y);x&&m.push(x)}}m.length&&a.push(`
696
725
  <div class="inspector-property inspector-property-object">
697
726
  <div class="inspector-object-header">Props</div>
698
727
  <div class="inspector-object-body">
699
728
  ${m.join("")}
700
729
  </div>
701
730
  </div>
702
- `);continue}let h=this.registry.renderProperty(e,p,g,f);h&&a.push(h)}if(a.length===0)return"";let d=/(^|\.)logic\.\d+$/.test(n)?"":`
731
+ `);continue}let h=this.registry.renderProperty(e,u,g,f);h&&a.push(h)}if(a.length===0)return"";let d=/(^|\.)logic\.\d+$/.test(n)?"":`
703
732
  <div class="inspector-array-actions" style="margin-top: 12px;">
704
733
  <button class="inspector-button"
705
734
  data-logic-add="true"
@@ -739,7 +768,7 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
739
768
  rows="6">${a}</textarea>
740
769
  </div>
741
770
  </div>
742
- `}safeStringify(e){try{return JSON.stringify(e!=null?e:[],null,2)}catch{return"[]"}}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ri=class{render(e,t,i,n){let s=(Array.isArray(i)?i:[]).map((o,l)=>{let c=typeof(o==null?void 0:o.x)=="number"?o.x:0,u=typeof(o==null?void 0:o.y)=="number"?o.y:0;return`
771
+ `}safeStringify(e){try{return JSON.stringify(e!=null?e:[],null,2)}catch{return"[]"}}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ri=class{render(e,t,i,n){let s=(Array.isArray(i)?i:[]).map((o,l)=>{let c=typeof(o==null?void 0:o.x)=="number"?o.x:0,p=typeof(o==null?void 0:o.y)=="number"?o.y:0;return`
743
772
  <div class="inspector-row" style="gap:8px; align-items:center;">
744
773
  <input type="number"
745
774
  class="inspector-input"
@@ -748,7 +777,7 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
748
777
  data-object-id="${e}" />
749
778
  <input type="number"
750
779
  class="inspector-input"
751
- value="${u}"
780
+ value="${p}"
752
781
  data-property-path="${n}.${l}.y"
753
782
  data-object-id="${e}" />
754
783
  <button type="button"
@@ -772,26 +801,26 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
772
801
  </div>
773
802
  </div>
774
803
  </div>
775
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var si=class{constructor(e){this.registry=e}render(e,t,i,n){let a=Array.isArray(i)?i:[],o=["",...this.registry.getObjectIds()],l=a.map((c,u)=>{let d=typeof(c==null?void 0:c.templateId)=="string"?c.templateId:"",p=typeof(c==null?void 0:c.weight)=="number"?c.weight:1,g=o.map(f=>`<option value="${f}"${f===d?" selected":""}>${f||"(none)"}</option>`).join("");return`
804
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var si=class{constructor(e){this.registry=e}render(e,t,i,n){let a=Array.isArray(i)?i:[],o=["",...this.registry.getObjectIds()],l=a.map((c,p)=>{let d=typeof(c==null?void 0:c.templateId)=="string"?c.templateId:"",u=typeof(c==null?void 0:c.weight)=="number"?c.weight:1,g=o.map(f=>`<option value="${f}"${f===d?" selected":""}>${f||"(none)"}</option>`).join("");return`
776
805
  <div class="inspector-row" style="gap:8px; align-items:center;">
777
806
  <select class="inspector-select inspector-input"
778
- data-property-path="${n}.${u}.templateId"
807
+ data-property-path="${n}.${p}.templateId"
779
808
  data-object-id="${e}">
780
809
  ${g}
781
810
  </select>
782
811
  <input type="number"
783
812
  class="inspector-input"
784
813
  style="width:72px;"
785
- value="${p}"
814
+ value="${u}"
786
815
  placeholder="weight"
787
- data-property-path="${n}.${u}.weight"
816
+ data-property-path="${n}.${p}.weight"
788
817
  data-object-id="${e}" />
789
818
  <button type="button"
790
819
  class="inspector-btn inspector-btn-sm"
791
820
  data-spawntemplates-remove="true"
792
821
  data-object-id="${e}"
793
822
  data-property-path="${n}"
794
- data-index="${u}">Remove</button>
823
+ data-index="${p}">Remove</button>
795
824
  </div>
796
825
  `}).join("");return`
797
826
  <div class="inspector-property inspector-property-object">
@@ -807,7 +836,7 @@ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{aw
807
836
  </div>
808
837
  </div>
809
838
  </div>
810
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var oi=class{constructor(){this.typeDetector=new Kt,this.imageRenderer=new Xt,this.colorRenderer=new Jt,this.numberRenderer=new Zt,this.textRenderer=new Qt,this.booleanRenderer=new ei,this.arrayRenderer=new ti(this),this.objectRenderer=new ii(this),this.selectRenderer=new ni,this.jsonRenderer=new ai,this.spawnPointsRenderer=new ri,this.spawnTemplatesRenderer=new si(this)}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,a=n==null?void 0:n.schemas;if(!a)return null;let s=String(e||"").split(".").filter(Boolean);if(s.length<2)return null;let o=s[0],l=s.slice(1).join("."),c=a instanceof Map?a.get(o):a==null?void 0:a[o];if(!c)return null;let u=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof u!="string"||!u.startsWith("enum:"))return null;let p=u.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return p.length?p:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,s)=>a.localeCompare(s))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),s=a==="logic"||a==="logic_id"||a==="logicid",o=a==="id"&&n.toLowerCase().includes("logic");if((s||o)&&typeof i=="string"){let f=this.getLogicOptions(),h=this.selectRenderer.render(e,t,i,n,f);return s?`
839
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var oi=class{constructor(){this.typeDetector=new Kt,this.imageRenderer=new Xt,this.colorRenderer=new Jt,this.numberRenderer=new Zt,this.textRenderer=new Qt,this.booleanRenderer=new ei,this.arrayRenderer=new ti(this),this.objectRenderer=new ii(this),this.selectRenderer=new ni,this.jsonRenderer=new ai,this.spawnPointsRenderer=new ri,this.spawnTemplatesRenderer=new si(this)}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,a=n==null?void 0:n.schemas;if(!a)return null;let s=String(e||"").split(".").filter(Boolean);if(s.length<2)return null;let o=s[0],l=s.slice(1).join("."),c=a instanceof Map?a.get(o):a==null?void 0:a[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(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,s)=>a.localeCompare(s))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),s=a==="logic"||a==="logic_id"||a==="logicid",o=a==="id"&&n.toLowerCase().includes("logic");if((s||o)&&typeof i=="string"){let f=this.getLogicOptions(),h=this.selectRenderer.render(e,t,i,n,f);return s?`
811
840
  ${h}
812
841
  <div class="inspector-array-actions">
813
842
  <button class="inspector-button"
@@ -817,7 +846,7 @@ ${h}
817
846
  Add Logic
818
847
  </button>
819
848
  </div>
820
- `:h}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},u=l[t];if(u&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,u);let d=c[t];if(d&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let f=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,f,n,d)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let f=this.getObjectIds(),h=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...f]);return t==="hitTemplateId"&&n.includes("logic.props")?h+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':h}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let h=["1","-1"],m=i==null?"1":String(i);return this.selectRenderer.render(e,t,m,n,h)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let h=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,h,n)}}let p=this.getEnumOptionsFromSchemas(n);if(p)return this.selectRenderer.render(e,t,i,n,p);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function gs(r,e){let t;return function(...n){let a=()=>{clearTimeout(t),r(...n)};clearTimeout(t),t=setTimeout(a,e)}}var li=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new oi,this.updateManager=new Ke,this.quickActions=new Bt;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
849
+ `:h}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},p=l[t];if(p&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,p);let d=c[t];if(d&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let f=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,f,n,d)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let f=this.getObjectIds(),h=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...f]);return t==="hitTemplateId"&&n.includes("logic.props")?h+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':h}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let h=["1","-1"],m=i==null?"1":String(i);return this.selectRenderer.render(e,t,m,n,h)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let h=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,h,n)}}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function gs(r,e){let t;return function(...n){let a=()=>{clearTimeout(t),r(...n)};clearTimeout(t),t=setTimeout(a,e)}}var li=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new oi,this.updateManager=new Xe,this.quickActions=new Bt;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
821
850
  <div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
822
851
  <div class="scene-panel-header" data-panel-handle>
823
852
  <div class="panel-title">
@@ -846,7 +875,7 @@ ${h}
846
875
  </div>
847
876
  ${this.renderConversionButtons(e,t)}
848
877
  </div>
849
- `);let o=["transform","ui","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(),this.expandMotionOnNextRender=!1}renderConversionButtons(e,t){var o,l,c,u;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=(u=t.ui)!=null&&u.text?"ui.text":"render.asset.path";return`
878
+ `);let o=["transform","ui","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(),this.expandMotionOnNextRender=!1}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`
850
879
  <div class="inspector-quick-actions">
851
880
  <button class="debug-btn debug-btn-sm success ai-simple-btn" type="button" data-convert-toggle>
852
881
  \u2728 Convert to PNG
@@ -867,7 +896,7 @@ ${h}
867
896
  <button class="debug-btn debug-btn-sm primary" data-inspector-add-component-btn>Add</button>
868
897
  </div>
869
898
  </div>
870
- `}renderSection(e,t,i,n){if(t==="motion")return this.renderMotionSection(e,i,n);if(t==="logic")return this.renderLogicSection(e,i,n);let a=[],s=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let c in i){if(!this.showAdvanced&&s.includes(c))continue;let u=i[c],d=`${n}.${c}`,p=this.rendererRegistry.renderProperty(e,c,u,d);p&&a.push(p)}return a.length===0?"":`
899
+ `}renderSection(e,t,i,n){if(t==="motion")return this.renderMotionSection(e,i,n);if(t==="logic")return this.renderLogicSection(e,i,n);let a=[],s=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let c in i){if(!this.showAdvanced&&s.includes(c))continue;let p=i[c],d=`${n}.${c}`,u=this.rendererRegistry.renderProperty(e,c,p,d);u&&a.push(u)}return a.length===0?"":`
871
900
  <div class="inspector-section ${t==="transform"?"":"collapsed"}" data-section="${t}">
872
901
  <div class="inspector-section-header" data-section-toggle="${t}">
873
902
  <span class="inspector-section-arrow">\u25BC</span>
@@ -902,11 +931,11 @@ ${h}
902
931
  <button class="debug-btn debug-btn-sm" data-motion-preset="bounce">Bounce</button>
903
932
  </div>
904
933
  </div>
905
- `,u=`
934
+ `,p=`
906
935
  <button class="debug-btn debug-btn-sm ${this.motionSimpleMode?"primary":""}" data-motion-simple-toggle>
907
936
  ${this.motionSimpleMode?"Simple":"Advanced"}
908
937
  </button>
909
- `,d='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',p=h=>{let m=h.split(".").filter(Boolean),b=s;for(let x of m)b=b==null?void 0:b[x];let v=m[m.length-1],y=`${i}.${h}`;return this.rendererRegistry.renderProperty(e,v,b,y)};if(this.motionSimpleMode){let h=p("enabled");h&&n.push(h);let m=[],b=p("intro.enabled"),v=p("intro.type"),y=p("intro.duration"),x=p("intro.easing");b&&m.push(b),v&&m.push(v),y&&m.push(y),x&&m.push(x),m.length&&n.push(`
938
+ `,d='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',u=h=>{let m=h.split(".").filter(Boolean),b=s;for(let w of m)b=b==null?void 0:b[w];let v=m[m.length-1],y=`${i}.${h}`;return this.rendererRegistry.renderProperty(e,v,b,y)};if(this.motionSimpleMode){let h=u("enabled");h&&n.push(h);let m=[],b=u("intro.enabled"),v=u("intro.type"),y=u("intro.duration"),w=u("intro.easing");b&&m.push(b),v&&m.push(v),y&&m.push(y),w&&m.push(w),m.length&&n.push(`
910
939
  <div class="inspector-subsection">
911
940
  <div class="inspector-subsection-title">Intro</div>
912
941
  <div class="inspector-subsection-content">
@@ -915,15 +944,15 @@ ${h}
915
944
  ${m.join("")}
916
945
  </div>
917
946
  </div>
918
- `);let S=[p("pulse.enabled"),p("pulse.speed"),p("pulse.intensity")].filter(Boolean),_=[p("swing.enabled"),p("swing.amplitude"),p("swing.speed"),p("swing.axis")].filter(Boolean),R=[p("continuousMove.enabled"),p("continuousMove.axis"),p("continuousMove.speed"),p("continuousMove.direction"),p("continuousMove.lifetime")].filter(Boolean),T=[p("continuousRotate.enabled"),p("continuousRotate.speed"),p("continuousRotate.direction")].filter(Boolean),M=[p("orbit.enabled"),p("orbit.radius"),p("orbit.speed"),p("orbit.direction"),p("orbit.pivotOffsetX"),p("orbit.pivotOffsetY")].filter(Boolean);if(S.length||_.length||R.length||T.length||M.length){let A=(C,E)=>E.length?`
947
+ `);let x=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),S=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),O=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),T=[u("continuousRotate.enabled"),u("continuousRotate.speed"),u("continuousRotate.direction")].filter(Boolean),_=[u("orbit.enabled"),u("orbit.radius"),u("orbit.speed"),u("orbit.direction"),u("orbit.pivotOffsetX"),u("orbit.pivotOffsetY")].filter(Boolean);if(x.length||S.length||O.length||T.length||_.length){let C=(L,A)=>A.length?`
919
948
  <div class="inspector-motion-continuous-group">
920
- <div class="inspector-subsection-title">${C}</div>
921
- <div class="inspector-subsection-content">${E.join("")}</div>
922
- </div>`:"",w=[A("Pulse",S),A("Swing",_),A("Move forever",R),A("Rotate (pivoting itself)",T),A("Rotate around",M)].filter(Boolean).join("");n.push(`
949
+ <div class="inspector-subsection-title">${L}</div>
950
+ <div class="inspector-subsection-content">${A.join("")}</div>
951
+ </div>`:"",E=[C("Pulse",x),C("Swing",S),C("Move forever",O),C("Rotate (pivoting itself)",T),C("Rotate around",_)].filter(Boolean).join("");n.push(`
923
952
  <div class="inspector-subsection inspector-subsection-continuous">
924
953
  <div class="inspector-subsection-title">Continuous</div>
925
954
  <div class="inspector-subsection-content inspector-motion-continuous-groups">
926
- ${w}
955
+ ${E}
927
956
  </div>
928
957
  </div>
929
958
  `)}}else for(let h in s){let m=s[h],b=`${i}.${h}`,v=this.rendererRegistry.renderProperty(e,h,m,b);v&&n.push(v)}return n.length===0?"":`
@@ -932,14 +961,14 @@ ${h}
932
961
  <span class="inspector-section-arrow">\u25BC</span>
933
962
  <span class="inspector-section-icon">\u{1F3AC}</span>
934
963
  <span class="inspector-section-title">Motion</span>
935
- <span class="inspector-section-actions">${u}</span>
964
+ <span class="inspector-section-actions">${p}</span>
936
965
  </div>
937
966
  <div class="inspector-section-body" data-section-body="motion">
938
967
  ${c}
939
968
  ${n.join("")}
940
969
  </div>
941
970
  </div>
942
- `}attachEventListeners(){var x,S,_,R;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=gs((T,M,I)=>{var A,w;this.updateManager.updateProperty(T,M,I),(w=(A=this.options)==null?void 0:A.onPropertyChange)==null||w.call(A,T,M,I)},300),i=T=>T?/(^|\.)logic(\.\d+)?\.id$/.test(T):!1;e.forEach(T=>{let M=A=>{var L,k;let w=A.target,C=w.dataset.propertyPath,E=w.dataset.objectId;if(C&&E){let j=w.value;if(w.type==="checkbox")j=w.checked;else if(w.type==="number"){if(j=parseFloat(w.value),isNaN(j))return}else if(w.dataset.json==="true")try{j=JSON.parse(w.value)}catch{return}w.type==="text"||w.type==="range"||w.tagName==="TEXTAREA"?t(E,C,j):(this.updateManager.updateProperty(E,C,j),(k=(L=this.options)==null?void 0:L.onPropertyChange)==null||k.call(L,E,C,j))}},I=T.dataset.propertyPath;i(I)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",I),T.addEventListener("change",async A=>{var D;let w=A.target,C=w.dataset.propertyPath,E=w.dataset.objectId,L=w.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",L),!C||!E)return;await this.updateManager.updateProperty(E,C,L),console.log("[Inspector v1.0.0] Logic ID updated");let k=window,j=(D=k==null?void 0:k.__HANDLER_LOGIC_META)==null?void 0:D[L],P=this.getDefaultPropsForLogic(L,j);console.log("[Inspector v1.0.0] New logic default props:",P);let O=C.replace(/\.id$/,".props");await this.updateManager.updateProperty(E,O,P),console.log("[Inspector v1.0.0] Logic props updated to:",P),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(E)})):(T.addEventListener("change",M),(T.tagName==="INPUT"||T.tagName==="TEXTAREA")&&T.addEventListener("input",M))}),this.contentContainer.querySelectorAll("[data-action]").forEach(T=>{T.addEventListener("click",M=>{let I=M.target,A=I.dataset.action,w=I.dataset.path,C=I.dataset.object;A&&w&&C&&this.quickActions.handleAction(A,C,w)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(T=>{T.addEventListener("click",M=>{var w,C;let I=M.target,A=I.dataset.sectionToggle||((w=I.closest("[data-section-toggle]"))==null?void 0:w.getAttribute("data-section-toggle"));if(A){let E=(C=this.contentContainer)==null?void 0:C.querySelector(`[data-section="${A}"]`);E==null||E.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(T=>{T.addEventListener("click",async M=>{let A=M.currentTarget.dataset.motionPreset;!A||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,A)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(T=>{T.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(T=>{T.addEventListener("click",async M=>{let I=M.target,A=I.dataset.objectId,w=I.dataset.propertyPath;if(!A||!w)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(A);if(!E)return;let L=this.updateManager.getNestedProperty(E,w),k=Array.isArray(L)?[...L]:[];k.push({x:0,y:0}),await this.updateManager.updateProperty(A,w,k),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(T=>{T.addEventListener("click",async M=>{let I=M.target,A=I.dataset.objectId,w=I.dataset.propertyPath,C=Number(I.dataset.index||"-1");if(!A||!w||C<0)return;let E=window.getEditableObjectConfig,L=E==null?void 0:E(A);if(!L)return;let k=this.updateManager.getNestedProperty(L,w);if(!Array.isArray(k))return;let j=k.filter((P,O)=>O!==C);await this.updateManager.updateProperty(A,w,j),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(T=>{T.addEventListener("click",async M=>{let I=M.target,A=I.dataset.objectId,w=I.dataset.propertyPath;if(!A||!w)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(A);if(!E)return;let L=this.updateManager.getNestedProperty(E,w),k=Array.isArray(L)?[...L]:[];k.push({templateId:"",weight:1}),await this.updateManager.updateProperty(A,w,k),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(T=>{T.addEventListener("click",async M=>{var P;let I=M.target,A=I.dataset.objectId,w=I.dataset.propertyPath,C=Number((P=I.dataset.index)!=null?P:-1);if(!A||!w||C<0)return;let E=window.getEditableObjectConfig,L=E==null?void 0:E(A);if(!L)return;let k=this.updateManager.getNestedProperty(L,w);if(!Array.isArray(k))return;let j=k.filter((O,D)=>D!==C);await this.updateManager.updateProperty(A,w,j),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(T=>{T.addEventListener("click",async M=>{var V;let I=M.target,A=I.dataset.objectId,w=I.dataset.propertyPath;if(!A||!w)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(A);if(!E)return;let L=this.updateManager.getNestedProperty(E,w),k;Array.isArray(L)?k=[...L]:L!=null?typeof L=="string"?k=[{id:L,props:{}}]:typeof L=="object"?k=[L]:k=[]:k=[];let j=this.getDefaultLogicId(),P=window,O=(V=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:V[j],D=this.getDefaultPropsForLogic(j,O);k.push({id:j,props:D}),console.log("[InspectorPanel] Adding logic to array:",{objectId:A,path:w,current:L,next:k}),await this.updateManager.updateProperty(A,w,k),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(T=>{T.addEventListener("click",async M=>{var P;let I=M.target,A=I.dataset.objectId,w=I.dataset.propertyPath,C=Number((P=I.dataset.index)!=null?P:-1);if(!A||!w||C<0)return;let E=window.getEditableObjectConfig,L=E==null?void 0:E(A);if(!L)return;let k=this.updateManager.getNestedProperty(L,w);if(!Array.isArray(k))return;let j=k.filter((O,D)=>D!==C);await this.updateManager.updateProperty(A,w,j),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(T=>{T.addEventListener("click",async M=>{var H,B;let I=M.target,A=I.dataset.objectId,w=I.dataset.propertyPath,C=Number((H=I.dataset.index)!=null?H:-1);if(!A||!w||C<0)return;let E=window.getEditableObjectConfig,L=E==null?void 0:E(A);if(!L)return;let k=this.updateManager.getNestedProperty(L,w);if(!Array.isArray(k))return;let j=k[C];if(typeof j!="string")return;let P=window,O=(B=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:B[j],D=this.getDefaultPropsForLogic(j,O),V=[...k];V[C]={id:j,props:D},await this.updateManager.updateProperty(A,w,V),this.loadObject(A)})});let m=(x=this.root)==null?void 0:x.querySelector("[data-inspector-advanced]");m==null||m.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(S=this.root)==null?void 0:S.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var M;let T=(M=this.root)==null?void 0:M.querySelector("[data-convert-menu]");T==null||T.classList.toggle("hidden")});let v=(_=this.contentContainer)==null?void 0:_.querySelector("[data-inspector-add-component-btn]"),y=(R=this.contentContainer)==null?void 0:R.querySelector("[data-inspector-component-select]");v==null||v.addEventListener("click",async()=>{let T=y.value;T&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,T)})}getMotionDefaults(){var i,n,a,s;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(s=(a=t.motion)==null?void 0:a.defaults)!=null?s:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),s={...(l=n.motion)!=null?l:a},o={...(c=s.intro)!=null?c:{}};s.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",s.intro=o,await this.updateManager.updateProperty(e,"motion",s),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},s={...(l=a.intro)!=null?l:{}};a.enabled=!0,s.enabled=!0,a.intro=s,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,s=a==null?void 0:a.schemas,o=null;s instanceof Map?o=s.get(t):s&&typeof s=="object"&&(o=s[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,s;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((s=(a=i.render)==null?void 0:a.asset)==null?void 0:s.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
971
+ `}attachEventListeners(){var w,x,S,O;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=gs((T,_,I)=>{var C,E;this.updateManager.updateProperty(T,_,I),(E=(C=this.options)==null?void 0:C.onPropertyChange)==null||E.call(C,T,_,I)},300),i=T=>T?/(^|\.)logic(\.\d+)?\.id$/.test(T):!1;e.forEach(T=>{let _=C=>{var k,P;let E=C.target,L=E.dataset.propertyPath,A=E.dataset.objectId;if(L&&A){let R=E.value;if(E.type==="checkbox")R=E.checked;else if(E.type==="number"){if(R=parseFloat(E.value),isNaN(R))return}else if(E.dataset.json==="true")try{R=JSON.parse(E.value)}catch{return}E.type==="text"||E.type==="range"||E.tagName==="TEXTAREA"?t(A,L,R):(this.updateManager.updateProperty(A,L,R),(P=(k=this.options)==null?void 0:k.onPropertyChange)==null||P.call(k,A,L,R))}},I=T.dataset.propertyPath;i(I)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",I),T.addEventListener("change",async C=>{var D;let E=C.target,L=E.dataset.propertyPath,A=E.dataset.objectId,k=E.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",k),!L||!A)return;await this.updateManager.updateProperty(A,L,k),console.log("[Inspector v1.0.0] Logic ID updated");let P=window,R=(D=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:D[k],M=this.getDefaultPropsForLogic(k,R);console.log("[Inspector v1.0.0] New logic default props:",M);let j=L.replace(/\.id$/,".props");await this.updateManager.updateProperty(A,j,M),console.log("[Inspector v1.0.0] Logic props updated to:",M),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(A)})):(T.addEventListener("change",_),(T.tagName==="INPUT"||T.tagName==="TEXTAREA")&&T.addEventListener("input",_))}),this.contentContainer.querySelectorAll("[data-action]").forEach(T=>{T.addEventListener("click",_=>{let I=_.target,C=I.dataset.action,E=I.dataset.path,L=I.dataset.object;C&&E&&L&&this.quickActions.handleAction(C,L,E)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(T=>{T.addEventListener("click",_=>{var E,L;let I=_.target,C=I.dataset.sectionToggle||((E=I.closest("[data-section-toggle]"))==null?void 0:E.getAttribute("data-section-toggle"));if(C){let A=(L=this.contentContainer)==null?void 0:L.querySelector(`[data-section="${C}"]`);A==null||A.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(T=>{T.addEventListener("click",async _=>{let C=_.currentTarget.dataset.motionPreset;!C||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,C)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(T=>{T.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(T=>{T.addEventListener("click",async _=>{let I=_.target,C=I.dataset.objectId,E=I.dataset.propertyPath;if(!C||!E)return;let L=window.getEditableObjectConfig,A=L==null?void 0:L(C);if(!A)return;let k=this.updateManager.getNestedProperty(A,E),P=Array.isArray(k)?[...k]:[];P.push({x:0,y:0}),await this.updateManager.updateProperty(C,E,P),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(T=>{T.addEventListener("click",async _=>{let I=_.target,C=I.dataset.objectId,E=I.dataset.propertyPath,L=Number(I.dataset.index||"-1");if(!C||!E||L<0)return;let A=window.getEditableObjectConfig,k=A==null?void 0:A(C);if(!k)return;let P=this.updateManager.getNestedProperty(k,E);if(!Array.isArray(P))return;let R=P.filter((M,j)=>j!==L);await this.updateManager.updateProperty(C,E,R),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(T=>{T.addEventListener("click",async _=>{let I=_.target,C=I.dataset.objectId,E=I.dataset.propertyPath;if(!C||!E)return;let L=window.getEditableObjectConfig,A=L==null?void 0:L(C);if(!A)return;let k=this.updateManager.getNestedProperty(A,E),P=Array.isArray(k)?[...k]:[];P.push({templateId:"",weight:1}),await this.updateManager.updateProperty(C,E,P),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(T=>{T.addEventListener("click",async _=>{var M;let I=_.target,C=I.dataset.objectId,E=I.dataset.propertyPath,L=Number((M=I.dataset.index)!=null?M:-1);if(!C||!E||L<0)return;let A=window.getEditableObjectConfig,k=A==null?void 0:A(C);if(!k)return;let P=this.updateManager.getNestedProperty(k,E);if(!Array.isArray(P))return;let R=P.filter((j,D)=>D!==L);await this.updateManager.updateProperty(C,E,R),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(T=>{T.addEventListener("click",async _=>{var V;let I=_.target,C=I.dataset.objectId,E=I.dataset.propertyPath;if(!C||!E)return;let L=window.getEditableObjectConfig,A=L==null?void 0:L(C);if(!A)return;let k=this.updateManager.getNestedProperty(A,E),P;Array.isArray(k)?P=[...k]:k!=null?typeof k=="string"?P=[{id:k,props:{}}]:typeof k=="object"?P=[k]:P=[]:P=[];let R=this.getDefaultLogicId(),M=window,j=(V=M==null?void 0:M.__HANDLER_LOGIC_META)==null?void 0:V[R],D=this.getDefaultPropsForLogic(R,j);P.push({id:R,props:D}),console.log("[InspectorPanel] Adding logic to array:",{objectId:C,path:E,current:k,next:P}),await this.updateManager.updateProperty(C,E,P),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(T=>{T.addEventListener("click",async _=>{var M;let I=_.target,C=I.dataset.objectId,E=I.dataset.propertyPath,L=Number((M=I.dataset.index)!=null?M:-1);if(!C||!E||L<0)return;let A=window.getEditableObjectConfig,k=A==null?void 0:A(C);if(!k)return;let P=this.updateManager.getNestedProperty(k,E);if(!Array.isArray(P))return;let R=P.filter((j,D)=>D!==L);await this.updateManager.updateProperty(C,E,R),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(T=>{T.addEventListener("click",async _=>{var H,B;let I=_.target,C=I.dataset.objectId,E=I.dataset.propertyPath,L=Number((H=I.dataset.index)!=null?H:-1);if(!C||!E||L<0)return;let A=window.getEditableObjectConfig,k=A==null?void 0:A(C);if(!k)return;let P=this.updateManager.getNestedProperty(k,E);if(!Array.isArray(P))return;let R=P[L];if(typeof R!="string")return;let M=window,j=(B=M==null?void 0:M.__HANDLER_LOGIC_META)==null?void 0:B[R],D=this.getDefaultPropsForLogic(R,j),V=[...P];V[L]={id:R,props:D},await this.updateManager.updateProperty(C,E,V),this.loadObject(C)})});let m=(w=this.root)==null?void 0:w.querySelector("[data-inspector-advanced]");m==null||m.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(x=this.root)==null?void 0:x.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var _;let T=(_=this.root)==null?void 0:_.querySelector("[data-convert-menu]");T==null||T.classList.toggle("hidden")});let v=(S=this.contentContainer)==null?void 0:S.querySelector("[data-inspector-add-component-btn]"),y=(O=this.contentContainer)==null?void 0:O.querySelector("[data-inspector-component-select]");v==null||v.addEventListener("click",async()=>{let T=y.value;T&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,T)})}getMotionDefaults(){var i,n,a,s;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(s=(a=t.motion)==null?void 0:a.defaults)!=null?s:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),s={...(l=n.motion)!=null?l:a},o={...(c=s.intro)!=null?c:{}};s.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",s.intro=o,await this.updateManager.updateProperty(e,"motion",s),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},s={...(l=a.intro)!=null?l:{}};a.enabled=!0,s.enabled=!0,a.intro=s,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,s=a==null?void 0:a.schemas,o=null;s instanceof Map?o=s.get(t):s&&typeof s=="object"&&(o=s[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,s;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((s=(a=i.render)==null?void 0:a.asset)==null?void 0:s.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
943
972
  <div class="inspector-empty">
944
973
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
945
974
  <span class="inspector-empty-text">${e}</span>
@@ -949,7 +978,7 @@ ${h}
949
978
  <span class="inspector-empty-icon">\u{1F3AF}</span>
950
979
  <span class="inspector-empty-text">Select an object to inspect</span>
951
980
  </div>
952
- `)}};import*as or from"jszip";function en(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function Xa(r){var n;let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Ja(r){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=r})}async function ci(r){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",r);let i=await fetch(r);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,r),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await en(n),s=await Ja(a),o=Xa(a);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:a,width:(e=s==null?void 0:s.width)!=null?e:0,height:(t=s==null?void 0:s.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Oe(r){var e,t;try{let i=await en(r),n=await Ja(i),a=Xa(i);return{base64:a.base64,mimeType:a.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function tn(r){return en(r).then(e=>e).catch(()=>null)}function nn(r,e){var t;try{let[i,n]=r.split(","),a=i.match(/data:(.*?);base64/),s=(t=a==null?void 0:a[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:s})}catch{return null}}async function Xe(r,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((d,p)=>{let g=new Image;g.onload=()=>d(g),g.onerror=()=>p(new Error("Failed to load image")),g.src=r}),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"),r;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),s=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(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 p=s[d],g=s[d+1],f=s[d+2],h=!1;for(let m of l)if(Math.sqrt(Math.pow(p-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(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),r}}function Za(r,e){if(!r||!e)return"1:1";let t=r/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function Ae(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function Q(r){return typeof r=="string"?r:void 0}function Qa(r){return r.toLowerCase().endsWith(".png")?r.slice(0,-4):r}function hs(r){var i,n,a;let e=(i=Q(r.id))!=null?i:Q(r.name);if(e)return e;let t=(n=Q(r.file))!=null?n:Q(r.asset);return t?Qa((a=t.split("/").pop())!=null?a:t):void 0}function fs(r,e,t){var i,n,a;if(typeof e=="string")return{id:r,file:e,role:t};if(Ae(e)){let s=(i=Q(e.file))!=null?i:Q(e.asset);return s?{id:(n=Q(e.id))!=null?n:r,file:s,role:(a=Q(e.role))!=null?a:t,dataUrl:Q(e.dataUrl),layout:e.layout}:null}return null}function an(r,e){var t,i,n;if(!r)return[];if(Array.isArray(r)){let a=[];for(let s of r){if(typeof s=="string"){let o=Qa((t=s.split("/").pop())!=null?t:s);a.push({id:o,file:s,role:e});continue}if(Ae(s)){let o=hs(s),l=(i=Q(s.file))!=null?i:Q(s.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=Q(s.role))!=null?n:e,dataUrl:Q(s.dataUrl),layout:s.layout})}}return a}if(Ae(r)){let a=[];for(let[s,o]of Object.entries(r)){let l=fs(s,o,e);l&&a.push(l)}return a}return[]}function ms(r){var e,t;return(t=(e=Q(r.brand_name))!=null?e:Q(r.brandName))!=null?t:Q(r.name)}function bs(r){if(Ae(r.brand_dna)&&Ae(r.brand_dna.colors))return r.brand_dna;if(Ae(r.colors)){let e={colors:r.colors};return typeof r.style=="string"&&(e.style=r.style),Ae(r.fonts)&&(e.fonts=r.fonts),e}}function vs(r){var t;let e=new Map;for(let i of r){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 rn(r,e={}){var s,o,l;let t=r.filter(Ae),i=(o=(s=t.map(ms).find(Boolean))!=null?s:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(bs).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...an(c.layers,"visual element")),"assets"in c&&a.push(...an(c.assets,"visual element")),Ae(c.endgame)&&"assets"in c.endgame&&a.push(...an(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:vs(a)}}import{GoogleGenAI as ys}from"@google/genai";async function di(r,e,t=[],i={}){var n,a,s,o,l,c,u;try{if(!(r!=null&&r.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let v=t[b];if(!v.base64||!v.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(v.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!v.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${v.mimeType}`)}let d=new ys({apiKey:r}),p="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,v)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${v+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let f=await d.models.generateContent({model:p,contents:g}),h="",m=(s=(a=(n=f.candidates)==null?void 0:n[0])==null?void 0:a.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."):(u=d.message)!=null&&u.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):d}}import{GoogleGenAI as xs}from"@google/genai";async function Je(r,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new xs({apiKey:r}),a=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let s=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!s.candidates||!s.candidates[0]||!s.candidates[0].content||!s.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let 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 er(r){let e=r.brandAssets.map(a=>{let s=`- ${a.id}: ${a.role}`;return a.layout&&(s+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),s}).join(`
981
+ `)}};import*as or from"jszip";function en(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function Xa(r){var n;let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Ja(r){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=r})}async function ci(r){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",r);let i=await fetch(r);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,r),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await en(n),s=await Ja(a),o=Xa(a);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:a,width:(e=s==null?void 0:s.width)!=null?e:0,height:(t=s==null?void 0:s.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Oe(r){var e,t;try{let i=await en(r),n=await Ja(i),a=Xa(i);return{base64:a.base64,mimeType:a.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function tn(r){return en(r).then(e=>e).catch(()=>null)}function nn(r,e){var t;try{let[i,n]=r.split(","),a=i.match(/data:(.*?);base64/),s=(t=a==null?void 0:a[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:s})}catch{return null}}async function Je(r,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=r}),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"),r;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),s=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(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(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),r}}function Za(r,e){if(!r||!e)return"1:1";let t=r/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function Ae(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function Q(r){return typeof r=="string"?r:void 0}function Qa(r){return r.toLowerCase().endsWith(".png")?r.slice(0,-4):r}function hs(r){var i,n,a;let e=(i=Q(r.id))!=null?i:Q(r.name);if(e)return e;let t=(n=Q(r.file))!=null?n:Q(r.asset);return t?Qa((a=t.split("/").pop())!=null?a:t):void 0}function fs(r,e,t){var i,n,a;if(typeof e=="string")return{id:r,file:e,role:t};if(Ae(e)){let s=(i=Q(e.file))!=null?i:Q(e.asset);return s?{id:(n=Q(e.id))!=null?n:r,file:s,role:(a=Q(e.role))!=null?a:t,dataUrl:Q(e.dataUrl),layout:e.layout}:null}return null}function an(r,e){var t,i,n;if(!r)return[];if(Array.isArray(r)){let a=[];for(let s of r){if(typeof s=="string"){let o=Qa((t=s.split("/").pop())!=null?t:s);a.push({id:o,file:s,role:e});continue}if(Ae(s)){let o=hs(s),l=(i=Q(s.file))!=null?i:Q(s.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=Q(s.role))!=null?n:e,dataUrl:Q(s.dataUrl),layout:s.layout})}}return a}if(Ae(r)){let a=[];for(let[s,o]of Object.entries(r)){let l=fs(s,o,e);l&&a.push(l)}return a}return[]}function ms(r){var e,t;return(t=(e=Q(r.brand_name))!=null?e:Q(r.brandName))!=null?t:Q(r.name)}function bs(r){if(Ae(r.brand_dna)&&Ae(r.brand_dna.colors))return r.brand_dna;if(Ae(r.colors)){let e={colors:r.colors};return typeof r.style=="string"&&(e.style=r.style),Ae(r.fonts)&&(e.fonts=r.fonts),e}}function vs(r){var t;let e=new Map;for(let i of r){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 rn(r,e={}){var s,o,l;let t=r.filter(Ae),i=(o=(s=t.map(ms).find(Boolean))!=null?s:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(bs).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...an(c.layers,"visual element")),"assets"in c&&a.push(...an(c.assets,"visual element")),Ae(c.endgame)&&"assets"in c.endgame&&a.push(...an(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:vs(a)}}import{GoogleGenAI as ys}from"@google/genai";async function di(r,e,t=[],i={}){var n,a,s,o,l,c,p;try{if(!(r!=null&&r.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let v=t[b];if(!v.base64||!v.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(v.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!v.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${v.mimeType}`)}let d=new ys({apiKey:r}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,v)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${v+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let f=await d.models.generateContent({model:u,contents:g}),h="",m=(s=(a=(n=f.candidates)==null?void 0:n[0])==null?void 0:a.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 xs}from"@google/genai";async function Ze(r,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new xs({apiKey:r}),a=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let s=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!s.candidates||!s.candidates[0]||!s.candidates[0].content||!s.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let 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 er(r){let e=r.brandAssets.map(a=>{let s=`- ${a.id}: ${a.role}`;return a.layout&&(s+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),s}).join(`
953
982
  `)||"None",t=r.brandDna?`Colors: ${JSON.stringify(r.brandDna.colors)}, Style: ${r.brandDna.style||"not specified"}`:"Not provided",i=r.gameObjects.map(a=>typeof a=="string"?`- id: ${a}`:`- id: ${a.id}${a.category?`, category: ${a.category}`:""}${a.type?`, type: ${a.type}`:""}`).join(`
954
983
  `),n="";if(r.brandConfig){let a=r.brandConfig,s=[];a.splash&&s.push(`SPLASH: title="${a.splash.title||""}", subtitle="${a.splash.subtitle||""}", button="${a.splash.button_label||""}"`),a.endgame&&s.push(`ENDGAME: title="${a.endgame.title||""}", subtitle="${a.endgame.subtitle||""}", cta="${a.endgame.cta_label||""}"`),a.tutorial&&s.push(`TUTORIAL: text="${a.tutorial.label_text||""}", helper="${a.tutorial.helper_text||""}"`),s.length>0&&(n=`
955
984
  BRAND CONTENT:
@@ -1034,7 +1063,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
1034
1063
 
1035
1064
  OUTPUT:
1036
1065
  Generate the requested asset matching the brand style.${r.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
1037
- `.trim()}function ir(r){return r.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 nr(r,e){return!(r.includes("background")&&(r.includes("_1")||r.includes("splash")||r.includes("endgame")||r.includes("main"))||e==="text"||e==="effects"&&r.includes("particle"))}async function ar(r){var s,o;let e=ir(r.gameObjects),t={gamePrompt:r.gamePrompt,gameObjects:e,brandAssets:r.manifest.assets,brandDna:r.manifest.brand_dna,brandName:r.manifest.brand_name},i=er(t),n=[];if(r.flatDesignDataUrl)try{let l=rr(r.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await di(r.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 ws(a,r.gameObjects)}function ws(r,e){try{let t=r,i=r.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=r.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:r,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:r,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:r,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function sn(r,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let s=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,s.game_object);try{let o=await Es(r,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 Es(r,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&r.manifest){let o=r.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=r.assetFiles.get(o.file);if(l){let c=await Oe(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(r.flatDesignDataUrl){let o=rr(r.flatDesignDataUrl);o&&t.push(o)}let i=nr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:r.manifest.brand_dna,needsTransparency:i},a=tr(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await Je(r.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await Xe(s)||s}function rr(r){let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function sr(r,e){let t=r.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],r.assets=i;for(let n of i){let a=e.get(n.file);if(a){let s=await Oe(a);s&&(n.dataUrl=s.dataUrl)}}}var pi=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`
1066
+ `.trim()}function ir(r){return r.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 nr(r,e){return!(r.includes("background")&&(r.includes("_1")||r.includes("splash")||r.includes("endgame")||r.includes("main"))||e==="text"||e==="effects"&&r.includes("particle"))}async function ar(r){var s,o;let e=ir(r.gameObjects),t={gamePrompt:r.gamePrompt,gameObjects:e,brandAssets:r.manifest.assets,brandDna:r.manifest.brand_dna,brandName:r.manifest.brand_name},i=er(t),n=[];if(r.flatDesignDataUrl)try{let l=rr(r.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await di(r.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 ws(a,r.gameObjects)}function ws(r,e){try{let t=r,i=r.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=r.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:r,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:r,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:r,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function sn(r,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let s=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,s.game_object);try{let o=await Es(r,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 Es(r,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&r.manifest){let o=r.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=r.assetFiles.get(o.file);if(l){let c=await Oe(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(r.flatDesignDataUrl){let o=rr(r.flatDesignDataUrl);o&&t.push(o)}let i=nr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:r.manifest.brand_dna,needsTransparency:i},a=tr(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await Ze(r.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await Je(s)||s}function rr(r){let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function sr(r,e){let t=r.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],r.assets=i;for(let n of i){let a=e.get(n.file);if(a){let s=await Oe(a);s&&(n.dataUrl=s.dataUrl)}}}var pi=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`
1038
1067
  <div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
1039
1068
  <div class="scene-panel-header" data-panel-handle>
1040
1069
  <div class="panel-title">
@@ -1150,7 +1179,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1150
1179
  </div>
1151
1180
  <div class="panel-resize-handle" data-panel-resize></div>
1152
1181
  </div>
1153
- `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,s,o,l,c,u,d,p,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()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||m.click()}),(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)}),(u=this.root.querySelector("[data-vision-upload-flat]"))==null||u.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)}),(p=this.root.querySelector("[data-vision-analyze]"))==null||p.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]"),v=b==null?void 0:b.dataset.mappingItem;v&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(v),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(v),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(v),m.closest("[data-mapping-generate-one]")&&this.generateOne(v),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]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let y=this.mappingResult.mappings.find(x=>x.game_object===v);y&&(m.matches("[data-mapping-action]")&&(y.action=String(m.value||"KEEP"),y.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(y.brand_asset=String(m.value||""),y.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]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let y=this.mappingResult.mappings.find(x=>x.game_object===v);y&&(y.generation_prompt=String(m.value||""),y.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var s,o;let t=await or.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let u=l.toLowerCase();u.endsWith(".json")?i.push({name:l,content:null}):u.startsWith("assets/")&&u.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((s=t.file(l.name))==null?void 0:s.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let a=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),u=new Blob([c],{type:"image/png"}),d=l.name.split("/").pop()||l.name;console.log(`Processing ${d}, uint8array length: ${c.length}, blob size: ${u.size}`);let p;try{p=await this.blobToDataUrl(u)}catch(m){console.warn(`FileReader failed for ${d}, using fallback:`,m),p=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${p.length}, starts with: ${p.substring(0,50)}...`),!p.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${d}:`,p.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:p,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([u],d,{type:"image/png"});a.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=a;try{this.normalizedManifest=rn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[u,d]of a){let p=await this.fileToDataUrl(d);l.push({id:u.replace(".png",""),filename:u,dataUrl:p,category:this.inferAssetCategory(u.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
1182
+ `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,s,o,l,c,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()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||m.click()}),(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]"),v=b==null?void 0:b.dataset.mappingItem;v&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(v),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(v),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(v),m.closest("[data-mapping-generate-one]")&&this.generateOne(v),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]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let y=this.mappingResult.mappings.find(w=>w.game_object===v);y&&(m.matches("[data-mapping-action]")&&(y.action=String(m.value||"KEEP"),y.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(y.brand_asset=String(m.value||""),y.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]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let y=this.mappingResult.mappings.find(w=>w.game_object===v);y&&(y.generation_prompt=String(m.value||""),y.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var s,o;let t=await or.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let 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 a=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"});a.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=a;try{this.normalizedManifest=rn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[p,d]of a){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
1154
1183
  \u{1F3F7}\uFE0F Brand: ${((o=this.normalizedManifest)==null?void 0:o.brand_name)||"Imported Brand"}`),this.addAssetsToRegistry(l),this.refreshLibrary()}catch(l){console.error("[BrandVision] Failed to normalize ZIP manifest:",l),this.normalizedManifest=null,this.setStatus("zip","\u274C Failed to normalize manifest")}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let s=a.category||"misc";n[s]||(n[s]=[]),i.libraryAssets[s]||(i.libraryAssets[s]=[]),i.libraryAssets[s].some(l=>l.filename===a.filename)||(i.libraryAssets[s].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${s}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var a;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let s of Array.from(i))try{let o=await s.text(),l=JSON.parse(o);this.uploadedJsons.set(s.name,l),l.layers?n+=`\u2705 Layers: ${s.name}
1155
1184
  `:l.brand_dna||l.colors?n+=`\u2705 Brand: ${s.name}
1156
1185
  `:n+=`\u2705 Loaded: ${s.name}
@@ -1158,7 +1187,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1158
1187
  `}try{this.normalizedManifest=rn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let s=Array.isArray((a=this.normalizedManifest)==null?void 0:a.assets)?this.normalizedManifest.assets.length:0;n+=`
1159
1188
  \u{1F4E6} Normalized manifest: ${s} assets`,n+=`
1160
1189
  \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+=`
1161
- \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 a,s;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await Oe(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,a,s,o,l,c;if(this.isAnalyzing)return;let e=(a=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await sr(t,this.assetFiles);let u={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},d=await ar(u);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(u){console.error("[BrandVision] Analysis failed:",u),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await sn(a,this.mappingResult,{onProgress:(s,o,l)=>{this.setStatus("apply",`Generating ${s}/${o}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(a){console.error("[BrandVision] Generation failed:",a),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var o;let e=(o=this.root)==null?void 0:o.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,a=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),s=n?`
1190
+ \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 a,s;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await Oe(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,a,s,o,l,c;if(this.isAnalyzing)return;let e=(a=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await sr(t,this.assetFiles);let p={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},d=await ar(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 a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await sn(a,this.mappingResult,{onProgress:(s,o,l)=>{this.setStatus("apply",`Generating ${s}/${o}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(a){console.error("[BrandVision] Generation failed:",a),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var o;let e=(o=this.root)==null?void 0:o.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,a=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),s=n?`
1162
1191
  <div class="vision-raw-block">
1163
1192
  <div class="inspector-text-sm" style="white-space: pre-wrap;">
1164
1193
  \u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
@@ -1168,10 +1197,10 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1168
1197
  </div>
1169
1198
  `:"";e.innerHTML=`
1170
1199
  ${s}
1171
- ${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",u=l.brand_asset||"",d=(b=t==null?void 0:t.assets)==null?void 0:b.find(v=>v.id===u),p=(d==null?void 0:d.dataUrl)||"",g=l.output_dataUrl||"",f=l.action==="GENERATE"?g:l.action==="APPLY"?p:"",h=!!f,m=`
1200
+ ${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(v=>v.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=`
1172
1201
  <select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
1173
1202
  <option value="">Select brand asset\u2026</option>
1174
- ${a.replace(`value="${u}"`,`value="${u}" selected`)}
1203
+ ${a.replace(`value="${p}"`,`value="${p}" selected`)}
1175
1204
  </select>
1176
1205
  `;return`
1177
1206
  <div class="vision-mapping-item" data-mapping-item="${l.game_object}">
@@ -1279,17 +1308,17 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1279
1308
  </div>
1280
1309
  <div class="panel-resize-handle" data-panel-resize></div>
1281
1310
  </div>
1282
- `}initialize(e,t){var n,a,s,o,l,c;this.options=t,this.root=e.querySelector('[data-panel="customize-settings"]'),this.assetsContainer=(n=this.root)==null?void 0:n.querySelector("[data-customize-assets]"),this.colorsContainer=(a=this.root)==null?void 0:a.querySelector("[data-customize-colors]"),this.fontsContainer=(s=this.root)==null?void 0:s.querySelector("[data-customize-fonts]"),this.textsContainer=(o=this.root)==null?void 0:o.querySelector("[data-customize-texts]"),this.audioContainer=(l=this.root)==null?void 0:l.querySelector("[data-customize-audio]");let i=(c=this.root)==null?void 0:c.querySelector("[data-customize-apply]");i==null||i.addEventListener("click",()=>this.handleApply()),this.setupRenderModeHandlers(),this.setupResizeHandle(),this.refresh()}setupRenderModeHandlers(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector('[data-render-mode="endgame-png"]'),t=(n=this.root)==null?void 0:n.querySelector('[data-render-mode="splash-png"]');e==null||e.addEventListener("change",()=>{this.applyEndgamePngMode(e.checked)}),t==null||t.addEventListener("change",()=>{this.applySplashPngMode(t.checked)})}applyEndgamePngMode(e){let t=window.getEditableObjectConfig,i=window.applyEditableObjectConfig;if(typeof t!="function"||typeof i!="function")return;let n=["ui_endgame_title_1","ui_endgame_subtitle_1","ui_endgame_logo_1","ui_endgame_cta_1"];for(let a of n){let s=t(a);s&&(s.ui||(s.ui={}),s.ui.renderMode=e?"png":"text",e&&(s.render||(s.render={}),s.render.asset||(s.render.asset={type:"image",path:""}),s.render.asset.type="image"),i(a,s))}console.log("[CustomizePanel] EndGame PNG mode:",e?"enabled":"disabled")}applySplashPngMode(e){let t=window.applyEditableEngineConfig;typeof t=="function"&&(t({splash:{type:e?"image":"text",image_path:e?"library/splash/splash.png":""}}),console.log("[CustomizePanel] Splash PNG mode:",e?"enabled":"disabled"))}openAiEditor(e,t,i,n){this.openAiModal(e,i,n),t&&this.aiPromptInput&&(this.aiPromptInput.value=t,this.setAiStatus("Prompt loaded."))}refresh(){var t,i,n,a,s,o,l,c;let e=this.getEngineSnapshot();if(console.log("[CustomizePanel] Refreshing with snapshot:",!!e),!e){this.scheduleRetry();return}console.log("[CustomizePanel] Snapshot assets count:",Object.keys(e.assets||{}).length),this.renderAssets(e.assets),this.renderColors((i=(t=e.runtime)==null?void 0:t.theme)!=null?i:{}),this.renderFonts((a=(n=e.runtime)==null?void 0:n.fonts)!=null?a:{}),this.renderTexts((o=(s=e.runtime)==null?void 0:s.ui)!=null?o:{}),this.renderAudio((c=(l=e.runtime)==null?void 0:l.audio)!=null?c:{})}getEngineSnapshot(){let e=window.getEditableEngineConfig;return typeof e!="function"?null:e()}renderAssets(e){if(!this.assetsContainer)return;this.assetsContainer.innerHTML="";let t=Object.entries(e!=null?e:{});if(!t.length){this.assetsContainer.innerHTML='<div class="customize-empty">No assets found.</div>',this.scheduleRetry();return}this.clearRetry(),t.forEach(([i,n])=>{var p;let a=document.createElement("div");a.className="customize-row";let s=document.createElement("span");s.className="customize-key",s.textContent=i;let o=document.createElement("input");o.type="text",o.value=n!=null?n:"",o.className="customize-input",o.dataset.assetKey=i,o.addEventListener("input",()=>{this.handleAssetValueChange(i,o)});let l=document.createElement("div");l.className="customize-actions";let c=document.createElement("button");c.type="button",c.className="customize-icon-btn",c.title="Preview asset",c.innerHTML=`
1311
+ `}initialize(e,t){var n,a,s,o,l,c;this.options=t,this.root=e.querySelector('[data-panel="customize-settings"]'),this.assetsContainer=(n=this.root)==null?void 0:n.querySelector("[data-customize-assets]"),this.colorsContainer=(a=this.root)==null?void 0:a.querySelector("[data-customize-colors]"),this.fontsContainer=(s=this.root)==null?void 0:s.querySelector("[data-customize-fonts]"),this.textsContainer=(o=this.root)==null?void 0:o.querySelector("[data-customize-texts]"),this.audioContainer=(l=this.root)==null?void 0:l.querySelector("[data-customize-audio]");let i=(c=this.root)==null?void 0:c.querySelector("[data-customize-apply]");i==null||i.addEventListener("click",()=>this.handleApply()),this.setupRenderModeHandlers(),this.setupResizeHandle(),this.refresh()}setupRenderModeHandlers(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector('[data-render-mode="endgame-png"]'),t=(n=this.root)==null?void 0:n.querySelector('[data-render-mode="splash-png"]');e==null||e.addEventListener("change",()=>{this.applyEndgamePngMode(e.checked)}),t==null||t.addEventListener("change",()=>{this.applySplashPngMode(t.checked)})}applyEndgamePngMode(e){let t=window.getEditableObjectConfig,i=window.applyEditableObjectConfig;if(typeof t!="function"||typeof i!="function")return;let n=["ui_endgame_title_1","ui_endgame_subtitle_1","ui_endgame_logo_1","ui_endgame_cta_1"];for(let a of n){let s=t(a);s&&(s.ui||(s.ui={}),s.ui.renderMode=e?"png":"text",e&&(s.render||(s.render={}),s.render.asset||(s.render.asset={type:"image",path:""}),s.render.asset.type="image"),i(a,s))}console.log("[CustomizePanel] EndGame PNG mode:",e?"enabled":"disabled")}applySplashPngMode(e){let t=window.applyEditableEngineConfig;typeof t=="function"&&(t({splash:{type:e?"image":"text",image_path:e?"library/splash/splash.png":""}}),console.log("[CustomizePanel] Splash PNG mode:",e?"enabled":"disabled"))}openAiEditor(e,t,i,n){this.openAiModal(e,i,n),t&&this.aiPromptInput&&(this.aiPromptInput.value=t,this.setAiStatus("Prompt loaded."))}refresh(){var t,i,n,a,s,o,l,c;let e=this.getEngineSnapshot();if(console.log("[CustomizePanel] Refreshing with snapshot:",!!e),!e){this.scheduleRetry();return}console.log("[CustomizePanel] Snapshot assets count:",Object.keys(e.assets||{}).length),this.renderAssets(e.assets),this.renderColors((i=(t=e.runtime)==null?void 0:t.theme)!=null?i:{}),this.renderFonts((a=(n=e.runtime)==null?void 0:n.fonts)!=null?a:{}),this.renderTexts((o=(s=e.runtime)==null?void 0:s.ui)!=null?o:{}),this.renderAudio((c=(l=e.runtime)==null?void 0:l.audio)!=null?c:{})}getEngineSnapshot(){let e=window.getEditableEngineConfig;return typeof e!="function"?null:e()}renderAssets(e){if(!this.assetsContainer)return;this.assetsContainer.innerHTML="";let t=Object.entries(e!=null?e:{});if(!t.length){this.assetsContainer.innerHTML='<div class="customize-empty">No assets found.</div>',this.scheduleRetry();return}this.clearRetry(),t.forEach(([i,n])=>{var u;let a=document.createElement("div");a.className="customize-row";let s=document.createElement("span");s.className="customize-key",s.textContent=i;let o=document.createElement("input");o.type="text",o.value=n!=null?n:"",o.className="customize-input",o.dataset.assetKey=i,o.addEventListener("input",()=>{this.handleAssetValueChange(i,o)});let l=document.createElement("div");l.className="customize-actions";let c=document.createElement("button");c.type="button",c.className="customize-icon-btn",c.title="Preview asset",c.innerHTML=`
1283
1312
  <svg viewBox="0 0 24 24" aria-hidden="true">
1284
1313
  <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" />
1285
1314
  <circle cx="12" cy="12" r="3.2" />
1286
1315
  </svg>
1287
- `,c.addEventListener("click",()=>{this.previewAsset(i,o.value,o.dataset.assetType,d)});let u=document.createElement("button");u.type="button",u.className="customize-icon-btn",u.title="Upload asset",u.innerHTML=`
1316
+ `,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=`
1288
1317
  <svg viewBox="0 0 24 24" aria-hidden="true">
1289
1318
  <path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
1290
1319
  <path d="M5 14v4h14v-4h2v6H3v-6h2z" />
1291
1320
  </svg>
1292
- `;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)}),u.addEventListener("click",()=>d.click()),l.appendChild(c),l.appendChild(u),l.appendChild(d),a.appendChild(s),a.appendChild(o),a.appendChild(l),(p=this.assetsContainer)==null||p.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Ss.forEach(t=>{var l,c,u;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let p={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];p&&(i=(c=this.getObjectPropertyValue(p.objectId,p.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let s=document.createElement("input");s.type="color",s.value=i,s.dataset.colorKey=t;let 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(a),n.appendChild(s),n.appendChild(o),(u=this.colorsContainer)==null||u.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Cs.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 a=document.createElement("input");a.type="text",a.value=(s=e==null?void 0:e[t])!=null?s:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",As.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 a=document.createElement("input");a.type="text",a.value=(s=this.readUiValue(e,t))!=null?s:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(o=this.textsContainer)==null||o.appendChild(i)}),cr.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let 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(a),n.appendChild(s),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let 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(a),n.appendChild(s),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let s of n){if(a==null)return null;a=a[s]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),s=n;for(let o of a){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 a={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(a[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 u=parseFloat(l.value);s[c]=isNaN(u)?0:u}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 u=cr.find(d=>d.key===c);u&&this.applyObjectPropertyValue(u.objectId,u.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:s}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await ci(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,s;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(a=(n=o==null?void 0:o.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(s=i==null?void 0:i.dataUrl)!=null?s:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let s=this.resolveAssetUrls(i);s[0]&&(a.src=s[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(a),n.appendChild(o),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var s,o;let i=t,n=i.dataset.assetKey,a=(o=(s=i.value)==null?void 0:s.trim())!=null?o:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var o,l,c,u,d,p,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=`
1321
+ `;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),a.appendChild(s),a.appendChild(o),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Ss.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 a=document.createElement("span");a.textContent=t.replace(/_/g," ");let s=document.createElement("input");s.type="color",s.value=i,s.dataset.colorKey=t;let 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(a),n.appendChild(s),n.appendChild(o),(p=this.colorsContainer)==null||p.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Cs.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 a=document.createElement("input");a.type="text",a.value=(s=e==null?void 0:e[t])!=null?s:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",As.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 a=document.createElement("input");a.type="text",a.value=(s=this.readUiValue(e,t))!=null?s:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(o=this.textsContainer)==null||o.appendChild(i)}),cr.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let 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(a),n.appendChild(s),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let 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(a),n.appendChild(s),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let s of n){if(a==null)return null;a=a[s]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),s=n;for(let o of a){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 a={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(a[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=cr.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:a,fonts:n,audio:s}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await ci(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,s;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(a=(n=o==null?void 0:o.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(s=i==null?void 0:i.dataUrl)!=null?s:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let s=this.resolveAssetUrls(i);s[0]&&(a.src=s[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(a),n.appendChild(o),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var s,o;let i=t,n=i.dataset.assetKey,a=(o=(s=i.value)==null?void 0:s.trim())!=null?o:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var o,l,c,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=`
1293
1322
  <div class="ai-modal-card">
1294
1323
  <div class="ai-modal-header">
1295
1324
  <div>
@@ -1360,7 +1389,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1360
1389
  </div>
1361
1390
  </div>
1362
1391
  </div>
1363
- `;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let s=n.querySelector("[data-ai-ref-button]");s==null||s.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var v,y;let b=(y=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?y:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(u=this.aiBgToleranceInput)==null||u.addEventListener("input",()=>{var v,y;let b=(y=(v=this.aiBgToleranceInput)==null?void 0:v.value)!=null?y:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var v,y,x;let b=(x=(y=(v=this.aiReferenceInput)==null?void 0:v.files)==null?void 0:y[0])!=null?x:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(p=this.aiGenerateBtn)==null||p.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(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 u,d,p,g,f,h,m,b,v,y,x,S,_,R,T,M,I,A,w,C;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(p=(d=(u=this.aiKeyInput)==null?void 0:u.value)==null?void 0:d.trim())!=null?p:"",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=(y=(v=this.aiRemoveBgToggle)==null?void 0:v.checked)!=null?y:!1,a=n,s=n,o=Number((S=(x=this.aiStrengthInput)==null?void 0:x.value)!=null?S:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((_=l==null?void 0:l.value)==null?void 0:_.trim())||((R=this.aiBaseValue)==null?void 0:R.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let E=null,L=(T=this.getSelectedAssetKey())!=null?T:"unknown",k=(M=this.aiUseOutputToggle)!=null&&M.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((I=this.aiUseOutputToggle)!=null&&I.checked&&this.aiOutputDataUrl){let B=nn(this.aiOutputDataUrl,"ai-output.png");if(B){let W=await Oe(B);W&&(E={input:{base64:W.base64,mimeType:W.mimeType},dataUrl:W.dataUrl,width:W.width,height:W.height})}}if(E||(E=await this.getImageDataFromAsset(c)),!E){this.setAiStatus("Unable to load the base image.");return}let j=[E.input],P=!1;if(this.aiReferenceFile){let B=await Oe(this.aiReferenceFile);B?(j.push({base64:B.base64,mimeType:B.mimeType}),P=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let O=lr(i,{includeReference:P,includeMagenta:a,changeLevel:o}),D=(w=(A=this.aiReferenceFile)==null?void 0:A.name)!=null?w:"none";console.info("[AI] Final prompt:",O),console.info("[AI] Image sources:",{assetKey:L,base:k,reference:D});let V=Za(E.width,E.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await Je(e,O,j,{aspectRatio:V,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,await this.refreshAiOutputFromRaw()}catch(E){console.error("[CustomizePanel] AI Generate Error:",E),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((C=this.aiStatusEl)==null?void 0:C.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,s,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Xe(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),s=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&s)console.log("[CustomizePanel] Applying AI output directly to object:",a,s),this.applyObjectPropertyValue(a,s,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,s,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let u=window.addAssetToRegistry;typeof u=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),u(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let p=window.__wizardAssetPicker;if(p!=null&&p.onPick){p.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),f=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),h=this.getSelectedAssetInput();if(h&&(h.value=c.path,this.handleAssetValueChange((o=h.dataset.assetKey)!=null?o:"",h)),g&&f){console.log("[CustomizePanel] Applying saved asset to object:",g,f);let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&v){let y=this.getFilenameFromPath(c.path);await b(g,y,n)}else this.applyObjectPropertyValue(g,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{m(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var s;let t=(s=this.aiContext)==null?void 0:s.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(s=>s.currentAsset===e||s.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=nn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let s=await tn(a);s&&this.setAiOutput(s)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let u=await this.getImageDimensions(n);if(u){let d=await this.showManualCropModal(e,u,n);if(!d)return;a=d}}let s=await tn(a);if(!s){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:s,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let p=window.addAssetToRegistry;typeof p=="function"&&p(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=d.path,this.handleAssetValueChange(i,t);let f=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(f&&h){let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof b=="function"&&v){let y=this.getFilenameFromPath(d.path);await b(f,y,c)}else this.applyObjectPropertyValue(f,h,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&f&&setTimeout(()=>{m(f,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(u){console.error("[CustomizePanel] \u274C Upload error:",u),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let s=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,s)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1392
+ `;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let s=n.querySelector("[data-ai-ref-button]");s==null||s.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var v,y;let b=(y=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?y:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var v,y;let b=(y=(v=this.aiBgToleranceInput)==null?void 0:v.value)!=null?y:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var v,y,w;let b=(w=(y=(v=this.aiReferenceInput)==null?void 0:v.files)==null?void 0:y[0])!=null?w: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,v,y,w,x,S,O,T,_,I,C,E,L;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=(y=(v=this.aiRemoveBgToggle)==null?void 0:v.checked)!=null?y:!1,a=n,s=n,o=Number((x=(w=this.aiStrengthInput)==null?void 0:w.value)!=null?x:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((S=l==null?void 0:l.value)==null?void 0:S.trim())||((O=this.aiBaseValue)==null?void 0:O.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let A=null,k=(T=this.getSelectedAssetKey())!=null?T:"unknown",P=(_=this.aiUseOutputToggle)!=null&&_.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((I=this.aiUseOutputToggle)!=null&&I.checked&&this.aiOutputDataUrl){let B=nn(this.aiOutputDataUrl,"ai-output.png");if(B){let W=await Oe(B);W&&(A={input:{base64:W.base64,mimeType:W.mimeType},dataUrl:W.dataUrl,width:W.width,height:W.height})}}if(A||(A=await this.getImageDataFromAsset(c)),!A){this.setAiStatus("Unable to load the base image.");return}let R=[A.input],M=!1;if(this.aiReferenceFile){let B=await Oe(this.aiReferenceFile);B?(R.push({base64:B.base64,mimeType:B.mimeType}),M=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let j=lr(i,{includeReference:M,includeMagenta:a,changeLevel:o}),D=(E=(C=this.aiReferenceFile)==null?void 0:C.name)!=null?E:"none";console.info("[AI] Final prompt:",j),console.info("[AI] Image sources:",{assetKey:k,base:P,reference:D});let V=Za(A.width,A.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await Ze(e,j,R,{aspectRatio:V,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,await this.refreshAiOutputFromRaw()}catch(A){console.error("[CustomizePanel] AI Generate Error:",A),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((L=this.aiStatusEl)==null?void 0:L.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,s,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Je(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),s=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&s)console.log("[CustomizePanel] Applying AI output directly to object:",a,s),this.applyObjectPropertyValue(a,s,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,s,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),p(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),f=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),h=this.getSelectedAssetInput();if(h&&(h.value=c.path,this.handleAssetValueChange((o=h.dataset.assetKey)!=null?o:"",h)),g&&f){console.log("[CustomizePanel] Applying saved asset to object:",g,f);let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&v){let y=this.getFilenameFromPath(c.path);await b(g,y,n)}else this.applyObjectPropertyValue(g,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{m(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var s;let t=(s=this.aiContext)==null?void 0:s.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(s=>s.currentAsset===e||s.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=nn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let s=await tn(a);s&&this.setAiOutput(s)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(n);if(p){let d=await this.showManualCropModal(e,p,n);if(!d)return;a=d}}let s=await tn(a);if(!s){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:s,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=d.path,this.handleAssetValueChange(i,t);let f=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(f&&h){let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof b=="function"&&v){let y=this.getFilenameFromPath(d.path);await b(f,y,c)}else this.applyObjectPropertyValue(f,h,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&f&&setTimeout(()=>{m(f,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let s=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,s)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1364
1393
  <div class="asset-preview-card">
1365
1394
  <div class="asset-preview-header">
1366
1395
  <div class="asset-preview-title">${e}</div>
@@ -1376,8 +1405,8 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1376
1405
  <img class="asset-preview-ai-image" alt="AI output preview">
1377
1406
  </div>
1378
1407
  </div>
1379
- `;let s=a.querySelector(".asset-preview-body"),o=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),u=a.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()}),a.addEventListener("click",d=>{d.target===a&&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(p=>{d.textContent=p!=null?p:"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(a),this.previewModal=a,this.updateAiModalPreview(u,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="function")return;let s=n(e);if(!s)return;let o=JSON.parse(JSON.stringify(s)),l=t.split("."),c=o;for(let u=0;u<l.length-1;u++){let d=l[u];c[d]=c[d]||{},c=c[d]}c[l[l.length-1]]=i,a(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 a;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(a=this.activePreviewFileInput)!=null?a:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=a=>{var p,g;a.preventDefault();let s=a.clientX,o=(g=(p=this.root)==null?void 0:p.getBoundingClientRect().width)!=null?g:0,l=260,c=620,u=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",u),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",u),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,a=URL.createObjectURL(e),s=await this.loadImage(a);try{URL.revokeObjectURL(a)}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 u=Math.min(860,window.innerWidth-60),f=Math.max(220,Math.floor((u-32-16)/2)),h=Math.min(520,window.innerHeight-240),m=f,b=m/n;b>h&&(b=h,m=b*n),c.innerHTML=`
1380
- <div class="asset-crop-card" style="width:${u}px;">
1408
+ `;let s=a.querySelector(".asset-preview-body"),o=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),p=a.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()}),a.addEventListener("click",d=>{d.target===a&&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(a),this.previewModal=a,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,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="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,a(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 a;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(a=this.activePreviewFileInput)!=null?a:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=a=>{var u,g;a.preventDefault();let s=a.clientX,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,a=URL.createObjectURL(e),s=await this.loadImage(a);try{URL.revokeObjectURL(a)}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=`
1409
+ <div class="asset-crop-card" style="width:${p}px;">
1381
1410
  <div class="asset-crop-header">
1382
1411
  <div>
1383
1412
  <div class="asset-crop-title">Crop to match current asset</div>
@@ -1406,7 +1435,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1406
1435
  <button class="asset-crop-apply" type="button">Apply Crop</button>
1407
1436
  </div>
1408
1437
  </div>
1409
- `;let v=c.querySelector(".asset-crop-canvas"),y=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),S=c.querySelector(".asset-crop-zoom-value"),_=c.querySelector(".asset-crop-close"),R=c.querySelector(".asset-crop-cancel"),T=c.querySelector(".asset-crop-apply"),M=c.querySelector(".asset-crop-reset");if(!v||!y||!x||!S){l(null);return}let I=v.getContext("2d"),A=y.getContext("2d");if(!I||!A){l(null);return}let w=s.naturalWidth,C=s.naturalHeight,E=Math.max(v.width/w,v.height/C),L=1,k=0,j=0,P=!1,O=0,D=0,V=0,H=0,B=()=>{let $=E*L,ie=Math.max(0,(w*$-v.width)/2),re=Math.max(0,(C*$-v.height)/2);k=Math.min(ie,Math.max(-ie,k)),j=Math.min(re,Math.max(-re,j))},W=()=>{let $=E*L;I.clearRect(0,0,v.width,v.height);let ie=v.width/2-w*$/2+k,re=v.height/2-C*$/2+j;if(I.drawImage(s,ie,re,w*$,C*$),A.clearRect(0,0,y.width,y.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let F=Math.max(y.width/o.naturalWidth,y.height/o.naturalHeight),Z=y.width/2-o.naturalWidth*F/2,Y=y.height/2-o.naturalHeight*F/2;A.drawImage(o,Z,Y,o.naturalWidth*F,o.naturalHeight*F)}else A.fillStyle="rgba(255, 255, 255, 0.04)",A.fillRect(0,0,y.width,y.height),A.strokeStyle="rgba(255, 255, 255, 0.08)",A.strokeRect(4,4,y.width-8,y.height-8);let pe=y.width/v.width*(E*L),se=k*(y.width/v.width),fe=j*(y.height/v.height),Ee=y.width/2-w*pe/2+se,Se=y.height/2-C*pe/2+fe;A.save(),A.globalAlpha=.7,A.drawImage(s,Ee,Se,w*pe,C*pe),A.restore()},J=()=>{k=0,j=0,B(),W()};x.addEventListener("input",()=>{L=Number(x.value),S.textContent=`${L.toFixed(2)}\xD7`,B(),W()}),v.addEventListener("pointerdown",$=>{P=!0,O=$.clientX,D=$.clientY,V=k,H=j,v.setPointerCapture($.pointerId)}),v.addEventListener("pointermove",$=>{P&&(k=V+($.clientX-O),j=H+($.clientY-D),B(),W())}),v.addEventListener("pointerup",$=>{P=!1,v.releasePointerCapture($.pointerId)}),v.addEventListener("pointerleave",()=>{P=!1});let de=()=>{c.remove()},we=()=>{de(),l(null)},$e=async()=>{let $=document.createElement("canvas");$.width=t.width,$.height=t.height;let ie=$.getContext("2d");if(!ie){de(),l(null);return}let re=L,se=Math.max($.width/w,$.height/C)*re,fe=$.width/v.width,Ee=k*fe,Se=j*fe,F=$.width/2-w*se/2+Ee,Z=$.height/2-C*se/2+Se;ie.drawImage(s,F,Z,w*se,C*se);let Y=await new Promise(te=>{$.toBlob(Me=>te(Me),e.type||"image/png")});if(de(),!Y){l(null);return}l(new File([Y],e.name,{type:Y.type}))};_==null||_.addEventListener("click",we),R==null||R.addEventListener("click",we),M==null||M.addEventListener("click",J),T==null||T.addEventListener("click",()=>{$e()}),c.addEventListener("click",$=>{$.target===c&&we()}),document.body.appendChild(c),J()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var gi=class{constructor(){this.root=null;this.options=null}render(){return`
1438
+ `;let v=c.querySelector(".asset-crop-canvas"),y=c.querySelector(".asset-crop-preview"),w=c.querySelector(".asset-crop-zoom"),x=c.querySelector(".asset-crop-zoom-value"),S=c.querySelector(".asset-crop-close"),O=c.querySelector(".asset-crop-cancel"),T=c.querySelector(".asset-crop-apply"),_=c.querySelector(".asset-crop-reset");if(!v||!y||!w||!x){l(null);return}let I=v.getContext("2d"),C=y.getContext("2d");if(!I||!C){l(null);return}let E=s.naturalWidth,L=s.naturalHeight,A=Math.max(v.width/E,v.height/L),k=1,P=0,R=0,M=!1,j=0,D=0,V=0,H=0,B=()=>{let $=A*k,ie=Math.max(0,(E*$-v.width)/2),re=Math.max(0,(L*$-v.height)/2);P=Math.min(ie,Math.max(-ie,P)),R=Math.min(re,Math.max(-re,R))},W=()=>{let $=A*k;I.clearRect(0,0,v.width,v.height);let ie=v.width/2-E*$/2+P,re=v.height/2-L*$/2+R;if(I.drawImage(s,ie,re,E*$,L*$),C.clearRect(0,0,y.width,y.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let F=Math.max(y.width/o.naturalWidth,y.height/o.naturalHeight),Z=y.width/2-o.naturalWidth*F/2,Y=y.height/2-o.naturalHeight*F/2;C.drawImage(o,Z,Y,o.naturalWidth*F,o.naturalHeight*F)}else C.fillStyle="rgba(255, 255, 255, 0.04)",C.fillRect(0,0,y.width,y.height),C.strokeStyle="rgba(255, 255, 255, 0.08)",C.strokeRect(4,4,y.width-8,y.height-8);let pe=y.width/v.width*(A*k),se=P*(y.width/v.width),fe=R*(y.height/v.height),Ee=y.width/2-E*pe/2+se,Se=y.height/2-L*pe/2+fe;C.save(),C.globalAlpha=.7,C.drawImage(s,Ee,Se,E*pe,L*pe),C.restore()},J=()=>{P=0,R=0,B(),W()};w.addEventListener("input",()=>{k=Number(w.value),x.textContent=`${k.toFixed(2)}\xD7`,B(),W()}),v.addEventListener("pointerdown",$=>{M=!0,j=$.clientX,D=$.clientY,V=P,H=R,v.setPointerCapture($.pointerId)}),v.addEventListener("pointermove",$=>{M&&(P=V+($.clientX-j),R=H+($.clientY-D),B(),W())}),v.addEventListener("pointerup",$=>{M=!1,v.releasePointerCapture($.pointerId)}),v.addEventListener("pointerleave",()=>{M=!1});let de=()=>{c.remove()},we=()=>{de(),l(null)},$e=async()=>{let $=document.createElement("canvas");$.width=t.width,$.height=t.height;let ie=$.getContext("2d");if(!ie){de(),l(null);return}let re=k,se=Math.max($.width/E,$.height/L)*re,fe=$.width/v.width,Ee=P*fe,Se=R*fe,F=$.width/2-E*se/2+Ee,Z=$.height/2-L*se/2+Se;ie.drawImage(s,F,Z,E*se,L*se);let Y=await new Promise(te=>{$.toBlob(Me=>te(Me),e.type||"image/png")});if(de(),!Y){l(null);return}l(new File([Y],e.name,{type:Y.type}))};S==null||S.addEventListener("click",we),O==null||O.addEventListener("click",we),_==null||_.addEventListener("click",J),T==null||T.addEventListener("click",()=>{$e()}),c.addEventListener("click",$=>{$.target===c&&we()}),document.body.appendChild(c),J()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var gi=class{constructor(){this.root=null;this.options=null}render(){return`
1410
1439
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
1411
1440
  <div class="scene-panel-header" data-panel-handle>
1412
1441
  <div class="panel-title">
@@ -1472,10 +1501,10 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1472
1501
  </div>
1473
1502
  </div>
1474
1503
  </div>
1475
- `}initialize(e,t){var v,y,x,S,_,R,T,M,I,A,w,C,E,L,k,j;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var O;let P=window.getEditableEngineConfig;if(typeof P=="function"){let D=P();return(O=D==null?void 0:D.loading)!=null?O:{}}return{}})(),a=(v=this.root)==null?void 0:v.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var P,O;(O=(P=this.options)==null?void 0:P.onUpdateLoading)==null||O.call(P,{type:a.value}),this.updateFieldVisibility(a.value)}));let s=(y=this.root)==null?void 0:y.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var P,O;(O=(P=this.options)==null?void 0:P.onUpdateLoading)==null||O.call(P,{background_color:s.value})}));let o=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(S=this.root)==null?void 0:S.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((_=n.overlay_alpha)!=null?_:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var O,D;let P=Number(o.value);l&&(l.textContent=P.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{overlay_alpha:P})}));let c=(R=this.root)==null?void 0:R.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var P,O;(O=(P=this.options)==null?void 0:P.onUpdateLoading)==null||O.call(P,{text:c.value})}));let u=(T=this.root)==null?void 0:T.querySelector("#loading-text-scale"),d=(M=this.root)==null?void 0:M.querySelector("#loading-text-scale-value");u&&(u.value=String((I=n.text_scale)!=null?I:.6),d&&(d.textContent=Number(u.value).toFixed(2)),u.addEventListener("input",()=>{var O,D;let P=Number(u.value);d&&(d.textContent=P.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{text_scale:P})}));let p=(A=this.root)==null?void 0:A.querySelector("#loading-enabled");p&&(p.checked=n.enabled!==!1,p.addEventListener("change",()=>{var P,O;(O=(P=this.options)==null?void 0:P.onUpdateLoading)==null||O.call(P,{enabled:p.checked})}));let g=(w=this.root)==null?void 0:w.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var P,O;(O=(P=this.options)==null?void 0:P.onUpdateLoading)==null||O.call(P,{blur_enabled:g.checked})}));let f=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength"),h=(E=this.root)==null?void 0:E.querySelector("#loading-blur-strength-value");f&&(f.value=String((L=n.blur_strength)!=null?L:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var P,O;h&&(h.textContent=f.value),(O=(P=this.options)==null?void 0:P.onUpdateLoading)==null||O.call(P,{blur_strength:Number(f.value)})}));let m=(k=this.root)==null?void 0:k.querySelector("#loading-show-btn"),b=(j=this.root)==null?void 0:j.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var P,O;(O=(P=this.options)==null?void 0:P.onShowLoadingScreen)==null||O.call(P)}),b==null||b.addEventListener("click",()=>{var P,O;(O=(P=this.options)==null?void 0:P.onHideLoadingScreen)==null||O.call(P)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Assets as hi}from"pixi.js";async function dr(r,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await hi.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,u=Object.keys(c||{}).filter(p=>{let g=e.replace(/s$/,"");return p.startsWith(g)||p.includes(g)});for(let p of u)be[p]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+p),(i=c[p])!=null&&i.texture&&(c[p].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+p+".texture"));let d=window.gameObjectManager;if(d)for(let p of u){let g=d.get(p);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:",p))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function pr(r,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,s=typeof a=="function"?a():null,o=(t=s==null?void 0:s.slots)==null?void 0:t.find(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(),u=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",u);let d=await hi.load(u);if(!d){console.error("[LIBRARY] Failed to load default texture:",u);return}let p=window.CustomAssets,g=e.replace(/s$/,""),f=Object.keys(p||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of f)be[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=p[m])!=null&&i.texture&&(p[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 v=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;v!=null&&v.texture&&(v.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function ur(r,e,t,i){var n,a,s,o,l,c,u,d,p,g,f,h,m,b,v;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let y=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",y);let x=Date.now(),S=`/raw/library/${i}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",S);let _=await hi.load(S);if(!_){console.error("[LIBRARY] Failed to load texture:",S);return}console.log("[LIBRARY] \u2705 Texture loaded"),be[y]=_,console.log("[LIBRARY] \u2705 Updated AssetTextures."+y);let R=window.CustomAssets;R!=null&&R[y]&&(R[y].texture=_,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+y));let T=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!T),T){let I=Array.from(((n=T.keys)==null?void 0:n.call(T))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",I);let A=T.get(y);if(console.log("[LIBRARY] gameObject for "+y+"?",!!A),A){let w=((a=A.getDisplayObject)==null?void 0:a.call(A))||A.pixiObject||A.pixi||A,C=(s=w==null?void 0:w.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",w),console.log("[LIBRARY] displayObject type:",C),console.log("[LIBRARY] has texture?",!!(w!=null&&w.texture)),w!=null&&w.texture)w.texture=_,console.log("[LIBRARY] \u2705 Applied to display object:",y);else if(C==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:E}=await import("pixi.js"),L=w.parent,k=(l=(o=L==null?void 0:L.getChildIndex)==null?void 0:o.call(L,w))!=null?l:0,j={x:w.x,y:w.y},P={x:(u=(c=w.anchor)==null?void 0:c.x)!=null?u:.5,y:(p=(d=w.anchor)==null?void 0:d.y)!=null?p:.5},O={x:(f=(g=w.scale)==null?void 0:g.x)!=null?f:1,y:(m=(h=w.scale)==null?void 0:h.y)!=null?m:1},D=(b=w.alpha)!=null?b:1,V=(v=w.visible)!=null?v:!0,H=new E(_);H.anchor.set(P.x,P.y),H.position.set(j.x,j.y),H.scale.set(O.x,O.y),H.alpha=D,H.visible=V,L&&(L.removeChild(w),L.addChildAt(H,k),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),A.pixiObject&&(A.pixiObject=H),A.pixi&&(A.pixi=H),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(w!=null&&w.children){let E=w.children.find(L=>L.texture);E?(E.texture=_,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let M=`raw/library/${i}/${t}`;ut({objectId:y,path:"render.asset.path",value:M}),console.log("[LIBRARY] \u2705 Staged config override for:",y,"path:",M)}catch(y){console.error("[LIBRARY] Error applying slot asset:",y)}}async function gr(r,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,s=Date.now(),o=`/raw/${t}?t=${s}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await hi.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}be[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let u=window.gameObjectManager;if(u){let d=u.get(a);if(d){let p=((n=d.getDisplayObject)==null?void 0:n.call(d))||d.pixiObject||d;p!=null&&p.texture&&(p.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",a))}}ut({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}import{Graphics as vr,Point as Ts}from"pixi.js";import{Point as hr}from"pixi.js";var je=()=>window.debugConfig||{},fr=()=>window.resolveAnchorVec2||(r=>({x:.5,y:.5})),mr=()=>window.resolveScreenAnchorPoint||(()=>new hr),br=()=>window.resolveScreenRatioPoint||(()=>new hr);function yr(r){fi(r)&&(r.objectDebugRaf||(r.objectDebugRaf=window.requestAnimationFrame(()=>mi(r))))}function xr(r){r.objectDebugRaf&&(window.cancelAnimationFrame(r.objectDebugRaf),r.objectDebugRaf=null),mt(r)}function fi(r){return r.isDebugOpen}function mi(r){var a,s,o;if(!fi(r)){r.objectDebugRaf=null;return}r.objectDebugRaf=window.requestAnimationFrame(()=>mi(r));let e=on(r);if(!e){ft(r,null),mt(r);return}let t=ln(r,e);if(!t){ft(r,null),mt(r);return}let i=new Ts;(a=t.getGlobalPosition)==null||a.call(t,i);let n=cn(r,t);ft(r,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),r.highlightObject?gn(r,t):fn(r),r.highlightAnchor&&n?hn(r,n):mn(r)}function on(r){var n;let e=r.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function ln(r,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function bt(r){let e=r.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function cn(r,e){var s,o;let t=bt(r);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=dn(r);if(!n)return null;if(i.position_ratio!=null)return br()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return mr()(n.width,n.height,a)}function dn(r){var a;let e=(a=r.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function pn(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectBoundsGfx&&r.objectBoundsGfx.parent!==e.stage&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectBoundsGfx||(r.objectBoundsGfx=new vr,r.objectBoundsGfx.zIndex=999999,e.stage.addChild(r.objectBoundsGfx)),r.objectBoundsGfx):null}function un(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectAnchorGfx&&r.objectAnchorGfx.parent!==e.stage&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null),r.objectAnchorGfx||(r.objectAnchorGfx=new vr,r.objectAnchorGfx.zIndex=1e6,e.stage.addChild(r.objectAnchorGfx)),r.objectAnchorGfx):null}function gn(r,e){var n;let t=pn(r);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function hn(r,e){let t=un(r);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function fn(r){r.objectBoundsGfx&&r.objectBoundsGfx.clear()}function mn(r){r.objectAnchorGfx&&r.objectAnchorGfx.clear()}function mt(r){r.objectBoundsGfx&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectAnchorGfx&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null)}function ft(r,e){r.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function wr(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function Er(r,e,t){var s;let i=e.split("."),n=i.pop(),a=r;for(let o of i)a[o]=(s=a[o])!=null?s:{},a=a[o];a[n]=t}function bn(r){var i,n,a,s,o;if(!r)return!1;if((i=r.transform)!=null&&i.offset)return!0;let e=((a=(n=r.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(s=r.identity)==null?void 0:s.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function vi(r){let e=je();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function Sr(r){window.location.reload()}function yi(r){let e=JSON.stringify(je(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function Ar(r,e){var t,i,n;if(!(!r.configViewer||!r.container))try{let a=window.getEditableObjectConfig,s=typeof a=="function"?a(e):null;if(!s){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-OH6SMCBB.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 p=await l(d.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,p),bi(r,p),(i=r.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),bi(r,s),(n=r.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function bi(r,e){var d,p,g,f,h,m,b,v,y,x;if(!r.container)return;let t=r.container.querySelector("#config-pos-x"),i=r.container.querySelector("#config-pos-y"),n=r.container.querySelector("#config-scale"),a=r.container.querySelector("#config-anchor-x"),s=r.container.querySelector("#config-anchor-y"),l=bn(e)?(d=e.transform)==null?void 0:d.offset:(p=e.transform)==null?void 0:p.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=(y=(b=e.transform)==null?void 0:b.anchor)!=null?y:(v=e.render)==null?void 0:v.anchor)!=null?x:{x:.5,y:.5},u=fr()(c);a&&(a.value=String(u.x)),s&&(s.value=String(u.y))}function Cr(r){var l,c,u,d,p,g,f,h,m,b;let e=r.selectedObjectId;if(!e||!r.container)return;let t=(c=(l=r.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(u=r.container.querySelector("#config-pos-y"))==null?void 0:u.value)!=null?d:"0",n=(g=(p=r.container.querySelector("#config-scale"))==null?void 0:p.value)!=null?g:"1",a=(h=(f=r.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",s=(b=(m=r.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",o=`${e}:
1504
+ `}initialize(e,t){var v,y,w,x,S,O,T,_,I,C,E,L,A,k,P,R;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var j;let M=window.getEditableEngineConfig;if(typeof M=="function"){let D=M();return(j=D==null?void 0:D.loading)!=null?j:{}}return{}})(),a=(v=this.root)==null?void 0:v.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var M,j;(j=(M=this.options)==null?void 0:M.onUpdateLoading)==null||j.call(M,{type:a.value}),this.updateFieldVisibility(a.value)}));let s=(y=this.root)==null?void 0:y.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var M,j;(j=(M=this.options)==null?void 0:M.onUpdateLoading)==null||j.call(M,{background_color:s.value})}));let o=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha"),l=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((S=n.overlay_alpha)!=null?S:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var j,D;let M=Number(o.value);l&&(l.textContent=M.toFixed(2)),(D=(j=this.options)==null?void 0:j.onUpdateLoading)==null||D.call(j,{overlay_alpha:M})}));let c=(O=this.root)==null?void 0:O.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var M,j;(j=(M=this.options)==null?void 0:M.onUpdateLoading)==null||j.call(M,{text:c.value})}));let p=(T=this.root)==null?void 0:T.querySelector("#loading-text-scale"),d=(_=this.root)==null?void 0:_.querySelector("#loading-text-scale-value");p&&(p.value=String((I=n.text_scale)!=null?I:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var j,D;let M=Number(p.value);d&&(d.textContent=M.toFixed(2)),(D=(j=this.options)==null?void 0:j.onUpdateLoading)==null||D.call(j,{text_scale:M})}));let u=(C=this.root)==null?void 0:C.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var M,j;(j=(M=this.options)==null?void 0:M.onUpdateLoading)==null||j.call(M,{enabled:u.checked})}));let g=(E=this.root)==null?void 0:E.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var M,j;(j=(M=this.options)==null?void 0:M.onUpdateLoading)==null||j.call(M,{blur_enabled:g.checked})}));let f=(L=this.root)==null?void 0:L.querySelector("#loading-blur-strength"),h=(A=this.root)==null?void 0:A.querySelector("#loading-blur-strength-value");f&&(f.value=String((k=n.blur_strength)!=null?k:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var M,j;h&&(h.textContent=f.value),(j=(M=this.options)==null?void 0:M.onUpdateLoading)==null||j.call(M,{blur_strength:Number(f.value)})}));let m=(P=this.root)==null?void 0:P.querySelector("#loading-show-btn"),b=(R=this.root)==null?void 0:R.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var M,j;(j=(M=this.options)==null?void 0:M.onShowLoadingScreen)==null||j.call(M)}),b==null||b.addEventListener("click",()=>{var M,j;(j=(M=this.options)==null?void 0:M.onHideLoadingScreen)==null||j.call(M)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Assets as hi}from"pixi.js";async function dr(r,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await hi.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of p)be[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(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function pr(r,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,s=typeof a=="function"?a():null,o=(t=s==null?void 0:s.slots)==null?void 0:t.find(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 hi.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)be[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 v=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;v!=null&&v.texture&&(v.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function ur(r,e,t,i){var n,a,s,o,l,c,p,d,u,g,f,h,m,b,v;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let y=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",y);let w=Date.now(),x=`/raw/library/${i}/${t}?t=${w}`;console.log("[LIBRARY] Loading texture from:",x);let S=await hi.load(x);if(!S){console.error("[LIBRARY] Failed to load texture:",x);return}console.log("[LIBRARY] \u2705 Texture loaded"),be[y]=S,console.log("[LIBRARY] \u2705 Updated AssetTextures."+y);let O=window.CustomAssets;O!=null&&O[y]&&(O[y].texture=S,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+y));let T=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!T),T){let I=Array.from(((n=T.keys)==null?void 0:n.call(T))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",I);let C=T.get(y);if(console.log("[LIBRARY] gameObject for "+y+"?",!!C),C){let E=((a=C.getDisplayObject)==null?void 0:a.call(C))||C.pixiObject||C.pixi||C,L=(s=E==null?void 0:E.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",E),console.log("[LIBRARY] displayObject type:",L),console.log("[LIBRARY] has texture?",!!(E!=null&&E.texture)),E!=null&&E.texture)E.texture=S,console.log("[LIBRARY] \u2705 Applied to display object:",y);else if(L==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:A}=await import("pixi.js"),k=E.parent,P=(l=(o=k==null?void 0:k.getChildIndex)==null?void 0:o.call(k,E))!=null?l:0,R={x:E.x,y:E.y},M={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},j={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},D=(b=E.alpha)!=null?b:1,V=(v=E.visible)!=null?v:!0,H=new A(S);H.anchor.set(M.x,M.y),H.position.set(R.x,R.y),H.scale.set(j.x,j.y),H.alpha=D,H.visible=V,k&&(k.removeChild(E),k.addChildAt(H,P),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),C.pixiObject&&(C.pixiObject=H),C.pixi&&(C.pixi=H),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(E!=null&&E.children){let A=E.children.find(k=>k.texture);A?(A.texture=S,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let _=`raw/library/${i}/${t}`;gt({objectId:y,path:"render.asset.path",value:_}),console.log("[LIBRARY] \u2705 Staged config override for:",y,"path:",_)}catch(y){console.error("[LIBRARY] Error applying slot asset:",y)}}async function gr(r,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,s=Date.now(),o=`/raw/${t}?t=${s}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await hi.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}be[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(a);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:",a))}}gt({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}import{Graphics as vr,Point as Ts}from"pixi.js";import{Point as hr}from"pixi.js";var je=()=>window.debugConfig||{},fr=()=>window.resolveAnchorVec2||(r=>({x:.5,y:.5})),mr=()=>window.resolveScreenAnchorPoint||(()=>new hr),br=()=>window.resolveScreenRatioPoint||(()=>new hr);function yr(r){fi(r)&&(r.objectDebugRaf||(r.objectDebugRaf=window.requestAnimationFrame(()=>mi(r))))}function xr(r){r.objectDebugRaf&&(window.cancelAnimationFrame(r.objectDebugRaf),r.objectDebugRaf=null),bt(r)}function fi(r){return r.isDebugOpen}function mi(r){var a,s,o;if(!fi(r)){r.objectDebugRaf=null;return}r.objectDebugRaf=window.requestAnimationFrame(()=>mi(r));let e=on(r);if(!e){mt(r,null),bt(r);return}let t=ln(r,e);if(!t){mt(r,null),bt(r);return}let i=new Ts;(a=t.getGlobalPosition)==null||a.call(t,i);let n=cn(r,t);mt(r,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),r.highlightObject?gn(r,t):fn(r),r.highlightAnchor&&n?hn(r,n):mn(r)}function on(r){var n;let e=r.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function ln(r,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function vt(r){let e=r.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function cn(r,e){var s,o;let t=vt(r);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=dn(r);if(!n)return null;if(i.position_ratio!=null)return br()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return mr()(n.width,n.height,a)}function dn(r){var a;let e=(a=r.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function pn(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectBoundsGfx&&r.objectBoundsGfx.parent!==e.stage&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectBoundsGfx||(r.objectBoundsGfx=new vr,r.objectBoundsGfx.zIndex=999999,e.stage.addChild(r.objectBoundsGfx)),r.objectBoundsGfx):null}function un(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectAnchorGfx&&r.objectAnchorGfx.parent!==e.stage&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null),r.objectAnchorGfx||(r.objectAnchorGfx=new vr,r.objectAnchorGfx.zIndex=1e6,e.stage.addChild(r.objectAnchorGfx)),r.objectAnchorGfx):null}function gn(r,e){var n;let t=pn(r);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function hn(r,e){let t=un(r);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function fn(r){r.objectBoundsGfx&&r.objectBoundsGfx.clear()}function mn(r){r.objectAnchorGfx&&r.objectAnchorGfx.clear()}function bt(r){r.objectBoundsGfx&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectAnchorGfx&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null)}function mt(r,e){r.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function wr(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function Er(r,e,t){var s;let i=e.split("."),n=i.pop(),a=r;for(let o of i)a[o]=(s=a[o])!=null?s:{},a=a[o];a[n]=t}function bn(r){var i,n,a,s,o;if(!r)return!1;if((i=r.transform)!=null&&i.offset)return!0;let e=((a=(n=r.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(s=r.identity)==null?void 0:s.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function vi(r){let e=je();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function Sr(r){window.location.reload()}function yi(r){let e=JSON.stringify(je(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function Ar(r,e){var t,i,n;if(!(!r.configViewer||!r.container))try{let a=window.getEditableObjectConfig,s=typeof a=="function"?a(e):null;if(!s){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-OH6SMCBB.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),bi(r,u),(i=r.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),bi(r,s),(n=r.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function bi(r,e){var d,u,g,f,h,m,b,v,y,w;if(!r.container)return;let t=r.container.querySelector("#config-pos-x"),i=r.container.querySelector("#config-pos-y"),n=r.container.querySelector("#config-scale"),a=r.container.querySelector("#config-anchor-x"),s=r.container.querySelector("#config-anchor-y"),l=bn(e)?(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=(w=(y=(b=e.transform)==null?void 0:b.anchor)!=null?y:(v=e.render)==null?void 0:v.anchor)!=null?w:{x:.5,y:.5},p=fr()(c);a&&(a.value=String(p.x)),s&&(s.value=String(p.y))}function Cr(r){var l,c,p,d,u,g,f,h,m,b;let e=r.selectedObjectId;if(!e||!r.container)return;let t=(c=(l=r.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=r.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(g=(u=r.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(h=(f=r.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",s=(b=(m=r.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",o=`${e}:
1476
1505
  position: (${t}, ${i})
1477
1506
  scale: ${n}
1478
- anchor: (${a}, ${s})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(v=>console.error("[DEBUG] Failed to copy config values:",v))}async function vn(r,e){var d,p,g,f,h,m,b,v,y,x,S;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!r.container)return;let t=r.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((p=(d=r.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?p:0),n=Number((f=(g=r.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),a=Number((m=(h=r.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),s=Number((v=(b=r.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?v:.5),o=Number((x=(y=r.container.querySelector("#config-anchor-y"))==null?void 0:y.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:s,anchorY:o});let{applyConfigOverride:l}=await import("./ConfigOverride-X57ZHK2W.js");l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:s,y:o}},{silent:e==null?void 0:e.silent});let c=bt(r);bn(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let u=window.applyEditableObjectConfig;if(typeof u=="function"){let _=(S=window.getEditableObjectConfig)==null?void 0:S.call(window,t);_?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),u(t,_)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Tr(r,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-X57ZHK2W.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(([u,d])=>{var p;if(u)if(u.includes(".")){let g=u.split("."),f=c;for(let h=0;h<g.length-1;h++){let m=g[h];f[m]=(p=f[m])!=null?p:{},f=f[m]}f[g[g.length-1]]=d}else c[u]=d}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function Lr(r){r.selectedObjectId&&(r.objectAutoApplyTimer&&window.clearTimeout(r.objectAutoApplyTimer),r.objectAutoApplyTimer=window.setTimeout(()=>{r.objectAutoApplyTimer=null,vn(r,{silent:!0})},150))}var Ls=3e3;function vt(r,e,t){let i=t!=null?t:r.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,s=0,o=0,l=0,c=0,u=0,d=g=>{if(!n)return;let f=i.getBoundingClientRect();r.style.left=`${g.clientX-f.left-c}px`,r.style.top=`${g.clientY-f.top-u}px`},p=()=>{n&&(n=!1,r.classList.remove("dragging"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let f=g.target;if(f!=null&&f.closest("button, input, select, textarea"))return;g.preventDefault();let h=r.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",r.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:h.left,top:h.top,width:h.width,height:h.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-h.left,u=g.clientY-h.top,console.log("[DRAG] offset:",{x:c,y:u});let b=h.left-m.left,v=h.top-m.top;console.log("[DRAG] targetPosition:",{left:b,top:v}),r.style.left=`${b}px`,r.style.top=`${v}px`,r.style.right="auto",r.style.bottom="auto",r.style.zIndex=String(++Ls),n=!0,r.classList.add("dragging"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function kr(r,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,s=0,o=0,l=0,c=!1,u=p=>{var v;if(!c)return;let g=p.clientX-o,f=p.clientY-l,h=Math.max(i,a+g),m=Math.max(n,s+f);r.style.width=`${h}px`,(v=r.closest(".preview-shell"))!=null&&v.classList.contains("layout-fixed")||(r.style.height=`${m}px`),t==null||t(h,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",u),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",p=>{if(p.button!==0)return;p.preventDefault(),p.stopPropagation();let g=r.getBoundingClientRect();a=g.width,s=g.height,o=p.clientX,l=p.clientY,c=!0,window.addEventListener("pointermove",u),window.addEventListener("pointerup",d)})}function yn(r,e){var h,m,b,v;let t=(b=(m=(h=r.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:r.debugOverlay)!=null?b:e.offsetParent;if(!t||(v=r.container)!=null&&v.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,s=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>s&&(e.style.width=`${s}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,u=l.top-i.top,d=Math.max(a,i.width-l.width-a),p=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),d),f=Math.min(Math.max(u,a),p);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function Ze(r){var i,n;if(!r.container)return;let e=r.container.querySelector("#debug-workbench");if(!e)return;if(yn(r,e),(i=r.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),s={activeTab:r.activeTab};if(a)try{s={...JSON.parse(a),activeTab:r.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(s));return}let t={activeTab:r.activeTab,width:e.style.width,height:(n=r.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function xi(r){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(r.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=r.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let s=(a=r.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!s?i.style.height=t.height:s&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),yn(r,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function xn(r,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",yn(r,e),Ze(r))}function Pr(r){var n,a,s;if(!r.container)return;let e=r.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=r.toggleDebug)==null||o.call(r)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=r.toggleDebug)==null?void 0:o.call(r,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>vi(r)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>yi(r)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;r.activeTab=l,wn(r),Ze(r)})}),Sn(r,e),En(r,e)}function wn(r){if(!r.container)return;let e=r.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===r.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===r.activeTab)})}function En(r,e){ge(r,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ge(r,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ge(r,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ge(r,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ge(r,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ge(r,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ge(r,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ge(r,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ge(r,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=je();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),s=je();s.layout&&(s.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Mr(r){if(!r.container||!r.debugOverlay)return;let e=r.container.querySelector("#debug-workbench"),t=r.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),vt(e,t,r.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Ze(r),xn(r,e)},10)}));let i=r.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),vt(i,n,r.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{xn(r,i)},10)})),i&&a&&kr(i,a);let s=r.container.querySelector('[data-panel="scene-tools-corner"]'),o=s==null?void 0:s.querySelector("[data-panel-handle]");s&&o&&vt(s,o,r.debugOverlay);let l=r.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&vt(l,c,r.debugOverlay),xi(r)}function Sn(r,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function ge(r,e,t,i,n){let a=e.querySelector(`#${t}`),s=e.querySelector(n);if(!a||!s)return;let o=wr(je(),i);typeof o=="number"&&(a.value=String(o),s.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);s.textContent=String(l),Er(je(),i,l)})}var wi=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=$t(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let u of n){let d=u.objectId||"Engine";a[d]||(a[d]=[]),a[d].push(u)}let s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1507
+ anchor: (${a}, ${s})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(v=>console.error("[DEBUG] Failed to copy config values:",v))}async function vn(r,e){var d,u,g,f,h,m,b,v,y,w,x;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!r.container)return;let t=r.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=r.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(g=r.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),a=Number((m=(h=r.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),s=Number((v=(b=r.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?v:.5),o=Number((w=(y=r.container.querySelector("#config-anchor-y"))==null?void 0:y.value)!=null?w:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:s,anchorY:o});let{applyConfigOverride:l}=await import("./ConfigOverride-X57ZHK2W.js");l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:s,y:o}},{silent:e==null?void 0:e.silent});let c=vt(r);bn(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let S=(x=window.getEditableObjectConfig)==null?void 0:x.call(window,t);S?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,S)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Tr(r,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-X57ZHK2W.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 a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function Lr(r){r.selectedObjectId&&(r.objectAutoApplyTimer&&window.clearTimeout(r.objectAutoApplyTimer),r.objectAutoApplyTimer=window.setTimeout(()=>{r.objectAutoApplyTimer=null,vn(r,{silent:!0})},150))}var Ls=3e3;function yt(r,e,t){let i=t!=null?t:r.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,s=0,o=0,l=0,c=0,p=0,d=g=>{if(!n)return;let f=i.getBoundingClientRect();r.style.left=`${g.clientX-f.left-c}px`,r.style.top=`${g.clientY-f.top-p}px`},u=()=>{n&&(n=!1,r.classList.remove("dragging"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let f=g.target;if(f!=null&&f.closest("button, input, select, textarea"))return;g.preventDefault();let h=r.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",r.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:h.left,top:h.top,width:h.width,height:h.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-h.left,p=g.clientY-h.top,console.log("[DRAG] offset:",{x:c,y:p});let b=h.left-m.left,v=h.top-m.top;console.log("[DRAG] targetPosition:",{left:b,top:v}),r.style.left=`${b}px`,r.style.top=`${v}px`,r.style.right="auto",r.style.bottom="auto",r.style.zIndex=String(++Ls),n=!0,r.classList.add("dragging"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function kr(r,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,s=0,o=0,l=0,c=!1,p=u=>{var v;if(!c)return;let g=u.clientX-o,f=u.clientY-l,h=Math.max(i,a+g),m=Math.max(n,s+f);r.style.width=`${h}px`,(v=r.closest(".preview-shell"))!=null&&v.classList.contains("layout-fixed")||(r.style.height=`${m}px`),t==null||t(h,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=r.getBoundingClientRect();a=g.width,s=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function yn(r,e){var h,m,b,v;let t=(b=(m=(h=r.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:r.debugOverlay)!=null?b:e.offsetParent;if(!t||(v=r.container)!=null&&v.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,s=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>s&&(e.style.width=`${s}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),d),f=Math.min(Math.max(p,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function Qe(r){var i,n;if(!r.container)return;let e=r.container.querySelector("#debug-workbench");if(!e)return;if(yn(r,e),(i=r.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),s={activeTab:r.activeTab};if(a)try{s={...JSON.parse(a),activeTab:r.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(s));return}let t={activeTab:r.activeTab,width:e.style.width,height:(n=r.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function xi(r){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(r.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=r.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let s=(a=r.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!s?i.style.height=t.height:s&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),yn(r,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function xn(r,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",yn(r,e),Qe(r))}function Pr(r){var n,a,s;if(!r.container)return;let e=r.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=r.toggleDebug)==null||o.call(r)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=r.toggleDebug)==null?void 0:o.call(r,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>vi(r)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>yi(r)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;r.activeTab=l,wn(r),Qe(r)})}),Sn(r,e),En(r,e)}function wn(r){if(!r.container)return;let e=r.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===r.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===r.activeTab)})}function En(r,e){ge(r,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ge(r,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ge(r,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ge(r,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ge(r,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ge(r,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ge(r,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ge(r,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ge(r,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=je();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),s=je();s.layout&&(s.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Mr(r){if(!r.container||!r.debugOverlay)return;let e=r.container.querySelector("#debug-workbench"),t=r.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),yt(e,t,r.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Qe(r),xn(r,e)},10)}));let i=r.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),yt(i,n,r.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{xn(r,i)},10)})),i&&a&&kr(i,a);let s=r.container.querySelector('[data-panel="scene-tools-corner"]'),o=s==null?void 0:s.querySelector("[data-panel-handle]");s&&o&&yt(s,o,r.debugOverlay);let l=r.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&yt(l,c,r.debugOverlay),xi(r)}function Sn(r,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function ge(r,e,t,i,n){let a=e.querySelector(`#${t}`),s=e.querySelector(n);if(!a||!s)return;let o=wr(je(),i);typeof o=="number"&&(a.value=String(o),s.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);s.textContent=String(l),Er(je(),i,l)})}var wi=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=Be(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let p of n){let d=p.objectId||"Engine";a[d]||(a[d]=[]),a[d].push(p)}let s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1479
1508
  <div class="config-persistence-panel">
1480
1509
  <!-- Status Footer (Always Visible) -->
1481
1510
  <div class="persistence-status-footer">
@@ -1548,9 +1577,9 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1548
1577
  <label>Switch to:</label>
1549
1578
  <select id="version-selector" class="version-dropdown">
1550
1579
  <option value="">Original</option>
1551
- ${this.availableVersions.map(u=>`
1552
- <option value="${u.name}" ${u.name===this.currentVersion?"selected":""}>
1553
- ${u.name}${u.name===this.currentVersion?" (Current)":""} - ${new Date(u.lastApplied).toLocaleDateString()}
1580
+ ${this.availableVersions.map(p=>`
1581
+ <option value="${p.name}" ${p.name===this.currentVersion?"selected":""}>
1582
+ ${p.name}${p.name===this.currentVersion?" (Current)":""} - ${new Date(p.lastApplied).toLocaleDateString()}
1554
1583
  </option>
1555
1584
  `).join("")}
1556
1585
  </select>
@@ -1580,20 +1609,20 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1580
1609
  <button class="staging-clear-all" id="clear-all-overrides">Discard All</button>
1581
1610
  </div>
1582
1611
  <div class="staging-list">
1583
- ${Object.entries(a).map(([u,d])=>`
1612
+ ${Object.entries(a).map(([p,d])=>`
1584
1613
  <div class="staging-group">
1585
1614
  <div class="staging-group-title">
1586
- <span class="group-icon">${u==="Engine"?"\u2699\uFE0F":"\u{1F4E6}"}</span>
1587
- <span class="group-id">${u}</span>
1615
+ <span class="group-icon">${p==="Engine"?"\u2699\uFE0F":"\u{1F4E6}"}</span>
1616
+ <span class="group-id">${p}</span>
1588
1617
  </div>
1589
1618
  <div class="staging-items">
1590
- ${d.map(p=>`
1619
+ ${d.map(u=>`
1591
1620
  <div class="staging-item">
1592
- <div class="item-path">${p.path}</div>
1593
- <div class="item-value" title="${JSON.stringify(p.value)}">
1594
- ${this.formatValue(p.value)}
1621
+ <div class="item-path">${u.path}</div>
1622
+ <div class="item-value" title="${JSON.stringify(u.value)}">
1623
+ ${this.formatValue(u.value)}
1595
1624
  </div>
1596
- <button class="item-remove" data-remove-path="${p.path}" data-remove-id="${p.objectId||""}" title="Discard this change">\xD7</button>
1625
+ <button class="item-remove" data-remove-path="${u.path}" data-remove-id="${u.objectId||""}" title="Discard this change">\xD7</button>
1597
1626
  </div>
1598
1627
  `).join("")}
1599
1628
  </div>
@@ -1627,7 +1656,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1627
1656
  <p class="info-hint"><strong>Version Switching:</strong> Always clears overrides and reloads from selected Source.</p>
1628
1657
  </div>
1629
1658
  </div>
1630
- `}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 g;if(e.getAttribute("disabled")!==null)return;if(!$t().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
1659
+ `}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 g;if(e.getAttribute("disabled")!==null)return;if(!Be().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
1631
1660
 
1632
1661
  This will:
1633
1662
  \u2022 Create a new version snapshot
@@ -1637,7 +1666,7 @@ This will:
1637
1666
 
1638
1667
  This will write all staged changes to ${d}.
1639
1668
 
1640
- After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let g=Dt(),f={};for(let[b,v]of Object.entries(g.objects)){let y=v,x=b;/^(json\.|ui\.|effects\.|engine\.)/.test(x)||(x=`json.${b}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=x),f[`objects/${x}.json`]=y}g.engine&&(g.engine.runtime&&(f["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(f["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(f["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(f["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(f["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(f["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(f["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(f["engine/engine.json"]=g.engine));for(let[b,v]of Object.entries(g.scenes)){let y=b.startsWith("scene.")?b:`scene.${b}`;f[`scenes/${y}.json`]=v}let h=this.currentVersion?"/api/apply-current":"/api/apply-direct",m=await fetch(h,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:f,assets:{},hadCacheAtApply:!0})});if(!m.ok){let b=await m.json();throw new Error(b.error||"Apply to current source failed")}Fe(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Apply current failed:",g),alert(`\u274C Apply to current source failed: ${g.message}`),t.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1669
+ After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let g=$t(),f={};for(let[b,v]of Object.entries(g.objects)){let y=v,w=b;/^(json\.|ui\.|effects\.|engine\.)/.test(w)||(w=`json.${b}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=w),f[`objects/${w}.json`]=y}g.engine&&(g.engine.runtime&&(f["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(f["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(f["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(f["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(f["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(f["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(f["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(f["engine/engine.json"]=g.engine));for(let[b,v]of Object.entries(g.scenes)){let y=b.startsWith("scene.")?b:`scene.${b}`;f[`scenes/${y}.json`]=v}let h=this.currentVersion?"/api/apply-current":"/api/apply-direct",m=await fetch(h,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:f,assets:{},hadCacheAtApply:!0})});if(!m.ok){let b=await m.json();throw new Error(b.error||"Apply to current source failed")}Fe(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Apply current failed:",g),alert(`\u274C Apply to current source failed: ${g.message}`),t.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1641
1670
 
1642
1671
  This will DIRECTLY MODIFY base configuration files.
1643
1672
 
@@ -1647,13 +1676,13 @@ This is ONLY for active development.
1647
1676
 
1648
1677
  Make sure your project is under Git version control.
1649
1678
 
1650
- Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let p=Dt(),g={};for(let[h,m]of Object.entries(p.objects)){let b=m,v=h;/^(json\.|ui\.|effects\.|engine\.)/.test(v)||(v=`json.${h}`),b&&typeof b=="object"&&(b.identity||(b.identity={}),b.identity.id=v),g[`objects/${v}.json`]=b}p.engine&&(p.engine.runtime&&(g["engine/engine.runtime.json"]=p.engine.runtime),p.engine.assets&&(g["engine/engine.assets.json"]=p.engine.assets),p.engine.splash&&(g["engine/engine.splash.json"]=p.engine.splash),p.engine.loading&&(g["engine/engine.loading.json"]=p.engine.loading),p.engine.start&&(g["engine/engine.start.json"]=p.engine.start),p.engine.tutorial&&(g["engine/engine.tutorial.json"]=p.engine.tutorial),p.engine.endgame&&(g["engine/engine.endgame.json"]=p.engine.endgame),!p.engine.runtime&&!p.engine.assets&&(g["engine/engine.json"]=p.engine));for(let[h,m]of Object.entries(p.scenes)){let b=h.startsWith("scene.")?h:`scene.${h}`;g[`scenes/${b}.json`]=m}let f=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:g,assets:{}})});if(!f.ok){let h=await f.json();throw new Error(h.error||"Apply to base failed")}Fe(),this.showSuccessNotification(),this.refreshPanel()}catch(p){console.error("[ConfigPersistence] Apply to base failed:",p),alert(`\u274C Apply to base failed: ${p.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 d=>{let g=d.target.value;await this.switchVersion(g)}),this.container.querySelectorAll(".item-remove").forEach(d=>{d.addEventListener("click",()=>{let p=d.dataset.removePath,g=d.dataset.removeId;da(g||void 0,p)})});let s=this.container.querySelector("#clear-all-overrides"),o=this.container.querySelector("#discard-all-overrides-btn"),l=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(Fe(),qi(),this.refreshPanel())};s==null||s.addEventListener("click",l),o==null||o.addEventListener("click",l);let c=this.container.querySelector("#reset-to-applied-btn");c==null||c.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&qi()});let u=this.container.querySelector("#reset-to-original-btn");u==null||u.addEventListener("click",async()=>{await ha()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
1679
+ Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let u=$t(),g={};for(let[h,m]of Object.entries(u.objects)){let b=m,v=h;/^(json\.|ui\.|effects\.|engine\.)/.test(v)||(v=`json.${h}`),b&&typeof b=="object"&&(b.identity||(b.identity={}),b.identity.id=v),g[`objects/${v}.json`]=b}u.engine&&(u.engine.runtime&&(g["engine/engine.runtime.json"]=u.engine.runtime),u.engine.assets&&(g["engine/engine.assets.json"]=u.engine.assets),u.engine.splash&&(g["engine/engine.splash.json"]=u.engine.splash),u.engine.loading&&(g["engine/engine.loading.json"]=u.engine.loading),u.engine.start&&(g["engine/engine.start.json"]=u.engine.start),u.engine.tutorial&&(g["engine/engine.tutorial.json"]=u.engine.tutorial),u.engine.endgame&&(g["engine/engine.endgame.json"]=u.engine.endgame),!u.engine.runtime&&!u.engine.assets&&(g["engine/engine.json"]=u.engine));for(let[h,m]of Object.entries(u.scenes)){let b=h.startsWith("scene.")?h:`scene.${h}`;g[`scenes/${b}.json`]=m}let f=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:g,assets:{}})});if(!f.ok){let h=await f.json();throw new Error(h.error||"Apply to base failed")}Fe(),this.showSuccessNotification(),this.refreshPanel()}catch(u){console.error("[ConfigPersistence] Apply to base failed:",u),alert(`\u274C Apply to base failed: ${u.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 d=>{let g=d.target.value;await this.switchVersion(g)}),this.container.querySelectorAll(".item-remove").forEach(d=>{d.addEventListener("click",()=>{let u=d.dataset.removePath,g=d.dataset.removeId;da(g||void 0,u)})});let s=this.container.querySelector("#clear-all-overrides"),o=this.container.querySelector("#discard-all-overrides-btn"),l=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(Fe(),qi(),this.refreshPanel())};s==null||s.addEventListener("click",l),o==null||o.addEventListener("click",l);let c=this.container.querySelector("#reset-to-applied-btn");c==null||c.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&qi()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await ha()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
1651
1680
  <div class="notify-icon">\u2705</div>
1652
1681
  <div class="notify-content">
1653
1682
  <strong>${i}</strong>
1654
1683
  <span>Project files updated.</span>
1655
1684
  </div>
1656
- `,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,s;let t=$t();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
1685
+ `,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,s;let t=Be();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
1657
1686
 
1658
1687
  You have ${t.overrideCount} staged changes that will be discarded.
1659
1688
 
@@ -1665,7 +1694,7 @@ This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snaps
1665
1694
 
1666
1695
  This cannot be undone unless you have git commits or backups.
1667
1696
 
1668
- Are you absolutely sure?`))try{let t=Dt(),i={};for(let[a,s]of Object.entries(t.objects)){let o=s,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[a,s]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=s}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Direct apply failed")}Fe(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Ei=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new Vt;this.sceneToolsPanel=new Yt;this.nudgePanel=new Wt;this.inspectorPanel=new li;this.libraryPanel=new ht;this.libraryPanelDocked=new ht;this.brandVisionPanel=new pi;this.customizeSettingsPanel=new ui;this.configPersistencePanel=new wi;this.loadingScreenPanel=new gi}applyAssetChange(e,t){return dr(this,e,t)}resetAsset(e){return pr(this,e)}applySlotAsset(e,t,i){return ur(this,e,t,i)}resetSlotAsset(e,t,i){return gr(this,e,t,i)}startObjectVisuals(){return yr(this)}stopObjectVisuals(){return xr(this)}shouldRunObjectVisuals(){return fi(this)}updateObjectVisuals(){return mi(this)}getSelectedInstanceId(){return on(this)}getDisplayObjectById(e){return ln(this,e)}getSelectedObjectConfig(){return bt(this)}getConfigAnchorWorldPoint(e){return cn(this,e)}getScreenSize(){return dn(this)}ensureBoundsGfx(){return pn(this)}ensureAnchorGfx(){return un(this)}drawBounds(e){return gn(this,e)}drawAnchor(e){return hn(this,e)}clearBounds(){return fn(this)}clearAnchor(){return mn(this)}clearObjectVisuals(){return mt(this)}updateObjectInfo(e){return ft(this,e)}resetDebugConfig(){return vi(this)}applyDebugConfig(){return Sr(this)}exportDebugConfig(){return yi(this)}loadObjectConfig(e){return Ar(this,e)}fillConfigViewer(e){return bi(this,e)}copyConfigValues(){return Cr(this)}applyObjectConfig(e){return vn(this,e)}applyCustomizeSettings(e,t){return Tr(this,e,t)}scheduleObjectAutoApply(){return Lr(this)}setupDebugEventListeners(){return Pr(this)}setupDebugInputListeners(e){return En(this,e)}setupPanelLayout(){return Mr(this)}setupCollapsiblePanels(e){return Sn(this,e)}setupRangeInput(e,t,i,n){return ge(this,e,t,i,n)}updateWorkbenchTabs(){return wn(this)}saveWorkbenchState(){return Ze(this)}loadWorkbenchState(){return xi(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let a=localStorage.getItem("preview_workbench_state");if(a){let s=JSON.parse(a);s.activeTab&&(this.activeTab=s.activeTab)}}catch(a){console.warn("[PREVIEW] Failed to load workbench tab state",a)}this.sceneObjectsPanel.initialize(e,{onSelect:a=>this.handleObjectSelect(a)}),this.libraryPanel.initialize(e,{onApply:(a,s,o)=>this.applySlotAsset(a,s,o),onReset:(a,s,o)=>this.resetSlotAsset(a,s,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,s,o)=>this.applySlotAsset(a,s,o),onReset:(a,s,o)=>this.resetSlotAsset(a,s,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,s,o)=>{console.log("[Inspector] Property changed:",a,s,o)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,s)=>this.applyCustomizeSettings(a,s)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:a=>{this.highlightObject=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:a=>{this.highlightAnchor=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(a,s)=>this.nudgeSelectedObject(a,s),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,s)=>{var g,f,h,m,b,v;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((f=l==null?void 0:l.x)!=null?f:0)+a,u=((h=l==null?void 0:l.y)!=null?h:0)+s,{applyConfigOverride:d}=await import("./ConfigOverride-X57ZHK2W.js");d({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:u}},{silent:!0,emitEvent:!0});let p=window.applyEditableObjectConfig;if(typeof p=="function"){let y=window.__editableConfig,x=(v=(b=(m=y==null?void 0:y.objects)==null?void 0:m.get)==null?void 0:b.call(m,this.selectedObjectId))!=null?v:o;await p(this.selectedObjectId,x)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var d,p,g,f,h;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let o=(p=(d=s.transform)==null?void 0:d.scale)!=null?p:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await import("./ConfigOverride-X57ZHK2W.js");c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let m=window.__editableConfig,b=(h=(f=(g=m==null?void 0:m.objects)==null?void 0:g.get)==null?void 0:f.call(g,this.selectedObjectId))!=null?h:s;await u(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let a=window;typeof a.__previewShowLoading=="function"?a.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let a=window;typeof a.__previewHideLoading=="function"?a.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:a=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({loading:a}),typeof s.__previewUpdateLoading=="function"?s.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,s,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,s,o,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var s,o;((s=a.detail)==null?void 0:s.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,s,o)=>this.applySlotAsset(a,s,o),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var s;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((s=o==null?void 0:o.engine)==null?void 0:s.splash)||null}return null},window.addAssetToRegistry=(a,s)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(u=>u.filename===s))){let u=s.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:s,displayName:u}),console.log(`[DEBUG] Added ${s} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,s)=>{this.libraryPanel.highlightSlot(a,s)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
1697
+ Are you absolutely sure?`))try{let t=$t(),i={};for(let[a,s]of Object.entries(t.objects)){let o=s,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[a,s]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=s}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Direct apply failed")}Fe(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Ei=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new Vt;this.sceneToolsPanel=new Yt;this.nudgePanel=new Wt;this.inspectorPanel=new li;this.libraryPanel=new ft;this.libraryPanelDocked=new ft;this.brandVisionPanel=new pi;this.customizeSettingsPanel=new ui;this.configPersistencePanel=new wi;this.loadingScreenPanel=new gi}applyAssetChange(e,t){return dr(this,e,t)}resetAsset(e){return pr(this,e)}applySlotAsset(e,t,i){return ur(this,e,t,i)}resetSlotAsset(e,t,i){return gr(this,e,t,i)}startObjectVisuals(){return yr(this)}stopObjectVisuals(){return xr(this)}shouldRunObjectVisuals(){return fi(this)}updateObjectVisuals(){return mi(this)}getSelectedInstanceId(){return on(this)}getDisplayObjectById(e){return ln(this,e)}getSelectedObjectConfig(){return vt(this)}getConfigAnchorWorldPoint(e){return cn(this,e)}getScreenSize(){return dn(this)}ensureBoundsGfx(){return pn(this)}ensureAnchorGfx(){return un(this)}drawBounds(e){return gn(this,e)}drawAnchor(e){return hn(this,e)}clearBounds(){return fn(this)}clearAnchor(){return mn(this)}clearObjectVisuals(){return bt(this)}updateObjectInfo(e){return mt(this,e)}resetDebugConfig(){return vi(this)}applyDebugConfig(){return Sr(this)}exportDebugConfig(){return yi(this)}loadObjectConfig(e){return Ar(this,e)}fillConfigViewer(e){return bi(this,e)}copyConfigValues(){return Cr(this)}applyObjectConfig(e){return vn(this,e)}applyCustomizeSettings(e,t){return Tr(this,e,t)}scheduleObjectAutoApply(){return Lr(this)}setupDebugEventListeners(){return Pr(this)}setupDebugInputListeners(e){return En(this,e)}setupPanelLayout(){return Mr(this)}setupCollapsiblePanels(e){return Sn(this,e)}setupRangeInput(e,t,i,n){return ge(this,e,t,i,n)}updateWorkbenchTabs(){return wn(this)}saveWorkbenchState(){return Qe(this)}loadWorkbenchState(){return xi(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let a=localStorage.getItem("preview_workbench_state");if(a){let s=JSON.parse(a);s.activeTab&&(this.activeTab=s.activeTab)}}catch(a){console.warn("[PREVIEW] Failed to load workbench tab state",a)}this.sceneObjectsPanel.initialize(e,{onSelect:a=>this.handleObjectSelect(a)}),this.libraryPanel.initialize(e,{onApply:(a,s,o)=>this.applySlotAsset(a,s,o),onReset:(a,s,o)=>this.resetSlotAsset(a,s,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,s,o)=>this.applySlotAsset(a,s,o),onReset:(a,s,o)=>this.resetSlotAsset(a,s,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,s,o)=>{console.log("[Inspector] Property changed:",a,s,o)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,s)=>this.applyCustomizeSettings(a,s)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:a=>{this.highlightObject=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:a=>{this.highlightAnchor=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(a,s)=>this.nudgeSelectedObject(a,s),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,s)=>{var g,f,h,m,b,v;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((f=l==null?void 0:l.x)!=null?f:0)+a,p=((h=l==null?void 0:l.y)!=null?h:0)+s,{applyConfigOverride:d}=await import("./ConfigOverride-X57ZHK2W.js");d({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:p}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let y=window.__editableConfig,w=(v=(b=(m=y==null?void 0:y.objects)==null?void 0:m.get)==null?void 0:b.call(m,this.selectedObjectId))!=null?v:o;await u(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var d,u,g,f,h;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let o=(u=(d=s.transform)==null?void 0:d.scale)!=null?u:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await import("./ConfigOverride-X57ZHK2W.js");c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let p=window.applyEditableObjectConfig;if(typeof p=="function"){let m=window.__editableConfig,b=(h=(f=(g=m==null?void 0:m.objects)==null?void 0:g.get)==null?void 0:f.call(g,this.selectedObjectId))!=null?h:s;await p(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let a=window;typeof a.__previewShowLoading=="function"?a.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let a=window;typeof a.__previewHideLoading=="function"?a.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:a=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({loading:a}),typeof s.__previewUpdateLoading=="function"?s.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,s,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,s,o,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var s,o;((s=a.detail)==null?void 0:s.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,s,o)=>this.applySlotAsset(a,s,o),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var s;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((s=o==null?void 0:o.engine)==null?void 0:s.splash)||null}return null},window.addAssetToRegistry=(a,s)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(p=>p.filename===s))){let p=s.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:s,displayName:p}),console.log(`[DEBUG] Added ${s} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,s)=>{this.libraryPanel.highlightSlot(a,s)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
1669
1698
  <div class="debug-overlay hidden" id="debug-overlay">
1670
1699
  <div class="debug-workbench" id="debug-workbench">
1671
1700
  <div class="workbench-header" id="workbench-handle">
@@ -1712,7 +1741,7 @@ Are you absolutely sure?`))try{let t=Dt(),i={};for(let[a,s]of Object.entries(t.o
1712
1741
  ${this.sceneToolsPanel.render()}
1713
1742
  ${this.nudgePanel.render()}
1714
1743
  </div>
1715
- `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}nudgeSelectedObject(e,t){var u,d,p;if(!this.selectedObjectId||!this.container)return;let i=this.nudgePanel.getNudgeStep(),n=this.container.querySelector("#config-pos-x"),a=this.container.querySelector("#config-pos-y");if(!n||!a)return;let s=Number((u=n.value)!=null?u:0),o=Number((d=a.value)!=null?d:0),l=s+e*i,c=o+t*i;n&&(n.value=String(l)),a&&(a.value=String(c)),(p=this.configViewer)==null||p.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function ks(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function Ps(r){var n;let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function Ms(r){return`
1744
+ `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}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"),a=this.container.querySelector("#config-pos-y");if(!n||!a)return;let s=Number((p=n.value)!=null?p:0),o=Number((d=a.value)!=null?d:0),l=s+e*i,c=o+t*i;n&&(n.value=String(l)),a&&(a.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function ks(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function Ps(r){var n;let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function Ms(r){return`
1716
1745
  Analyze these screenshots of a brand or game and extract its "Brand DNA".
1717
1746
 
1718
1747
  Provide a concise summary (2-3 sentences) covering:
@@ -1729,9 +1758,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
1729
1758
  ${r?`
1730
1759
  ADDITIONAL RULES/NOTES:
1731
1760
  ${r}`:""}
1732
- `.trim()}function _r(){let r=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let s=await ks(a),o=Ps(s),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:o.base64,mimeType:o.mimeType,dataUrl:s};r.push(l),n.push(l)}return n},getSources(){return r.slice()},async analyze(i,n,a){if(r.length===0)throw new Error("No screenshots to analyze.");let s=Ms(n),o=r.map(p=>({base64:p.base64,mimeType:p.mimeType})),l=await di(i,s,o,{model:a}),c=e,u=[],d=l.split(`
1733
- `);for(let p of d)if(p.toLowerCase().startsWith("summary:"))c=p.slice(8).trim();else if(p.toLowerCase().includes("palette:")){let g=p.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(f=>{u.includes(f.toUpperCase())||u.push(f.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
1734
- Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:u.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Be="handler_api_key_";var Qe=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${Be}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Be}${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=`${Be}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Be}${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(Be)){let n=i.substring(Be.length),a=localStorage.getItem(i);if(a){let s=JSON.parse(a);e.push({service:n,label:s.label,created:s.created,lastUsed:s.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(Be)&&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}}},An=()=>Qe.getKey("gemini"),Cn=(r,e)=>Qe.setKey("gemini",r,e),_s=()=>Qe.hasKey("gemini");window.ApiKeyStorage=Qe;window.getGeminiApiKey=An;window.setGeminiApiKey=Cn;window.hasGeminiApiKey=_s;var Ln=class{constructor(){this.modal=null;this.options=null;this.analyzer=_r();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
1761
+ `.trim()}function _r(){let r=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let s=await ks(a),o=Ps(s),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:o.base64,mimeType:o.mimeType,dataUrl:s};r.push(l),n.push(l)}return n},getSources(){return r.slice()},async analyze(i,n,a){if(r.length===0)throw new Error("No screenshots to analyze.");let s=Ms(n),o=r.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await di(i,s,o,{model:a}),c=e,p=[],d=l.split(`
1762
+ `);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(`
1763
+ 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 Ue="handler_api_key_";var et=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${Ue}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Ue}${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=`${Ue}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Ue}${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(Ue)){let n=i.substring(Ue.length),a=localStorage.getItem(i);if(a){let s=JSON.parse(a);e.push({service:n,label:s.label,created:s.created,lastUsed:s.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(Ue)&&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}}},An=()=>et.getKey("gemini"),Cn=(r,e)=>et.setKey("gemini",r,e),_s=()=>et.hasKey("gemini");window.ApiKeyStorage=et;window.getGeminiApiKey=An;window.setGeminiApiKey=Cn;window.hasGeminiApiKey=_s;var Ln=class{constructor(){this.modal=null;this.options=null;this.analyzer=_r();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
1735
1764
  <div class="ai-modal-card">
1736
1765
  <div class="ai-modal-header">
1737
1766
  <div class="ai-modal-actions">
@@ -1812,12 +1841,12 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:u.slice(0
1812
1841
  </div>
1813
1842
  `,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var n;this.currentPrompt=((n=this.promptInput)==null?void 0:n.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",n=>{var o;let a=n.target;switch(a.dataset.action||((o=a.closest("[data-action]"))==null?void 0:o.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",n=>{let a=n.target;if(a.classList.contains("ai-gallery-item")||a.closest(".ai-gallery-item")){let s=a.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}
1814
1843
 
1815
- Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let a=this.getApiKey();if(!a){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let s=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await ci(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 Je(a,this.currentPrompt,s,{aspectRatio:"1:1"}),l=await Xe(o);this.generatedImages.push(l||o),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(a){console.error("[AiEditorModal] Generation failed:",a),alert(`Generation failed: ${a instanceof Error?a.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(n=this.previewEl)==null||n.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,i)=>`
1844
+ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let a=this.getApiKey();if(!a){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let s=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await ci(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 Ze(a,this.currentPrompt,s,{aspectRatio:"1:1"}),l=await Je(o);this.generatedImages.push(l||o),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(a){console.error("[AiEditorModal] Generation failed:",a),alert(`Generation failed: ${a instanceof Error?a.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(n=this.previewEl)==null||n.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,i)=>`
1816
1845
  <div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
1817
1846
  <img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
1818
1847
  <div class="ai-gallery-label">#${i+1}</div>
1819
1848
  </div>
1820
- `).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=An();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return Cn(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}},Tn=null;window.__openAiEditor=function(r,e,t,i){Tn||(Tn=new Ln),Tn.open({objectId:r,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let a=window.updateManager;if(a)a.updateProperty(r,i.path,n);else{let s=window.getEditableObjectConfig,o=s==null?void 0:s(r);if(o){let l=i.path.split("."),c=o;for(let u=0;u<l.length-1;u++)c[l[u]]||(c[l[u]]={}),c=c[l[u]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var kn=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1849
+ `).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=An();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return Cn(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}},Tn=null;window.__openAiEditor=function(r,e,t,i){Tn||(Tn=new Ln),Tn.open({objectId:r,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let a=window.updateManager;if(a)a.updateProperty(r,i.path,n);else{let s=window.getEditableObjectConfig,o=s==null?void 0:s(r);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 kn=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1821
1850
  <div class="asset-preview-card">
1822
1851
  <div class="asset-preview-header">
1823
1852
  <div class="asset-preview-title">${n}</div>
@@ -1895,7 +1924,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1895
1924
  <button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
1896
1925
  </div>
1897
1926
  </div>
1898
- `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,s=Math.min(n,a),o=this.cropWidth*s,l=this.cropHeight*s,c=(i-o)/2,u=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,u,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(r){new Pn().open(r)};var Mn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[We("playable-portrait"),We("iphone-14"),We("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.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=We(e.defaultDevice||Zi.id),this.debugPanel=new Ei,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.setupShortcutListeners(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),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,a;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=We(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},s=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",s),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,s=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,u=Math.max(200,Math.min(600,a+c));e.style.width=`${u}px`;let d=this.container.querySelector(".preview-main");if(d){let g=i==="left"?`${u}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${u}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${g} 1fr ${f}`}let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},o=()=>{document.removeEventListener("pointermove",s),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",s),document.addEventListener("pointerup",o),e.classList.add("resizing")})}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
1927
+ `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,s=Math.min(n,a),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(r){new Pn().open(r)};var Mn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[Ke("playable-portrait"),Ke("iphone-14"),Ke("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.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=Ke(e.defaultDevice||Zi.id),this.debugPanel=new Ei,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.setupShortcutListeners(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),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,a;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=Ke(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},s=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",s),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,s=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,p=Math.max(200,Math.min(600,a+c));e.style.width=`${p}px`;let d=this.container.querySelector(".preview-main");if(d){let g=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${g} 1fr ${f}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},o=()=>{document.removeEventListener("pointermove",s),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",s),document.addEventListener("pointerup",o),e.classList.add("resizing")})}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
1899
1928
  <div class="preview-toolbar">
1900
1929
  <div class="preview-toolbar-left">
1901
1930
  <span class="preview-logo">PREVIEWER</span>
@@ -2056,7 +2085,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2056
2085
  </div>
2057
2086
 
2058
2087
  </div>
2059
- `,this.setupEventListeners(e),e}setupEventListeners(e){var g,f,h,m,b,v,y,x;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",S=>{if(this.viewMode==="compare")return;let _=S.target.value;this.setDevice(_)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",S=>{let _=S.target.value;this.setTheme(_)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(S=>{S.addEventListener("click",()=>{let _=S.dataset.viewToggle;_&&this.setViewMode(_)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(S=>{S.addEventListener("click",()=>{let _=S.dataset.layoutToggle;_&&this.setLayoutMode(_)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(h=e.querySelector("#zoom-out-btn"))==null||h.addEventListener("click",()=>this.adjustUserZoom(-.1)),(m=e.querySelector("#refresh-btn"))==null||m.addEventListener("click",()=>this.refresh());let s=e.querySelector("#bottom-dock"),o=e.querySelector("#bottom-dock-resize");s&&o&&this.makeBottomDockResizable(s,o);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(S=>{S.addEventListener("click",()=>{let _=S.dataset.dockTab;if(!_)return;l.forEach(T=>T.classList.remove("active")),S.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(T=>{let M=T.dataset.dockPanel;T.classList.toggle("active",M===_)})})}),(b=e.querySelector("#console-clear"))==null||b.addEventListener("click",()=>this.clearConsole()),(v=e.querySelector("#corner-zoom-in-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(.1)),(y=e.querySelector("#corner-zoom-out-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(-.1)),(x=e.querySelector("#corner-grab-btn"))==null||x.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),u=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&u&&this.makeSidebarResizable(c,u,"left");let d=e.querySelector(".debug-workbench"),p=d==null?void 0:d.querySelector("#workbench-resize-v");d&&p&&this.makeSidebarResizable(d,p,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let s=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(s,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),pa();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),ua();return}})}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(s=>typeof s=="object"?this.safeStringify(s):String(s)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let s=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=s>0?`${s}!`:"0",a.classList.toggle("has-errors",s>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),s=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),u=t.querySelector("[data-compare-focus]");!a||!s||!o||!l||(t.addEventListener("click",d=>{let p=d.target;if(p!=null&&p.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:a,ghost:s,wrapper:o,frame:l,canvas:c,focus:u}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,s;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(s=(a=this.options).onDeviceChange)==null||s.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,s=n/e.preset.height,o=Math.max(.01,Math.min(a,s));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,s=t.canvas.height,o=Math.min(a/i.width,s/i.height),l=i.width*o,c=i.height*o,u=(a-l)/2,d=(s-c)/2;n.clearRect(0,0,a,s),n.drawImage(i,u,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 Ir(r={}){let e=new Mn(r);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as Is,Container as Or}from"pixi.js";var Os=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",_n=Os;if(typeof window!="undefined")try{let r=new XMLHttpRequest;if(r.open("GET","./build-settings.json",!1),r.send(),r.status===200&&r.responseText){let e=JSON.parse(r.responseText);e!=null&&e.buildMode&&(_n=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${_n}`))}}catch{}function js(r){var t,i,n,a,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(r);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(r))return{x:(t=r[0])!=null?t:.5,y:(i=r[1])!=null?i:.5};if(r&&typeof r=="object"&&"x"in r&&"y"in r)return{x:(n=r.x)!=null?n:.5,y:(a=r.y)!=null?a:.5};if(typeof r=="string"){let o=r.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var Re=class{static async create(e,t,i){var l,c,u,d,p,g,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${_n}`);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 Or;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let s=await Fi.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(u=s==null?void 0:s.constructor)==null?void 0:u.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new Is(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:",(p=s==null?void 0:s.constructor)==null?void 0:p.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof Or)){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 v=await fetch(b);if(v.ok){o=await v.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(f=o==null?void 0:o.constructor)==null?void 0:f.name),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,a,s,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((s=t.position.x)!=null?s:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=js(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};function In(r){try{if(r&&typeof r.keys=="function")return Array.from(r.keys())}catch{}return[]}function jr(r){var e;return r?((e=r.getDisplayObject)==null?void 0:e.call(r))||r.pixiObject||r:null}function Rs(r,e){if(!r||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);r.eventMode=i?"static":"none",r.interactive=i,i&&(r.cursor=t.draggable?"move":"pointer")}function Rr(r,e){var l,c,u;if(!r||!e)return;let t=e.transform||{};Rs(r,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),s=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=r.position)!=null&&l.set?r.position.set(a,s):(typeof r.x=="number"&&(r.x=a),typeof r.y=="number"&&(r.y=s)),typeof t.scale=="number"&&((c=r.scale)!=null&&c.set?r.scale.set(t.scale):r.scale&&(r.scale.x=t.scale,r.scale.y=t.scale));let o=t.anchor;if(o&&((u=r.anchor)!=null&&u.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"&&r.anchor.set(d.x,d.y)}}function zr(r){if(typeof window=="undefined")return;let e=r==null?void 0:r.objects,t=In(e),i=a=>{try{let s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===s):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>zr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(In((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return In((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var u,d,p,g,f;let s=(g=(p=(d=(u=window.__editableConfig)==null?void 0:u.objects)==null?void 0:d.get)==null?void 0:p.call(d,a))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return s;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[a];return c&&c===o?s:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let s={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return a}}function zs(){if(typeof window=="undefined")return;let r=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,s,o;let n=r(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),u=Date.now(),d=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${u}`:`?t=${u}`),p=await l.load(d);if(!p)return;c[t]=p;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=p);let 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=p;else if(m!=null&&m.children){let b=m.children.find(v=>v==null?void 0:v.texture);b!=null&&b.texture&&(b.texture=p)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Ui();Array.isArray(i)&&i.length&&(window.__editableConfig=t,zt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Ui();Array.isArray(i)&&i.length&&(window.__editableConfig=t,zt(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,s]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:s});if(t.assets)for(let[a,s]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:s}),typeof s=="string"&&e(a,s);if(t.splash)for(let[a,s]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:s});if(t.loading)for(let[a,s]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:s});if(t.start)for(let[a,s]of Object.entries(t.start))n.push({path:`start.${a}`,value:s});n.length&&zt(n,{silent:!0,persist:!0,emitEvent:!0})}}function On(r){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=r;t&&(t.onObjectRebuildRequired=async(a,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,u=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let d=window.gameApp,p=await Re.create(a,s,d);c&&(u!==void 0&&u!==-1?c.addChildAt(p,u):c.addChild(p));let g=t.create(a,p);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(zs(),window.applyEditableObjectConfig=(a,s)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let u=window.__editableConfig;(o=u==null?void 0:u.objects)!=null&&o.set&&(u.objects.set(a,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,a);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 p=jr(d);Rr(p,s)}}catch(u){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",u)}});let n={async applyObjectConfig(a,s){var u,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(u=o==null?void 0:o.objects)!=null&&u.set&&(o.objects.set(a,s),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(s);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let p=jr(l);Rr(p,s)}let c=[a];i==null||i(a,s,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,zr(a))}};return n.rebuildIndexes(),n}import Ds from"lottie-web";Dn(qa);typeof window!="undefined"&&!window.lottie&&(window.lottie=Ds);var et=null,$s=async()=>{if(!et){let r=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(r==null?void 0:r["handler.config"])||(r==null?void 0:r["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);et=JSON.parse(i)}else et=JSON.parse(e);return et}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}et=await(await fetch("./handler.config.json")).json()}return et},$n,xt,Hr,tt,Rn,zn;function Hd(r){$n=r.initGame,xt=r.CustomAssets,Hr=r.updateScreenState,tt=r.globalResponsiveMultipliers,Rn=r.layout,zn=r.clearResponsiveElements}var Si="web_embed",yt="https://example.com",Dr={profile_id:Si},ze=null,ve=null,jn={width:0,height:0},Hs=!0,Nd=async()=>{var c,u,d,p;document.title="Handler Pixi Game";let r=await $s();Dr={...r.ids||{},profile_id:Si},yt=r.destination_url||((u=(c=r.export_profiles)==null?void 0:c[Si])==null?void 0:u.destination_url)||yt,Ce.init({ids:Dr,profile:Si,destinationUrl:yt});let e=Ce.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ve=Ir({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),$r()},onRefresh:$r});let g=ve.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var y,x,S,_,R,T,M,I,A,w,C;let h=window.gameApp,m=window.gameObjectManager,{width:b,height:v}=f.detail;if(jn.width=b,jn.height=v,Hr(b,v),!(!h||!h.renderer)){m&&o(h,m);try{h.renderer.resize(b,v);let E=h.view;E&&(E.style.width="100%",E.style.height="100%",E.style.display="block")}catch(E){console.warn("[SCREEN] Error resizing renderer:",E);return}if(t&&m&&Rn)try{let E=(y=window.__mainContainer)!=null?y:h.stage,L=(M=(T=(_=window.__tutorialLabel)!=null?_:(S=(x=m.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:S.call(x))!=null?T:(R=m.get("label_1"))==null?void 0:R.pixiObject)!=null?M:m.get("label_1"),k=m.get("background_1"),j=(C=(w=(A=window.__background)!=null?A:(I=k==null?void 0:k.getDisplayObject)==null?void 0:I.call(k))!=null?w:k==null?void 0:k.pixiObject)!=null?C:k;if(E){let P=E===h.stage;Rn({mainContainer:E,label:L,background:j,backgroundTexture:(j==null?void 0:j.texture)||null,app:h},t,0,jn,m,{skipMainContainerTransform:P})}}catch(E){console.warn("[SCREEN] Error in layout:",E)}}})}let t=await Ht("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Gi(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(p=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&p.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Ht("scene.main"));let i=await $n(e,t,yt,ve);ze=i.app;let n=i.gameObjectManager;window.gameApp=ze,window.gameObjectManager=n;try{window.__liveEditBridge=On({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:xt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ve&&ve.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(tt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(ze,n);async function s(){try{let g=async v=>{let y=v.startsWith("/")?v:`/${v}`,x=await fetch(y,{cache:"no-cache"});if(!x.ok)return null;let S=await x.text();try{return JSON.parse(S)}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[v,y]of Object.entries(h)){let x=y==null?void 0:y.source;if(typeof x!="string")continue;let S=await g(x),_=S==null?void 0:S.elements;if(!Array.isArray(_))continue;let R=_.map(T=>T==null?void 0:T.instance_id).filter(T=>typeof T=="string");m[v]=R;for(let T of R)b[T]||(b[T]=v)}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(Hs){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${tt.scale.toFixed(3)}`),g.stage){let m=function(b,v=0){if(!b||!b.children)return;let y=" ".repeat(v);b.children.forEach((x,S)=>{if(x&&x.zIndex===9999){console.log(`${y}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let _=x.scale.x||1,R=x.scale.y||1;x.__originalScale||(x.__originalScale={x:_,y:R},console.log(`${y}[RESPONSIVE] Stored original scale for child[${S}]: ${_.toFixed(3)}, ${R.toFixed(3)}`));let T=x.__originalScale.x*tt.scale,M=x.__originalScale.y*tt.scale;typeof x.scale.set=="function"?x.scale.set(T,M):(x.scale.x=T,x.scale.y=M),console.log(`${y}[RESPONSIVE] Child[${S}] scale: ${_.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),m(x,v+1)}else x&&console.log(`${y}[RESPONSIVE] Child[${S}] 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){tt.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,Ce.start()},$r=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let r=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(r){let a=((t=r.getDisplayObject)==null?void 0:t.call(r))||r;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(ve){ve.notifyGameDestroyed();try{zn&&zn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=ve.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),ze){try{ze.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}ze=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof xt.resetScene=="function"&&xt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Ht("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Gi(o)),$n(a,o,yt).then(l=>{ze=l.app,window.gameApp=ze,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=On({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:xt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ve&&ve.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Ce.start()}catch{}})})},100)},1e3)}};var Te={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Ns=1.25,Fs={fontFamily:"Inter, system-ui, sans-serif"};var Hn=class{constructor(e={}){this.currentProgress=0;var t;this.currentProgress=(t=e.progress)!=null?t:0,this.container=this.createContainer()}createContainer(){let e=document.createElement("div");e.className="handler-loading-screen",e.style.cssText=`
2088
+ `,this.setupEventListeners(e),e}setupEventListeners(e){var g,f,h,m,b,v,y,w;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",x=>{if(this.viewMode==="compare")return;let S=x.target.value;this.setDevice(S)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",x=>{let S=x.target.value;this.setTheme(S)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(x=>{x.addEventListener("click",()=>{let S=x.dataset.viewToggle;S&&this.setViewMode(S)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(x=>{x.addEventListener("click",()=>{let S=x.dataset.layoutToggle;S&&this.setLayoutMode(S)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(h=e.querySelector("#zoom-out-btn"))==null||h.addEventListener("click",()=>this.adjustUserZoom(-.1)),(m=e.querySelector("#refresh-btn"))==null||m.addEventListener("click",()=>this.refresh());let s=e.querySelector("#bottom-dock"),o=e.querySelector("#bottom-dock-resize");s&&o&&this.makeBottomDockResizable(s,o);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(x=>{x.addEventListener("click",()=>{let S=x.dataset.dockTab;if(!S)return;l.forEach(T=>T.classList.remove("active")),x.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(T=>{let _=T.dataset.dockPanel;T.classList.toggle("active",_===S)})})}),(b=e.querySelector("#console-clear"))==null||b.addEventListener("click",()=>this.clearConsole()),(v=e.querySelector("#corner-zoom-in-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(.1)),(y=e.querySelector("#corner-zoom-out-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(-.1)),(w=e.querySelector("#corner-grab-btn"))==null||w.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),p=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&p&&this.makeSidebarResizable(c,p,"left");let d=e.querySelector(".debug-workbench"),u=d==null?void 0:d.querySelector("#workbench-resize-v");d&&u&&this.makeSidebarResizable(d,u,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let s=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(s,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),pa();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),ua();return}})}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(s=>typeof s=="object"?this.safeStringify(s):String(s)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let s=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=s>0?`${s}!`:"0",a.classList.toggle("has-errors",s>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),s=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!a||!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:a,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 a,s;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(s=(a=this.options).onDeviceChange)==null||s.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,s=n/e.preset.height,o=Math.max(.01,Math.min(a,s));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,s=t.canvas.height,o=Math.min(a/i.width,s/i.height),l=i.width*o,c=i.height*o,p=(a-l)/2,d=(s-c)/2;n.clearRect(0,0,a,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 Ir(r={}){let e=new Mn(r);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as Is,Container as Or}from"pixi.js";var Os=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",_n=Os;if(typeof window!="undefined")try{let r=new XMLHttpRequest;if(r.open("GET","./build-settings.json",!1),r.send(),r.status===200&&r.responseText){let e=JSON.parse(r.responseText);e!=null&&e.buildMode&&(_n=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${_n}`))}}catch{}function js(r){var t,i,n,a,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(r);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(r))return{x:(t=r[0])!=null?t:.5,y:(i=r[1])!=null?i:.5};if(r&&typeof r=="object"&&"x"in r&&"y"in r)return{x:(n=r.x)!=null?n:.5,y:(a=r.y)!=null?a:.5};if(typeof r=="string"){let o=r.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var Re=class{static async create(e,t,i){var l,c,p,d,u,g,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${_n}`);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 Or;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let s=await Fi.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(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 Is(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 Or)){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 v=await fetch(b);if(v.ok){o=await v.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(f=o==null?void 0:o.constructor)==null?void 0:f.name),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,a,s,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((s=t.position.x)!=null?s:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=js(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};function In(r){try{if(r&&typeof r.keys=="function")return Array.from(r.keys())}catch{}return[]}function jr(r){var e;return r?((e=r.getDisplayObject)==null?void 0:e.call(r))||r.pixiObject||r:null}function Rs(r,e){if(!r||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);r.eventMode=i?"static":"none",r.interactive=i,i&&(r.cursor=t.draggable?"move":"pointer")}function Rr(r,e){var l,c,p;if(!r||!e)return;let t=e.transform||{};Rs(r,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),s=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=r.position)!=null&&l.set?r.position.set(a,s):(typeof r.x=="number"&&(r.x=a),typeof r.y=="number"&&(r.y=s)),typeof t.scale=="number"&&((c=r.scale)!=null&&c.set?r.scale.set(t.scale):r.scale&&(r.scale.x=t.scale,r.scale.y=t.scale));let o=t.anchor;if(o&&((p=r.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"&&r.anchor.set(d.x,d.y)}}function zr(r){if(typeof window=="undefined")return;let e=r==null?void 0:r.objects,t=In(e),i=a=>{try{let s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===s):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>zr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(In((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return In((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{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,a))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return s;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[a];return c&&c===o?s:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let s={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return a}}function zs(){if(typeof window=="undefined")return;let r=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,s,o;let n=r(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),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;(a=g==null?void 0:g[t])!=null&&a.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(v=>v==null?void 0:v.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Ui();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Dt(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Ui();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Dt(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,s]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:s});if(t.assets)for(let[a,s]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:s}),typeof s=="string"&&e(a,s);if(t.splash)for(let[a,s]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:s});if(t.loading)for(let[a,s]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:s});if(t.start)for(let[a,s]of Object.entries(t.start))n.push({path:`start.${a}`,value:s});n.length&&Dt(n,{silent:!0,persist:!0,emitEvent:!0})}}function On(r){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=r;t&&(t.onObjectRebuildRequired=async(a,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let d=window.gameApp,u=await Re.create(a,s,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(zs(),window.applyEditableObjectConfig=(a,s)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let p=window.__editableConfig;(o=p==null?void 0:p.objects)!=null&&o.set&&(p.objects.set(a,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,a);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=jr(d);Rr(u,s)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(a,s){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(p=o==null?void 0:o.objects)!=null&&p.set&&(o.objects.set(a,s),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(s);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=jr(l);Rr(u,s)}let c=[a];i==null||i(a,s,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,zr(a))}};return n.rebuildIndexes(),n}import Ds from"lottie-web";Dn(qa);typeof window!="undefined"&&!window.lottie&&(window.lottie=Ds);var tt=null,$s=async()=>{if(!tt){let r=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(r==null?void 0:r["handler.config"])||(r==null?void 0:r["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);tt=JSON.parse(i)}else tt=JSON.parse(e);return tt}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}tt=await(await fetch("./handler.config.json")).json()}return tt},$n,wt,Hr,it,Rn,zn;function Nd(r){$n=r.initGame,wt=r.CustomAssets,Hr=r.updateScreenState,it=r.globalResponsiveMultipliers,Rn=r.layout,zn=r.clearResponsiveElements}var Si="web_embed",xt="https://example.com",Dr={profile_id:Si},ze=null,ve=null,jn={width:0,height:0},Hs=!0,Fd=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let r=await $s();Dr={...r.ids||{},profile_id:Si},xt=r.destination_url||((p=(c=r.export_profiles)==null?void 0:c[Si])==null?void 0:p.destination_url)||xt,Ce.init({ids:Dr,profile:Si,destinationUrl:xt});let e=Ce.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ve=Ir({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),$r()},onRefresh:$r});let g=ve.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var y,w,x,S,O,T,_,I,C,E,L;let h=window.gameApp,m=window.gameObjectManager,{width:b,height:v}=f.detail;if(jn.width=b,jn.height=v,Hr(b,v),!(!h||!h.renderer)){m&&o(h,m);try{h.renderer.resize(b,v);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&&Rn)try{let A=(y=window.__mainContainer)!=null?y:h.stage,k=(_=(T=(S=window.__tutorialLabel)!=null?S:(x=(w=m.get("label_1"))==null?void 0:w.getDisplayObject)==null?void 0:x.call(w))!=null?T:(O=m.get("label_1"))==null?void 0:O.pixiObject)!=null?_:m.get("label_1"),P=m.get("background_1"),R=(L=(E=(C=window.__background)!=null?C:(I=P==null?void 0:P.getDisplayObject)==null?void 0:I.call(P))!=null?E:P==null?void 0:P.pixiObject)!=null?L:P;if(A){let M=A===h.stage;Rn({mainContainer:A,label:k,background:R,backgroundTexture:(R==null?void 0:R.texture)||null,app:h},t,0,jn,m,{skipMainContainerTransform:M})}}catch(A){console.warn("[SCREEN] Error in layout:",A)}}})}let t=await Ht("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Gi(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(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 Ht("scene.main"));let i=await $n(e,t,xt,ve);ze=i.app;let n=i.gameObjectManager;window.gameApp=ze,window.gameObjectManager=n;try{window.__liveEditBridge=On({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:wt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ve&&ve.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(it.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(ze,n);async function s(){try{let g=async v=>{let y=v.startsWith("/")?v:`/${v}`,w=await fetch(y,{cache:"no-cache"});if(!w.ok)return null;let x=await w.text();try{return JSON.parse(x)}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[v,y]of Object.entries(h)){let w=y==null?void 0:y.source;if(typeof w!="string")continue;let x=await g(w),S=x==null?void 0:x.elements;if(!Array.isArray(S))continue;let O=S.map(T=>T==null?void 0:T.instance_id).filter(T=>typeof T=="string");m[v]=O;for(let T of O)b[T]||(b[T]=v)}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(Hs){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${it.scale.toFixed(3)}`),g.stage){let m=function(b,v=0){if(!b||!b.children)return;let y=" ".repeat(v);b.children.forEach((w,x)=>{if(w&&w.zIndex===9999){console.log(`${y}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(w&&w.scale){let S=w.scale.x||1,O=w.scale.y||1;w.__originalScale||(w.__originalScale={x:S,y:O},console.log(`${y}[RESPONSIVE] Stored original scale for child[${x}]: ${S.toFixed(3)}, ${O.toFixed(3)}`));let T=w.__originalScale.x*it.scale,_=w.__originalScale.y*it.scale;typeof w.scale.set=="function"?w.scale.set(T,_):(w.scale.x=T,w.scale.y=_),console.log(`${y}[RESPONSIVE] Child[${x}] scale: ${S.toFixed(3)}\u2192${w.scale.x.toFixed(3)} (type: ${w.constructor.name})`),m(w,v+1)}else w&&console.log(`${y}[RESPONSIVE] Child[${x}] has no scale (type: ${w.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){it.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,Ce.start()},$r=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let r=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(r){let a=((t=r.getDisplayObject)==null?void 0:t.call(r))||r;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(ve){ve.notifyGameDestroyed();try{zn&&zn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=ve.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),ze){try{ze.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}ze=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof wt.resetScene=="function"&&wt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Ht("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Gi(o)),$n(a,o,xt).then(l=>{ze=l.app,window.gameApp=ze,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=On({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:wt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ve&&ve.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Ce.start()}catch{}})})},100)},1e3)}};var Te={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Ns=1.25,Fs={fontFamily:"Inter, system-ui, sans-serif"};var Hn=class{constructor(e={}){this.currentProgress=0;var t;this.currentProgress=(t=e.progress)!=null?t:0,this.container=this.createContainer()}createContainer(){let e=document.createElement("div");e.className="handler-loading-screen",e.style.cssText=`
2060
2089
  position: fixed;
2061
2090
  inset: 0;
2062
2091
  display: flex;
@@ -2131,11 +2160,11 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2131
2160
  margin-top: 8px;
2132
2161
  padding: 0 4px;
2133
2162
  opacity: 0.4;
2134
- `;for(let p=0;p<9;p++){let g=document.createElement("div");g.style.cssText=`
2163
+ `;for(let u=0;u<9;u++){let g=document.createElement("div");g.style.cssText=`
2135
2164
  width: 1.5px;
2136
2165
  background-color: black;
2137
- height: ${p%4===0?"6px":"2px"};
2138
- `,c.appendChild(g)}n.appendChild(a),n.appendChild(o),n.appendChild(c);let u=document.createElement("div");return u.id="handler-load-centered",u.style.cssText=`
2166
+ height: ${u%4===0?"6px":"2px"};
2167
+ `,c.appendChild(g)}n.appendChild(a),n.appendChild(o),n.appendChild(c);let p=document.createElement("div");return p.id="handler-load-centered",p.style.cssText=`
2139
2168
  position: absolute;
2140
2169
  top: 48px;
2141
2170
  width: 600px;
@@ -2144,7 +2173,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2144
2173
  left: 50%;
2145
2174
  transform: translateX(-50%);
2146
2175
  overflow: visible;
2147
- `,"HANDLER".split("").forEach((p,g)=>{let f=document.createElement("div");f.textContent=p,f.style.cssText=`
2176
+ `,"HANDLER".split("").forEach((u,g)=>{let f=document.createElement("div");f.textContent=u,f.style.cssText=`
2148
2177
  position: absolute;
2149
2178
  width: 28px;
2150
2179
  height: 40px;
@@ -2159,7 +2188,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2159
2188
  align-items: center;
2160
2189
  justify-content: center;
2161
2190
  animation-delay: ${[1.05,.875,.7,.525,.35,.175,0][g]}s;
2162
- `,u.appendChild(f)}),t.appendChild(n),t.appendChild(u),this.authSeq=document.createElement("div"),this.authSeq.style.cssText=`
2191
+ `,p.appendChild(f)}),t.appendChild(n),t.appendChild(p),this.authSeq=document.createElement("div"),this.authSeq.style.cssText=`
2163
2192
  position: absolute;
2164
2193
  bottom: 48px;
2165
2194
  font-size: 8px;
@@ -2255,7 +2284,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2255
2284
  0%, 100% { opacity: 1; }
2256
2285
  50% { opacity: 0.3; }
2257
2286
  }
2258
- `,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 Nn=Ca.version,Bs=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"]);Aa();var Vr={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"},Yr=Math.random().toString(36).slice(2),at=null,it={...Vr},Wr="web_embed",Gn={},Et,Fn=!1,wt=!1,At=!1,Kr=!1,Wn=1,Ci=0,ki=!1,Le=!1,nt="",rt=Math.floor(window.innerWidth),st=Math.floor(window.innerHeight),qn=rt>st,ke=!1,St=!1,Nr=!1,Fr=!1,Bn=!1,Ti=null,Ue=null,Vn=!1,Yn=!1,Ai=new Map;function Xr(){if(!Ue)return null;let r=Date.now()-Ue;return!Number.isFinite(r)||r<0?null:r}function Un(r){if(Vn)return;let e=Xr();e!==null&&(Vn=!0,z("session_time",{duration_ms:e,reason:r}))}function Br(){if(at)return at;let r=document.createElement("div");return r.id="handler-root",r.setAttribute("data-handler-root","true"),document.body.appendChild(r),at=r,r}function Li(r){switch(r){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return r}}function Jr(r,e){return{event_name:r,ts:Date.now(),session_id:Yr,deployment_id:it.deployment_id,variant_id:it.variant_id,export_profile_id:it.profile_id,instance_id:it.instance_id||"default",env:Wr==="mraid"?"mraid":"web",attribution:Et,payload:e}}function z(r,e){let t=Li(r),i=Jr(t,e);Yi(i,!!Gn.analytics),Ft(t,i),t!==r&&Ft(r,i)}function Ct(){Ti&&(Ti(rt,st),Ti=null)}function ot(r){Wn=r,z("volume",r)}function lt(r){r&&(Kr=!0),!At&&(At=!0,z("pause"),ot(0))}function Tt(r){!r&&Kr||At&&(At=!1,z("resume"),ot(Wn))}function De(r,e){rt=Math.floor(r||window.innerWidth),st=Math.floor(e||window.innerHeight),qn=rt>st,z("resize",{width:rt,height:st})}function Us(){if(Da())try{let r=mraid.getMaxSize();De(r.width,r.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Tt():lt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();De(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();ot(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&ot(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),ki=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Ct();else{let t=()=>{ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Ct()};mraid.addEventListener("ready",t)}}catch(r){console.warn("MRAID hook skipped",r)}}function Gs(){if($a())try{let r=dapi.getScreenSize();De(r.width,r.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Tt():lt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();De(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(ot(e?1:0),dapi.addEventListener("audioVolumeChange",t=>ot(t?1:0)),ki=!0,dapi.isViewable())ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Ct();else{let t=()=>{ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Ct()};dapi.addEventListener("ready",t)}}catch(r){console.warn("DAPI hook skipped",r)}}function Ur(){let r=()=>{ke||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Ct(),St&&(St=!1,ye.start()))};window.addEventListener("resize",()=>De()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Tt(),r()):lt()}),document.readyState==="complete"||document.readyState==="interactive"?r():window.addEventListener("load",r),ki=!0}function qs(){let r=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Nr=!0),!(Nr&&e instanceof MouseEvent)&&(Ci+=1,Yn||(Yn=!0,z("first_interaction",{count:Ci})),z("interaction",Ci))};document.addEventListener("mousedown",r),document.addEventListener("touchstart",r)}function Gr(r){var i,n,a,s,o,l,c,u,d,p,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(r||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ye())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(Ha())(o=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||o.call(s);else if(Ua())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ba())try{(d=(u=window.smxTracking)==null?void 0:u.redirect)==null||d.call(u)}catch(h){console.warn("Smadex redirect failed",h)}else if(Na()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(r||nt||""):r&&window.open(r)}else Ve()?(p=window.install)==null||p.call(window):Fa()?(g=window.openAppStore)==null||g.call(window):Wi()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):r&&window.open(r)}function Vs(){let r=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(r==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;oe("view",()=>e(t.mraid_viewable)),oe("start",()=>e(t.game_viewable)),oe("engagement",()=>e(t.engagement));let i=()=>e(t.complete);oe("complete",i),Nt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),oe("cta_click",()=>e(t.click))}else if(r==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;oe("view",()=>e(t.Ad_Load_Start)),oe("start",()=>e(t.Ad_Viewable)),oe("engagement",()=>e(t.First_Engagement)),oe("complete",()=>e(t.Gameplay_Complete)),oe("cta_click",()=>e(t.DSP_Click)),oe("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Ys(){if(!Ye())return;let r=window.TJ_API;r&&r.setPlayableAPI&&r.setPlayableAPI({skipAd:()=>{try{ye.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function qr(){var e,t,i;let r=window.TJ_API;(e=r==null?void 0:r.objectiveComplete)==null||e.call(r),(t=r==null?void 0:r.playableFinished)==null||t.call(r),(i=r==null?void 0:r.gameplayFinished)==null||i.call(r)}function Ws(){Ve()&&(window.mintGameStart=()=>{Tt(!0),De()},window.mintGameClose=()=>{lt(!0)})}function Ks(){if(!Ki())return;let r=window.NUC;!r||!r.trigger||(ye.on("cta_click",()=>{var e,t;return(t=(e=r.trigger).convert)==null?void 0:t.call(e,nt)}),ye.on("complete",()=>{var e,t;return(t=(e=r.trigger).tryAgain)==null?void 0:t.call(e)}))}var ye={init(r={},e){var t;if(Wr=r.profile||"web_embed",Gn=r.consent||{},it={...Vr,...r.ids||{}},at=r.rootEl||at,Et=void 0,ba((t=r.telemetry)!=null&&t.endpoint?r.telemetry:null),Ue=null,Vn=!1,Yn=!1,Ai.clear(),nt=r.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Ti=e),z("init"),document.body.oncontextmenu=()=>!1,Br(),Js(at),Ga(),Us(),Gs(),!ki){if(document.readyState==="complete")Ur();else if(!Fr){Fr=!0;let i=()=>{Ur(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}qs(),Vs(),Ys(),Ws(),Ks(),console.log(`%c @handler/playable-sdk %c v${Nn} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),ke&&!Le&&(z("boot"),z("view"),z("ready"),St&&(St=!1,ye.start()),Le=!0),Le=ke},getRoot(){return Br()},get version(){return Nn},get maxWidth(){return rt},get maxHeight(){return st},get isLandscape(){return qn},get isReady(){return Le},get isStarted(){return Fn},get isPaused(){return At},get isFinished(){return wt},get volume(){return Wn},get interactions(){return Ci},on(r,e){Nt(Li(r),e)},off(r,e){Vi(Li(r),e)},start(){var r,e;if(!Fn){if(!ke){St=!0;return}if(Fn=!0,Ue||(Ue=Date.now()),z("start"),De(),Ve())lt(),(r=window.gameReady)==null||r.call(window);else if(Ye()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:qn?"landscape":"portrait",buildID:Nn})}}},finish(){var r,e;wt||(wt=!0,z("complete"),Un("complete"),Ve()?(r=window.gameEnd)==null||r.call(window):Wi()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ye()&&qr())},install(r){if(!wt){wt=!0,Ye()?(qr(),setTimeout(()=>ye.install(r),300)):(z("complete"),setTimeout(()=>ye.install(r),0));return}Bn||(Bn=!0,setTimeout(()=>Bn=!1,500),z("cta_click"),z("conversion"),Un("cta"),Gr(r||nt))},emit(r,e){let t=Li(r);if(!Bs.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${r} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Jr(t,e);Yi(i,!!Gn.analytics),Ft(t,i)},gameStart(){ye.start()},gameEnd(){ye.finish()},ctaClick(r,e){z("cta_click",{url:r||nt,manual:!0}),(e==null?void 0:e.open)!==!1&&Gr(r||nt)},ctaShow(r){z("cta_show",r)},ctaDismiss(r){z("cta_dismiss",r)},getGameTimeMs(){return Xr()},endSession(r="manual"){Un(r)},setAttribution(r){Et=r},abTest(r,e){if(!r)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(Xs(`${Yr}:${r}`))%e.length,i=e[t];return Et={...Et||{},experiment_id:r},it.variant_id=i,z("ab_assign",{experiment_id:r,variant_id:i}),i},levelStart(r,e){Ue||(Ue=Date.now()),z("level_start",{level_id:r,...e})},levelComplete(r,e){z("level_complete",{level_id:r,...e})},levelFail(r,e){z("level_fail",{level_id:r,...e})},checkpoint(r,e){z("checkpoint",{checkpoint_id:r,...e})},reward(r,e){z("reward",{reward_id:r,...e})},tutorialStart(r,e){z("tutorial_start",{step_id:r,...e})},tutorialComplete(r,e){z("tutorial_complete",{step_id:r,...e})},tutorialSkip(r,e){z("tutorial_skip",{step_id:r,...e})},timerStart(r){r&&Ai.set(r,Date.now())},timerEnd(r,e="custom",t){if(!r)return;let i=Ai.get(r);if(!i)return;Ai.delete(r);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){z("engagement",{action:"timer",key:r,duration_ms:n,...t});return}z(e,{key:r,duration_ms:n,...t})}},fps(r,e){z("fps",{value:r,...e})},memory(r,e){z("memory",{bytes:r,...e})},assetLoadStart(r,e){z("asset_load_start",{asset_id:r,...e})},assetLoadComplete(r,e){z("asset_load_complete",{asset_id:r,...e})},reportError(r,e,t){z("error",{code:r,message:e,...t})},retry(){var r,e,t;if(Ve())(r=window.gameRetry)==null||r.call(window);else if(Ki()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}z("engagement",{action:"retry"})},pause(){lt(!0)},resume(){Tt(!0)},resize(r,e){De(r,e)}},Ce=ye;function Xs(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function Js(r){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2287
+ `,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 Nn=Ca.version,Bs=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"]);Aa();var Vr={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"},Yr=Math.random().toString(36).slice(2),rt=null,nt={...Vr},Wr="web_embed",Gn={},St,Fn=!1,Et=!1,Ct=!1,Kr=!1,Wn=1,Ci=0,ki=!1,Le=!1,at="",st=Math.floor(window.innerWidth),ot=Math.floor(window.innerHeight),qn=st>ot,ke=!1,At=!1,Nr=!1,Fr=!1,Bn=!1,Ti=null,Ge=null,Vn=!1,Yn=!1,Ai=new Map;function Xr(){if(!Ge)return null;let r=Date.now()-Ge;return!Number.isFinite(r)||r<0?null:r}function Un(r){if(Vn)return;let e=Xr();e!==null&&(Vn=!0,z("session_time",{duration_ms:e,reason:r}))}function Br(){if(rt)return rt;let r=document.createElement("div");return r.id="handler-root",r.setAttribute("data-handler-root","true"),document.body.appendChild(r),rt=r,r}function Li(r){switch(r){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return r}}function Jr(r,e){return{event_name:r,ts:Date.now(),session_id:Yr,deployment_id:nt.deployment_id,variant_id:nt.variant_id,export_profile_id:nt.profile_id,instance_id:nt.instance_id||"default",env:Wr==="mraid"?"mraid":"web",attribution:St,payload:e}}function z(r,e){let t=Li(r),i=Jr(t,e);Yi(i,!!Gn.analytics),Ft(t,i),t!==r&&Ft(r,i)}function Tt(){Ti&&(Ti(st,ot),Ti=null)}function lt(r){Wn=r,z("volume",r)}function ct(r){r&&(Kr=!0),!Ct&&(Ct=!0,z("pause"),lt(0))}function Lt(r){!r&&Kr||Ct&&(Ct=!1,z("resume"),lt(Wn))}function De(r,e){st=Math.floor(r||window.innerWidth),ot=Math.floor(e||window.innerHeight),qn=st>ot,z("resize",{width:st,height:ot})}function Us(){if(Da())try{let r=mraid.getMaxSize();De(r.width,r.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Lt():ct()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();De(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();lt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&lt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),ki=!0,mraid.isViewable()&&mraid.getState()!=="hidden")ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Tt();else{let t=()=>{ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Tt()};mraid.addEventListener("ready",t)}}catch(r){console.warn("MRAID hook skipped",r)}}function Gs(){if($a())try{let r=dapi.getScreenSize();De(r.width,r.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Lt():ct()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();De(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(lt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>lt(t?1:0)),ki=!0,dapi.isViewable())ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Tt();else{let t=()=>{ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Tt()};dapi.addEventListener("ready",t)}}catch(r){console.warn("DAPI hook skipped",r)}}function Ur(){let r=()=>{ke||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(ke=!0,z("boot"),z("view"),z("ready"),Le=!0,Tt(),At&&(At=!1,ye.start()))};window.addEventListener("resize",()=>De()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Lt(),r()):ct()}),document.readyState==="complete"||document.readyState==="interactive"?r():window.addEventListener("load",r),ki=!0}function qs(){let r=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Nr=!0),!(Nr&&e instanceof MouseEvent)&&(Ci+=1,Yn||(Yn=!0,z("first_interaction",{count:Ci})),z("interaction",Ci))};document.addEventListener("mousedown",r),document.addEventListener("touchstart",r)}function Gr(r){var i,n,a,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(r||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(We())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(Ha())(o=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||o.call(s);else if(Ua())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ba())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(Na()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(r||at||""):r&&window.open(r)}else Ye()?(u=window.install)==null||u.call(window):Fa()?(g=window.openAppStore)==null||g.call(window):Wi()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):r&&window.open(r)}function Vs(){let r=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(r==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;oe("view",()=>e(t.mraid_viewable)),oe("start",()=>e(t.game_viewable)),oe("engagement",()=>e(t.engagement));let i=()=>e(t.complete);oe("complete",i),Nt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),oe("cta_click",()=>e(t.click))}else if(r==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;oe("view",()=>e(t.Ad_Load_Start)),oe("start",()=>e(t.Ad_Viewable)),oe("engagement",()=>e(t.First_Engagement)),oe("complete",()=>e(t.Gameplay_Complete)),oe("cta_click",()=>e(t.DSP_Click)),oe("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Ys(){if(!We())return;let r=window.TJ_API;r&&r.setPlayableAPI&&r.setPlayableAPI({skipAd:()=>{try{ye.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function qr(){var e,t,i;let r=window.TJ_API;(e=r==null?void 0:r.objectiveComplete)==null||e.call(r),(t=r==null?void 0:r.playableFinished)==null||t.call(r),(i=r==null?void 0:r.gameplayFinished)==null||i.call(r)}function Ws(){Ye()&&(window.mintGameStart=()=>{Lt(!0),De()},window.mintGameClose=()=>{ct(!0)})}function Ks(){if(!Ki())return;let r=window.NUC;!r||!r.trigger||(ye.on("cta_click",()=>{var e,t;return(t=(e=r.trigger).convert)==null?void 0:t.call(e,at)}),ye.on("complete",()=>{var e,t;return(t=(e=r.trigger).tryAgain)==null?void 0:t.call(e)}))}var ye={init(r={},e){var t;if(Wr=r.profile||"web_embed",Gn=r.consent||{},nt={...Vr,...r.ids||{}},rt=r.rootEl||rt,St=void 0,ba((t=r.telemetry)!=null&&t.endpoint?r.telemetry:null),Ge=null,Vn=!1,Yn=!1,Ai.clear(),at=r.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Ti=e),z("init"),document.body.oncontextmenu=()=>!1,Br(),Js(rt),Ga(),Us(),Gs(),!ki){if(document.readyState==="complete")Ur();else if(!Fr){Fr=!0;let i=()=>{Ur(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}qs(),Vs(),Ys(),Ws(),Ks(),console.log(`%c @handler/playable-sdk %c v${Nn} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),ke&&!Le&&(z("boot"),z("view"),z("ready"),At&&(At=!1,ye.start()),Le=!0),Le=ke},getRoot(){return Br()},get version(){return Nn},get maxWidth(){return st},get maxHeight(){return ot},get isLandscape(){return qn},get isReady(){return Le},get isStarted(){return Fn},get isPaused(){return Ct},get isFinished(){return Et},get volume(){return Wn},get interactions(){return Ci},on(r,e){Nt(Li(r),e)},off(r,e){Vi(Li(r),e)},start(){var r,e;if(!Fn){if(!ke){At=!0;return}if(Fn=!0,Ge||(Ge=Date.now()),z("start"),De(),Ye())ct(),(r=window.gameReady)==null||r.call(window);else if(We()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:qn?"landscape":"portrait",buildID:Nn})}}},finish(){var r,e;Et||(Et=!0,z("complete"),Un("complete"),Ye()?(r=window.gameEnd)==null||r.call(window):Wi()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):We()&&qr())},install(r){if(!Et){Et=!0,We()?(qr(),setTimeout(()=>ye.install(r),300)):(z("complete"),setTimeout(()=>ye.install(r),0));return}Bn||(Bn=!0,setTimeout(()=>Bn=!1,500),z("cta_click"),z("conversion"),Un("cta"),Gr(r||at))},emit(r,e){let t=Li(r);if(!Bs.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${r} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Jr(t,e);Yi(i,!!Gn.analytics),Ft(t,i)},gameStart(){ye.start()},gameEnd(){ye.finish()},ctaClick(r,e){z("cta_click",{url:r||at,manual:!0}),(e==null?void 0:e.open)!==!1&&Gr(r||at)},ctaShow(r){z("cta_show",r)},ctaDismiss(r){z("cta_dismiss",r)},getGameTimeMs(){return Xr()},endSession(r="manual"){Un(r)},setAttribution(r){St=r},abTest(r,e){if(!r)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(Xs(`${Yr}:${r}`))%e.length,i=e[t];return St={...St||{},experiment_id:r},nt.variant_id=i,z("ab_assign",{experiment_id:r,variant_id:i}),i},levelStart(r,e){Ge||(Ge=Date.now()),z("level_start",{level_id:r,...e})},levelComplete(r,e){z("level_complete",{level_id:r,...e})},levelFail(r,e){z("level_fail",{level_id:r,...e})},checkpoint(r,e){z("checkpoint",{checkpoint_id:r,...e})},reward(r,e){z("reward",{reward_id:r,...e})},tutorialStart(r,e){z("tutorial_start",{step_id:r,...e})},tutorialComplete(r,e){z("tutorial_complete",{step_id:r,...e})},tutorialSkip(r,e){z("tutorial_skip",{step_id:r,...e})},timerStart(r){r&&Ai.set(r,Date.now())},timerEnd(r,e="custom",t){if(!r)return;let i=Ai.get(r);if(!i)return;Ai.delete(r);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){z("engagement",{action:"timer",key:r,duration_ms:n,...t});return}z(e,{key:r,duration_ms:n,...t})}},fps(r,e){z("fps",{value:r,...e})},memory(r,e){z("memory",{bytes:r,...e})},assetLoadStart(r,e){z("asset_load_start",{asset_id:r,...e})},assetLoadComplete(r,e){z("asset_load_complete",{asset_id:r,...e})},reportError(r,e,t){z("error",{code:r,message:e,...t})},retry(){var r,e,t;if(Ye())(r=window.gameRetry)==null||r.call(window);else if(Ki()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}z("engagement",{action:"retry"})},pause(){ct(!0)},resume(){Lt(!0)},resize(r,e){De(r,e)}},Ce=ye;function Xs(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function Js(r){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2259
2288
  (function(){
2260
2289
  var events = ['touchstart','touchend','mousedown','keydown'];
2261
2290
  function unlock(){
@@ -2271,14 +2300,14 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2271
2300
  }
2272
2301
  events.forEach(function(e){ document.addEventListener(e, unlock, false); });
2273
2302
  })();
2274
- `,r.appendChild(e)}async function Kn(r,e={}){let t=new Zs;await t.init({resizeTo:r,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var d,p,g,f;if(!t.renderer)return;let o=(d=s==null?void 0:s.width)!=null?d:r.clientWidth,l=(p=s==null?void 0:s.height)!=null?p:r.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,u=l&&l>0?l:(f=window.innerHeight)!=null?f:480;t.renderer.resize(c,u)};r.appendChild(t.canvas),r.style.position="relative",r.style.display="flex",r.style.flexDirection="column",r.style.alignItems="stretch",r.style.width="100%",r.style.height="100dvh",r.style.minHeight="100vh",r.style.maxWidth="100%",r.style.maxHeight="100%",r.style.boxSizing="border-box",r.style.overflow="hidden",e.background&&(r.style.background=e.background),i();let n=document.createElement("div");return n.setAttribute("style",["position:absolute","inset:0","display:flex","flex-direction:column","align-items:center","justify-content:flex-start","gap:12px","pointer-events:none","font-family:Arial,sans-serif","padding:20px 16px","padding-bottom:clamp(24px, 6vh, 96px)","box-sizing:border-box","z-index:2"].join(";")),r.appendChild(n),Ce.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),Ce.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),Ce.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 u={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:u}))}}}).observe(r),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Xn,Ticker as ct,ColorMatrixFilter as Qs}from"pixi.js";var Pi=class{constructor(e){var n,a;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset;this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0},this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0},this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y},this.scale=(n=e==null?void 0:e.scale)!=null?n:1,this.rotation=(a=e==null?void 0:e.rotation)!=null?a:0}update(e){let t=e.position,i=e.offset;t!==void 0&&(this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0}),i!==void 0&&(this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0}),(t!==void 0||i!==void 0)&&(this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y}),e.scale!==void 0&&(this.scale=e.scale),e.rotation!==void 0&&(this.rotation=e.rotation)}syncToPixi(e){e&&(e.position.set(this.position.x,this.position.y),e.scale.set(this.scale),e.rotation=this.rotation)}},Mi=class{constructor(e){var t,i,n,a;this.z_index=(t=e==null?void 0:e.z_index)!=null?t:0,this.alpha=(i=e==null?void 0:e.alpha)!=null?i:1,this.visible=(n=e==null?void 0:e.visible)!=null?n:!0,this.tint=(a=e==null?void 0:e.tint)!=null?a:null}update(e){e.z_index!==void 0&&(this.z_index=e.z_index),e.alpha!==void 0&&(this.alpha=e.alpha),e.visible!==void 0&&(this.visible=e.visible),e.tint!==void 0&&(this.tint=e.tint)}syncToPixi(e,t){if(!e)return;if(e.zIndex=this.z_index,t!=null&&t.startsWith("ui_endgame_")||(e.alpha=this.alpha),e.visible=this.visible,this.tint!==null&&"tint"in e&&(e.tint=this.tint),t&&"texture"in e)try{let{AssetTextures:n}=as("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},_i=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 Pi(n.transform),this.renderer=new Mi(n.render),this.sync()}sync(){this.transform.syncToPixi(this.pixiObject),this.renderer.syncToPixi(this.pixiObject,this.instanceId),this.applyAnchor(),this.applyEffectsScale(),this.applyEffects(),this.syncTextProperties(),(!this._initialized||this._shouldReplayIntro)&&(this.applyIntro(),this._initialized=!0,this._shouldReplayIntro=!1),this.applyMotion()}syncTextProperties(){var t;if(!this.pixiObject||!("text"in this.pixiObject))return;let e=(t=this._config)==null?void 0:t.ui;e&&(e.text!==void 0&&this.pixiObject.text!==e.text&&(this.pixiObject.text=e.text),this.pixiObject.style&&(e.fontSize!==void 0&&(this.pixiObject.style.fontSize=e.fontSize),e.color!==void 0&&(this.pixiObject.style.fill=e.color),e.align!==void 0&&(this.pixiObject.style.align=e.align)))}destroy(){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null),this._introTicker&&(ct.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,u,d,p,g,f,h,m,b,v;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(u=e==null?void 0:e.motion)==null?void 0:u.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(p=(d=this._config)==null?void 0:d.render)==null?void 0:p.asset)==null?void 0:g.type,a=(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=(v=e==null?void 0:e.ui)==null?void 0:v.renderMode;if((n!==a||s!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} to ${a}/${o}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,a,s,o;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(a=(n=this._config)==null?void 0:n.render)==null?void 0:a.anchor,t=(o=(s=this._config)==null?void 0:s.transform)==null?void 0:o.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var a,s,o;if(!((a=this.pixiObject)!=null&&a.scale))return;let e=(s=this._config)==null?void 0:s.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(o=this.transform.scale)!=null?o:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,a,s,o,l,c,u,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 p=new Xn;p.blur=(a=e.blur.strength)!=null?a:4,t.push(p)}if((s=e.shadow)!=null&&s.enabled){let p=e.shadow,g=new Xn;g.blur=(o=p.blur)!=null?o:4,g.blendMode="multiply",t.push(g),(p.offsetX!==0||p.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let p=e.glow,g=new Xn;if(g.blur=(c=p.blur)!=null?c:8,t.push(g),p.color){let f=new Qs,h=typeof p.color=="string"?parseInt(p.color.replace("#",""),16):p.color;f.tint(h),t.push(f)}}(u=e.stroke)!=null&&u.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 u,d,p,g,f,h,m;let e=(u=this._config)==null?void 0:u.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,a=this.transform.position.y,s=this.transform.scale*(((g=(p=this._config)==null?void 0:p.effects)==null?void 0:g.scale_x)||1),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=a+(t.startYOffset||0)),this._introTicker&&ct.shared.remove(this._introTicker),i<=0&&n<=0){this.pixiObject.alpha=this.renderer.alpha,this.pixiObject.y=this.transform.position.y,this.pixiObject.scale.set(s,o);return}let l=0,c=b=>{var M,I,A,w,C,E;if(l+=b.deltaTime/60,l<n)return;let v=i>0?Math.min(1,(l-n)/i):1,y=1-Math.pow(1-v,3),x=this.renderer.alpha,S=this.transform.scale*(((I=(M=this._config)==null?void 0:M.effects)==null?void 0:I.scale_x)||1),_=this.transform.scale*(((w=(A=this._config)==null?void 0:A.effects)==null?void 0:w.scale_y)||1),R=this.transform.position.y,T=this.transform.position.x;if(this.pixiObject.alpha=((C=t.startAlpha)!=null?C:0)+(x-((E=t.startAlpha)!=null?E:0))*y,t.startScale!==void 0){let L=t.startScale+(1-t.startScale)*y;this.pixiObject.scale.set(S*L,_*L)}t.startYOffset!==void 0&&(this.pixiObject.y=R+t.startYOffset+(R-(R+t.startYOffset))*y),v>=1&&(ct.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=x,this.pixiObject.x=T,this.pixiObject.y=R,this.pixiObject.scale.set(S,_))};this._introTicker=c,ct.shared.add(c)}applyMotion(){var d,p,g,f,h,m;let e=(d=this._config)==null?void 0:d.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(this._lastMotionStr===i&&this._tickerCleanup)return;if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),!(((p=e.pulse)==null?void 0:p.enabled)||((g=e.swing)==null?void 0:g.enabled)||((f=e.continuousMove)==null?void 0:f.enabled)||((h=e.continuousRotate)==null?void 0:h.enabled)||((m=e.orbit)==null?void 0:m.enabled)))return;let a=0,s=0,o=0,l=0,c=1/60,u=b=>{var A,w,C,E,L,k,j,P,O,D,V,H,B,W,J,de,we,$e,$,ie,re,pe,se,fe,Ee,Se;let v=((A=b.deltaTime)!=null?A:1)*c;a+=b.deltaTime*.05;let y=this.transform.scale,x=y*(((C=(w=this._config)==null?void 0:w.effects)==null?void 0:C.scale_x)||1),S=y*(((L=(E=this._config)==null?void 0:E.effects)==null?void 0:L.scale_y)||1),_=this.transform.position.x,R=this.transform.position.y,T=this.transform.rotation,M=0,I=0;if((k=e.swing)!=null&&k.enabled){let F=(j=e.swing.amplitude)!=null?j:10,Z=(P=e.swing.speed)!=null?P:1,Y=Math.sin(a*Z)*F;e.swing.axis==="vertical"?I+=Y:e.swing.axis==="both"?(M+=Y,I+=Y):M+=Y}if((O=e.continuousMove)!=null&&O.enabled){let F=(D=e.continuousMove.axis)!=null?D:"x",Z=Math.max(0,(V=e.continuousMove.speed)!=null?V:50),Y=Math.sign((H=e.continuousMove.direction)!=null?H:1)||1,te=Math.max(0,(B=e.continuousMove.lifetime)!=null?B:0);s+=v;let Me=te>0?Math.min(s,te):s,He=Z*Y*Me;(F==="x"||F==="both")&&(M+=He),(F==="y"||F==="both")&&(I+=He)}if((W=e.orbit)!=null&&W.enabled){let F=Math.max(0,(J=e.orbit.radius)!=null?J:50),Z=Math.max(0,(de=e.orbit.speed)!=null?de:45),Y=Math.sign((we=e.orbit.direction)!=null?we:1)||1,te=Z*Math.PI/180;l+=te*Y*v;let Me=($e=e.orbit.pivotOffsetX)!=null?$e:0,He=($=e.orbit.pivotOffsetY)!=null?$:0;M+=Me+F*Math.cos(l),I+=He+F*Math.sin(l)}if(this.pixiObject.x=_+M,this.pixiObject.y=R+I,(ie=e.pulse)!=null&&ie.enabled){let F=(re=e.pulse.intensity)!=null?re:.1,Z=(pe=e.pulse.speed)!=null?pe:1,te=1+Math.sin(a*Z)*F;(se=this.pixiObject.scale)!=null&&se.set?this.pixiObject.scale.set(x*te,S*te):this.pixiObject.scale&&(this.pixiObject.scale.x=x*te,this.pixiObject.scale.y=S*te)}if((fe=e.continuousRotate)!=null&&fe.enabled){let F=Math.max(0,(Ee=e.continuousRotate.speed)!=null?Ee:90),Z=Math.sign((Se=e.continuousRotate.direction)!=null?Se:1)||1,Y=F*Math.PI/180;o+=Y*Z*v,this.pixiObject.rotation=T+o}};ct.shared.add(u),this._tickerCleanup=()=>{var b,v,y,x,S;if(ct.shared.remove(u),this.pixiObject){let _=this.transform.scale*(((v=(b=this._config)==null?void 0:b.effects)==null?void 0:v.scale_x)||1),R=this.transform.scale*(((x=(y=this._config)==null?void 0:y.effects)==null?void 0:x.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(S=this.pixiObject.scale)!=null&&S.set?this.pixiObject.scale.set(_,R):this.pixiObject.scale&&(this.pixiObject.scale.x=_,this.pixiObject.scale.y=R)}}}getComponent(e){return this._config[e]}getPosition(){return{...this.transform.position}}setPosition(e,t){this.transform.position={x:e,y:t},this.transform.syncToPixi(this.pixiObject)}getAlpha(){return this.renderer.alpha}setAlpha(e){this.renderer.alpha=e,this.renderer.syncToPixi(this.pixiObject)}getVisible(){return this.renderer.visible}setVisible(e){this.renderer.visible=e,this.renderer.syncToPixi(this.pixiObject)}},Lt=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 _i(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,s)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,s);o&&this.objects.get(e)===o&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),a.updateConfig(s)},n}get(e){return this.objects.get(e)}updateConfig(e){this.config=e;for(let[t,i]of this.objects.entries()){let n=e.objects.get(t);n&&i.updateConfig(n)}}getAll(){return Array.from(this.objects.values())}remove(e){let t=this.objects.get(e);t&&t.destroy(),this.objects.delete(e)}clear(){for(let e of this.objects.values())e.destroy();this.objects.clear()}};var Ii={"brand.primary":{family:"Arial, sans-serif",weight:"400"},"brand.warning":{family:"Arial Black, Arial, sans-serif",weight:"900"},"brand.heading":{family:"Arial Black, Arial, sans-serif",weight:"800"},"brand.body":{family:"Arial, sans-serif",weight:"400"}};function eo(r){let e=Ii[r];return e?e.family:(console.warn(`Font ID "${r}" not found in registry, using fallback`),"Arial, sans-serif")}function to(r){var t;let e=Ii[r];return e&&(t=e.weight)!=null?t:"400"}function io(r,e){Ii[r]=e}function no(){return Object.keys(Ii)}var dt=null;function ao(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!dt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),dt||(typeof window!="undefined"&&window.lottie?(dt=window.lottie,console.log("[LottieOverlay] \u2705 Found window.lottie, cached it")):(console.warn("[LottieOverlay] \u274C lottie-web is not available globally. Make sure it is loaded before using Lottie animations."),console.log("[LottieOverlay] window keys:",typeof window!="undefined"?Object.keys(window).filter(r=>r.toLowerCase().includes("lottie")):"no window"),dt=null)),dt}function ro(r){return!r||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("/")?r:`/${r.replace(/^\.\//,"")}`}function so(r){try{let e=new XMLHttpRequest;return e.open("GET",ro(r),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Zr(r){return!r||typeof r!="object"||!Array.isArray(r.layers)?null:(Array.isArray(r.assets)||(r.assets=[]),Array.isArray(r.chars)||(r.chars=[]),r)}function Dn(r){dt=r}function oo(r,e,t,i){var _,R,T,M,I,A,w,C,E,L,k,j,P,O,D,V,H,B,W;let n=t.objects.get(r);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${r}`),null;let a=((_=n.effects)==null?void 0:_.lottie)||{},s=n.transform||{},o=n.render||{};if(a.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[r],c=Zr(l);if(!c){let J=(T=(R=n.render)==null?void 0:R.asset)==null?void 0:T.path;if(typeof J=="string"&&J.toLowerCase().endsWith(".json")){let de=so(J);if(c=Zr(de),c)try{i[r]=c}catch{}}}if(!c){let J=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${r}`,{kind:J}),null}let u=ao();if(!u)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${r}`),null;let d=(M=a.width)!=null?M:300,p=(I=a.height)!=null?I:300,g=(A=s.scale)!=null?A:1,f=((C=(w=s.position)==null?void 0:w.x)!=null?C:0)+((L=(E=s.offset)==null?void 0:E.x)!=null?L:0),h=((j=(k=s.position)==null?void 0:k.y)!=null?j:0)+((O=(P=s.offset)==null?void 0:P.y)!=null?O:0),m=(D=s.rotation)!=null?D:0,b=(V=o.z_index)!=null?V:100,v=(H=o.alpha)!=null?H:1,y=document.createElement("div");y.style.cssText=`
2303
+ `,r.appendChild(e)}async function Kn(r,e={}){let t=new Zs;await t.init({resizeTo:r,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var d,u,g,f;if(!t.renderer)return;let o=(d=s==null?void 0:s.width)!=null?d:r.clientWidth,l=(u=s==null?void 0:s.height)!=null?u:r.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,p=l&&l>0?l:(f=window.innerHeight)!=null?f:480;t.renderer.resize(c,p)};r.appendChild(t.canvas),r.style.position="relative",r.style.display="flex",r.style.flexDirection="column",r.style.alignItems="stretch",r.style.width="100%",r.style.height="100dvh",r.style.minHeight="100vh",r.style.maxWidth="100%",r.style.maxHeight="100%",r.style.boxSizing="border-box",r.style.overflow="hidden",e.background&&(r.style.background=e.background),i();let n=document.createElement("div");return n.setAttribute("style",["position:absolute","inset:0","display:flex","flex-direction:column","align-items:center","justify-content:flex-start","gap:12px","pointer-events:none","font-family:Arial,sans-serif","padding:20px 16px","padding-bottom:clamp(24px, 6vh, 96px)","box-sizing:border-box","z-index:2"].join(";")),r.appendChild(n),Ce.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),Ce.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),Ce.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(r),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Xn,Ticker as dt,ColorMatrixFilter as Qs}from"pixi.js";var Pi=class{constructor(e){var n,a;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset;this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0},this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0},this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y},this.scale=(n=e==null?void 0:e.scale)!=null?n:1,this.rotation=(a=e==null?void 0:e.rotation)!=null?a:0}update(e){let t=e.position,i=e.offset;t!==void 0&&(this._basePosition={x:typeof(t==null?void 0:t.x)=="number"?t.x:0,y:typeof(t==null?void 0:t.y)=="number"?t.y:0}),i!==void 0&&(this._offset={x:typeof(i==null?void 0:i.x)=="number"?i.x:0,y:typeof(i==null?void 0:i.y)=="number"?i.y:0}),(t!==void 0||i!==void 0)&&(this.position={x:this._basePosition.x+this._offset.x,y:this._basePosition.y+this._offset.y}),e.scale!==void 0&&(this.scale=e.scale),e.rotation!==void 0&&(this.rotation=e.rotation)}syncToPixi(e){e&&(e.position.set(this.position.x,this.position.y),e.scale.set(this.scale),e.rotation=this.rotation)}},Mi=class{constructor(e){var t,i,n,a;this.z_index=(t=e==null?void 0:e.z_index)!=null?t:0,this.alpha=(i=e==null?void 0:e.alpha)!=null?i:1,this.visible=(n=e==null?void 0:e.visible)!=null?n:!0,this.tint=(a=e==null?void 0:e.tint)!=null?a:null}update(e){e.z_index!==void 0&&(this.z_index=e.z_index),e.alpha!==void 0&&(this.alpha=e.alpha),e.visible!==void 0&&(this.visible=e.visible),e.tint!==void 0&&(this.tint=e.tint)}syncToPixi(e,t){if(!e)return;if(e.zIndex=this.z_index,t!=null&&t.startsWith("ui_endgame_")||(e.alpha=this.alpha),e.visible=this.visible,this.tint!==null&&"tint"in e&&(e.tint=this.tint),t&&"texture"in e)try{let{AssetTextures:n}=as("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},_i=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 Pi(n.transform),this.renderer=new Mi(n.render),this.sync()}sync(){this.transform.syncToPixi(this.pixiObject),this.renderer.syncToPixi(this.pixiObject,this.instanceId),this.applyAnchor(),this.applyEffectsScale(),this.applyEffects(),this.syncTextProperties(),(!this._initialized||this._shouldReplayIntro)&&(this.applyIntro(),this._initialized=!0,this._shouldReplayIntro=!1),this.applyMotion()}syncTextProperties(){var t;if(!this.pixiObject||!("text"in this.pixiObject))return;let e=(t=this._config)==null?void 0:t.ui;e&&(e.text!==void 0&&this.pixiObject.text!==e.text&&(this.pixiObject.text=e.text),this.pixiObject.style&&(e.fontSize!==void 0&&(this.pixiObject.style.fontSize=e.fontSize),e.color!==void 0&&(this.pixiObject.style.fill=e.color),e.align!==void 0&&(this.pixiObject.style.align=e.align)))}destroy(){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null),this._introTicker&&(dt.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,p,d,u,g,f,h,m,b,v;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,a=(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=(v=e==null?void 0:e.ui)==null?void 0:v.renderMode;if((n!==a||s!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} to ${a}/${o}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,a,s,o;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(a=(n=this._config)==null?void 0:n.render)==null?void 0:a.anchor,t=(o=(s=this._config)==null?void 0:s.transform)==null?void 0:o.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var a,s,o;if(!((a=this.pixiObject)!=null&&a.scale))return;let e=(s=this._config)==null?void 0:s.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(o=this.transform.scale)!=null?o:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,a,s,o,l,c,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 Xn;u.blur=(a=e.blur.strength)!=null?a:4,t.push(u)}if((s=e.shadow)!=null&&s.enabled){let u=e.shadow,g=new Xn;g.blur=(o=u.blur)!=null?o:4,g.blendMode="multiply",t.push(g),(u.offsetX!==0||u.offsetY!==0)&&console.warn("[Effects] Drop shadow offset requires pixi-filters. Install: npm install pixi-filters")}if((l=e.glow)!=null&&l.enabled){let u=e.glow,g=new Xn;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let f=new Qs,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,a=this.transform.position.y,s=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((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=a+(t.startYOffset||0)),this._introTicker&&dt.shared.remove(this._introTicker),i<=0&&n<=0){this.pixiObject.alpha=this.renderer.alpha,this.pixiObject.y=this.transform.position.y,this.pixiObject.scale.set(s,o);return}let l=0,c=b=>{var _,I,C,E,L,A;if(l+=b.deltaTime/60,l<n)return;let v=i>0?Math.min(1,(l-n)/i):1,y=1-Math.pow(1-v,3),w=this.renderer.alpha,x=this.transform.scale*(((I=(_=this._config)==null?void 0:_.effects)==null?void 0:I.scale_x)||1),S=this.transform.scale*(((E=(C=this._config)==null?void 0:C.effects)==null?void 0:E.scale_y)||1),O=this.transform.position.y,T=this.transform.position.x;if(this.pixiObject.alpha=((L=t.startAlpha)!=null?L:0)+(w-((A=t.startAlpha)!=null?A:0))*y,t.startScale!==void 0){let k=t.startScale+(1-t.startScale)*y;this.pixiObject.scale.set(x*k,S*k)}t.startYOffset!==void 0&&(this.pixiObject.y=O+t.startYOffset+(O-(O+t.startYOffset))*y),v>=1&&(dt.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=w,this.pixiObject.x=T,this.pixiObject.y=O,this.pixiObject.scale.set(x,S))};this._introTicker=c,dt.shared.add(c)}applyMotion(){var d,u,g,f,h,m;let e=(d=this._config)==null?void 0:d.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(this._lastMotionStr===i&&this._tickerCleanup)return;if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),!(((u=e.pulse)==null?void 0:u.enabled)||((g=e.swing)==null?void 0:g.enabled)||((f=e.continuousMove)==null?void 0:f.enabled)||((h=e.continuousRotate)==null?void 0:h.enabled)||((m=e.orbit)==null?void 0:m.enabled)))return;let a=0,s=0,o=0,l=0,c=1/60,p=b=>{var C,E,L,A,k,P,R,M,j,D,V,H,B,W,J,de,we,$e,$,ie,re,pe,se,fe,Ee,Se;let v=((C=b.deltaTime)!=null?C:1)*c;a+=b.deltaTime*.05;let y=this.transform.scale,w=y*(((L=(E=this._config)==null?void 0:E.effects)==null?void 0:L.scale_x)||1),x=y*(((k=(A=this._config)==null?void 0:A.effects)==null?void 0:k.scale_y)||1),S=this.transform.position.x,O=this.transform.position.y,T=this.transform.rotation,_=0,I=0;if((P=e.swing)!=null&&P.enabled){let F=(R=e.swing.amplitude)!=null?R:10,Z=(M=e.swing.speed)!=null?M:1,Y=Math.sin(a*Z)*F;e.swing.axis==="vertical"?I+=Y:e.swing.axis==="both"?(_+=Y,I+=Y):_+=Y}if((j=e.continuousMove)!=null&&j.enabled){let F=(D=e.continuousMove.axis)!=null?D:"x",Z=Math.max(0,(V=e.continuousMove.speed)!=null?V:50),Y=Math.sign((H=e.continuousMove.direction)!=null?H:1)||1,te=Math.max(0,(B=e.continuousMove.lifetime)!=null?B:0);s+=v;let Me=te>0?Math.min(s,te):s,He=Z*Y*Me;(F==="x"||F==="both")&&(_+=He),(F==="y"||F==="both")&&(I+=He)}if((W=e.orbit)!=null&&W.enabled){let F=Math.max(0,(J=e.orbit.radius)!=null?J:50),Z=Math.max(0,(de=e.orbit.speed)!=null?de:45),Y=Math.sign((we=e.orbit.direction)!=null?we:1)||1,te=Z*Math.PI/180;l+=te*Y*v;let Me=($e=e.orbit.pivotOffsetX)!=null?$e:0,He=($=e.orbit.pivotOffsetY)!=null?$:0;_+=Me+F*Math.cos(l),I+=He+F*Math.sin(l)}if(this.pixiObject.x=S+_,this.pixiObject.y=O+I,(ie=e.pulse)!=null&&ie.enabled){let F=(re=e.pulse.intensity)!=null?re:.1,Z=(pe=e.pulse.speed)!=null?pe:1,te=1+Math.sin(a*Z)*F;(se=this.pixiObject.scale)!=null&&se.set?this.pixiObject.scale.set(w*te,x*te):this.pixiObject.scale&&(this.pixiObject.scale.x=w*te,this.pixiObject.scale.y=x*te)}if((fe=e.continuousRotate)!=null&&fe.enabled){let F=Math.max(0,(Ee=e.continuousRotate.speed)!=null?Ee:90),Z=Math.sign((Se=e.continuousRotate.direction)!=null?Se:1)||1,Y=F*Math.PI/180;o+=Y*Z*v,this.pixiObject.rotation=T+o}};dt.shared.add(p),this._tickerCleanup=()=>{var b,v,y,w,x;if(dt.shared.remove(p),this.pixiObject){let S=this.transform.scale*(((v=(b=this._config)==null?void 0:b.effects)==null?void 0:v.scale_x)||1),O=this.transform.scale*(((w=(y=this._config)==null?void 0:y.effects)==null?void 0:w.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(x=this.pixiObject.scale)!=null&&x.set?this.pixiObject.scale.set(S,O):this.pixiObject.scale&&(this.pixiObject.scale.x=S,this.pixiObject.scale.y=O)}}}getComponent(e){return this._config[e]}getPosition(){return{...this.transform.position}}setPosition(e,t){this.transform.position={x:e,y:t},this.transform.syncToPixi(this.pixiObject)}getAlpha(){return this.renderer.alpha}setAlpha(e){this.renderer.alpha=e,this.renderer.syncToPixi(this.pixiObject)}getVisible(){return this.renderer.visible}setVisible(e){this.renderer.visible=e,this.renderer.syncToPixi(this.pixiObject)}},kt=class{constructor(e){this.objects=new Map;this.onObjectRebuildRequired=null;this.config=e}create(e,t){let i=this.config.objects.get(e);if(!i)throw new Error(`Object config not found: ${e}`);let n=new _i(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,s)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,s);o&&this.objects.get(e)===o&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),a.updateConfig(s)},n}get(e){return this.objects.get(e)}updateConfig(e){this.config=e;for(let[t,i]of this.objects.entries()){let n=e.objects.get(t);n&&i.updateConfig(n)}}getAll(){return Array.from(this.objects.values())}remove(e){let t=this.objects.get(e);t&&t.destroy(),this.objects.delete(e)}clear(){for(let e of this.objects.values())e.destroy();this.objects.clear()}};var Ii={"brand.primary":{family:"Arial, sans-serif",weight:"400"},"brand.warning":{family:"Arial Black, Arial, sans-serif",weight:"900"},"brand.heading":{family:"Arial Black, Arial, sans-serif",weight:"800"},"brand.body":{family:"Arial, sans-serif",weight:"400"}};function eo(r){let e=Ii[r];return e?e.family:(console.warn(`Font ID "${r}" not found in registry, using fallback`),"Arial, sans-serif")}function to(r){var t;let e=Ii[r];return e&&(t=e.weight)!=null?t:"400"}function io(r,e){Ii[r]=e}function no(){return Object.keys(Ii)}var pt=null;function ao(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!pt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),pt||(typeof window!="undefined"&&window.lottie?(pt=window.lottie,console.log("[LottieOverlay] \u2705 Found window.lottie, cached it")):(console.warn("[LottieOverlay] \u274C lottie-web is not available globally. Make sure it is loaded before using Lottie animations."),console.log("[LottieOverlay] window keys:",typeof window!="undefined"?Object.keys(window).filter(r=>r.toLowerCase().includes("lottie")):"no window"),pt=null)),pt}function ro(r){return!r||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("/")?r:`/${r.replace(/^\.\//,"")}`}function so(r){try{let e=new XMLHttpRequest;return e.open("GET",ro(r),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Zr(r){return!r||typeof r!="object"||!Array.isArray(r.layers)?null:(Array.isArray(r.assets)||(r.assets=[]),Array.isArray(r.chars)||(r.chars=[]),r)}function Dn(r){pt=r}function oo(r,e,t,i){var S,O,T,_,I,C,E,L,A,k,P,R,M,j,D,V,H,B,W;let n=t.objects.get(r);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${r}`),null;let a=((S=n.effects)==null?void 0:S.lottie)||{},s=n.transform||{},o=n.render||{};if(a.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[r],c=Zr(l);if(!c){let J=(T=(O=n.render)==null?void 0:O.asset)==null?void 0:T.path;if(typeof J=="string"&&J.toLowerCase().endsWith(".json")){let de=so(J);if(c=Zr(de),c)try{i[r]=c}catch{}}}if(!c){let J=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${r}`,{kind:J}),null}let p=ao();if(!p)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${r}`),null;let d=(_=a.width)!=null?_:300,u=(I=a.height)!=null?I:300,g=(C=s.scale)!=null?C:1,f=((L=(E=s.position)==null?void 0:E.x)!=null?L:0)+((k=(A=s.offset)==null?void 0:A.x)!=null?k:0),h=((R=(P=s.position)==null?void 0:P.y)!=null?R:0)+((j=(M=s.offset)==null?void 0:M.y)!=null?j:0),m=(D=s.rotation)!=null?D:0,b=(V=o.z_index)!=null?V:100,v=(H=o.alpha)!=null?H:1,y=document.createElement("div");y.style.cssText=`
2275
2304
  position: absolute;
2276
2305
  top: calc(50% + ${h}px);
2277
2306
  left: calc(50% + ${f}px);
2278
2307
  transform: translate(-50%, -50%) scale(${g}) rotate(${m}deg);
2279
2308
  width: ${d}px;
2280
- height: ${p}px;
2309
+ height: ${u}px;
2281
2310
  pointer-events: none;
2282
2311
  z-index: ${b};
2283
2312
  opacity: ${v};
2284
- `,e.appendChild(y);let x;try{x=u.loadAnimation({container:y,renderer:a.renderer||"svg",loop:(B=a.loop)!=null?B:!1,autoplay:(W=a.autoplay)!=null?W:!0,animationData:c})}catch(J){return y.parentNode&&y.parentNode.removeChild(y),console.warn(`[LottieOverlay] Failed to start animation: ${r}`,J),null}a.speed!==void 0&&x.setSpeed(a.speed);let S=()=>{x.destroy(),y.parentNode&&y.parentNode.removeChild(y)};return a.loop||x.addEventListener("complete",S),{animation:x,cleanup:S}}var Jn=class{constructor(e,t,i){this.systems=[];this.totalTime=0;this.context=null;this.root=e,this.config=t,this.destinationUrl=i}async createApp(e){if(this.context)return{app:this.app,gameObjectManager:this.gameObjectManager};let{app:t,stage:i}=await Kn(this.root,{background:e.background_color,text:e.text_color,primary:e.cta_background,cta_text:e.cta_text});this.app=t,this.stage=i,this.gameObjectManager=new Lt(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 kt=class{setContext(e){this.context=e}};var Pt=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};import*as Qr from"pixi.js";var lo=Qr;typeof window!="undefined"&&(window.__basePixi=Qr);import{Sprite as co,Text as po,TextStyle as uo,Texture as es}from"pixi.js";var ts=r=>r*Math.PI/180;function go(r,e){var s,o,l,c,u;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(s=e.render)!=null&&s.tint&&(i=e.render.tint);let n=new uo({fontFamily:(o=t.font)!=null?o:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(u=t.letterSpacing)!=null?u:0}),a=new po({text:t.text,style:n});return a.label=r,a}function ho(r){var u,d,p,g,f,h,m,b,v,y;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:s}=r,o={},l={},c={};t.sortableChildren=!0;for(let[x,S]of i.objects.entries()){if(s!=null&&s.has(x)||a&&!a.has(x)||(S==null?void 0:S.enabled)===!1)continue;let _=(d=(u=S==null?void 0:S.render)==null?void 0:u.asset)==null?void 0:d.path,R=(g=(p=S==null?void 0:S.render)==null?void 0:p.asset)==null?void 0:g.type,T=!!(_&&R==="image"),M=!!((f=S==null?void 0:S.ui)!=null&&f.text),I=M?(h=S==null?void 0:S.ui)==null?void 0:h.renderMode:void 0,A;if(I==="png"&&T?A="png":I==="text"&&M?A="text":T?A="png":M?A="text":A="skip",A!=="skip"){if(A==="text"){let w=go(x,S);if(!w)continue;let C=S.render;w.alpha=typeof(C==null?void 0:C.alpha)=="number"?C.alpha:1,w.visible=(C==null?void 0:C.visible)!==!1,w.zIndex=typeof(C==null?void 0:C.z_index)=="number"?C.z_index:0,C!=null&&C.anchor&&typeof C.anchor.x=="number"&&typeof C.anchor.y=="number"?w.anchor.set(C.anchor.x,C.anchor.y):w.anchor.set(.5,.5);let E=S.transform,L=(E==null?void 0:E.position)||(E==null?void 0:E.offset);L&&w.position.set((m=L.x)!=null?m:0,(b=L.y)!=null?b:0);let k=typeof(E==null?void 0:E.scale)=="number"?E.scale:1;w.scale.set(k,k);let j=typeof(E==null?void 0:E.rotation)=="number"?E.rotation:0;w.rotation=ts(j),w.parent||t.addChild(w);try{n.create(x,w)}catch{}o[x]=w,c[x]=w}else if(A==="png"){let w=be[x]||(typeof es!="undefined"?es.EMPTY:void 0),C=new co(w);C.label=x;let E=S.render;C.alpha=typeof(E==null?void 0:E.alpha)=="number"?E.alpha:1,C.visible=(E==null?void 0:E.visible)!==!1,C.zIndex=typeof(E==null?void 0:E.z_index)=="number"?E.z_index:0,E!=null&&E.anchor&&typeof E.anchor.x=="number"&&typeof E.anchor.y=="number"&&C.anchor.set(E.anchor.x,E.anchor.y);let L=S.transform,k=(L==null?void 0:L.position)||(L==null?void 0:L.offset);k&&C.position.set((v=k.x)!=null?v:0,(y=k.y)!=null?y:0);let j=typeof(L==null?void 0:L.scale)=="number"?L.scale:1;C.scale.set(j,j);let P=typeof(L==null?void 0:L.rotation)=="number"?L.rotation:0;C.rotation=ts(P),C.parent||t.addChild(C);try{n.create(x,C)}catch{}o[x]=C,l[x]=C}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var Zn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Pt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var o;let s=this.registry.get(a);if(!s){console.warn("[Assets] No config found for object:",a);return}try{let l=await Re.create(a,s,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Re.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},is=new Zn,fo=new Proxy(is,{get(r,e){if(e in r&&typeof r[e]=="function")return r[e].bind(r);if(r.get(e))return r.get(e)}});function mo(r,e){is.init(r,e)}var Qn=class extends kt{async init(){Bi(this.context.config,this.context.app),await be.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};import{Graphics as bo,Point as vo}from"pixi.js";var Pe={width:400,height:600,designWidth:400,scaleFactor:1},ji={scale:1,position:1},Ri=[];function yo(r,e,t,i,n,a,s){Ri.push({element:r,originalScale:a,positionHelper:e,heightPercent:n}),e(r,t,i,n,a,s,!1)}function xo(){Ri.forEach(({element:r,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*Pe.scaleFactor;t(r,Pe.width,Pe.height,i,n,!0,!1)})}function wo(){Ri.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function ea(r,e){console.log(`[SCREEN] updateScreenState called: ${r}x${e}`),Pe.width=r,Pe.height=e,Pe.scaleFactor=Math.min(r/Pe.designWidth,1.15),ji.scale=Pe.scaleFactor,ji.position=1,console.log(`[SCREEN] Global multipliers - scale: ${ji.scale.toFixed(3)}`),xo()}var q={layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}};function Eo(r,e,t){let i=q[r];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${r}.${e} = ${t}`))}function So(){return q}var Ao={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Oi(r,e){return typeof r=="number"&&Number.isFinite(r)?r:e}function pt(r,e={x:.5,y:.5}){var t;if(Array.isArray(r))return{x:Oi(r[0],e.x),y:Oi(r[1],e.y)};if(r&&typeof r=="object"){let i=r;return{x:Oi(i.x,e.x),y:Oi(i.y,e.y)}}if(typeof r=="string"){let i=r.trim().toLowerCase();return(t=Ao[i])!=null?t:e}return e}function _t(r,e,t,i={}){var g,f,h,m,b,v;let n=pt(t),a=(g=i.inset)!=null?g:{},s=(f=i.padding)!=null?f:{x:0,y:0},o=((h=a.left)!=null?h:0)+s.x,l=((m=a.right)!=null?m:0)+s.x,c=((b=a.top)!=null?b:0)+s.y,u=((v=a.bottom)!=null?v:0)+s.y,d=Math.max(0,r-o-l),p=Math.max(0,e-c-u);return{x:o+d*n.x,y:c+p*n.y}}function It(r,e,t,i={}){var h,m,b,v,y,x;let n=(h=i.inset)!=null?h:{},a=(m=i.padding)!=null?m:{x:0,y:0},s=((b=n.left)!=null?b:0)+a.x,o=((v=n.right)!=null?v:0)+a.x,l=((y=n.top)!=null?y:0)+a.y,c=((x=n.bottom)!=null?x:0)+a.y,u=Math.max(0,r-s-o),d=Math.max(0,e-l-c),p=pt(t,{x:.5,y:.5}),g=Math.min(Math.max(p.x,0),1),f=Math.min(Math.max(p.y,0),1);return{x:s+u*g,y:l+d*f}}function ta(r,e,t,i={}){var u,d,p;if(!r)return;let n=i.positionRatio?It(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):_t(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(u=i.offset)!=null?u:{x:0,y:0},s=n.x+a.x,o=n.y+a.y;r.anchor&&i.renderAnchor&&r.anchor.set(i.renderAnchor.x,i.renderAnchor.y),he(r,s,o);let l=(d=i.scale)!=null?d:1,c=(p=i.scaleMultiplier)!=null?p:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&xe(r,l*c)}if(typeof window!="undefined"){let r=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==r||n!==e)&&(r=i,e=n,ea(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),ea(window.innerWidth,window.innerHeight),window.updateDebugConfig=Eo,window.getDebugConfig=So,window.copyConfig=Ro,window.applyConfig=Mt,window.applyConfigForRatio=zo,window.positionAtBottom=ns,window.positionAtTop=Lo,window.positionAtCenter=ko,window.positionAtLeft=Po,window.positionAtRight=Mo,window.positionAtBottomLeft=_o,window.positionAtBottomRight=Io,window.positionAtTopLeft=Oo,window.positionAtTopRight=jo,window.applyPositionContract=To,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function zi(r,e,t=0){return r*e+t}function Di(r,e,t=0){return r*(1-e)+t}function $i(r,e,t=0){return r*e+t}function Hi(r,e,t=0){return r*(1-e)+t}function ce(r,e=0){return r/2+e}function Co(r,e){return r*e}function To(r,e,t,i){var s,o,l,c,u,d,p,g,f,h,m,b,v,y,x,S,_,R,T,M;let n=0,a=0;switch(i.type){case"top":n=ce(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),a=zi(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ce(e,(d=(u=i.offset)==null?void 0:u.x)!=null?d:0),a=Di(t,i.percent,(g=(p=i.offset)==null?void 0:p.y)!=null?g:0);break;case"left":n=$i(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),a=ce(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=Hi(e,i.percent,(y=(v=i.offset)==null?void 0:v.x)!=null?y:0),a=ce(t,(S=(x=i.offset)==null?void 0:x.y)!=null?S:0);break;case"center":n=ce(e,(R=(_=i.offset)==null?void 0:_.x)!=null?R:0),a=ce(t,(M=(T=i.offset)==null?void 0:T.y)!=null?M:0);break}r.position?r.position.set(n,a):(r.x=n,r.y=a),i.scale!==void 0&&i.scale!==1&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(i.scale,i.scale):(r.scale.x=i.scale,r.scale.y=i.scale))}function ns(r,e,t,i=.2,n=1,a=!0,s=!1){let o=Co(t,i),l=Di(t,i/2);he(r,ce(e),l);let c=a?n*Pe.scaleFactor:n;xe(r,c),s&&!Ri.find(u=>u.element===r)&&yo(r,ns,e,t,i,n,a)}function Lo(r,e,t,i=.1,n=1){he(r,ce(e),zi(t,i)),xe(r,n)}function ko(r,e,t,i=0,n=0,a=1){he(r,ce(e,i),ce(t,n)),xe(r,a)}function Po(r,e,t,i=.1,n=1){he(r,$i(e,i),ce(t)),xe(r,n)}function Mo(r,e,t,i=.1,n=1){he(r,Hi(e,i),ce(t)),xe(r,n)}function _o(r,e,t,i=.05,n=.05,a=1){he(r,$i(e,n),Di(t,i)),xe(r,a)}function Io(r,e,t,i=.05,n=.05,a=1){he(r,Hi(e,n),Di(t,i)),xe(r,a)}function Oo(r,e,t,i=.05,n=.05,a=1){he(r,$i(e,n),zi(t,i)),xe(r,a)}function jo(r,e,t,i=.05,n=.05,a=1){he(r,Hi(e,n),zi(t,i)),xe(r,a)}function he(r,e,t){r&&r.position?typeof r.position.set=="function"?r.position.set(e,t):(r.position.x=e,r.position.y=t):r&&(r.x=e,r.y=t)}function xe(r,e){e!==1&&r&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(e,e):r.scale.x!==void 0&&r.scale.y!==void 0&&(r.scale.x=e,r.scale.y=e))}var Ge={default:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}},wide:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.9,screen_scale_y:1.1},engine:{scale:1,background_scale:1.1,background_offset_y:0,background_alpha:.95,label_pulse_speed:3,label_pulse_intensity:.03}},square:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.85,screen_scale_y:.85},engine:{scale:1,background_scale:1,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}},tall:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1.1,screen_scale_y:.9},engine:{scale:1,background_scale:.95,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}}};function Ro(r){return r&&Ge[r]?JSON.parse(JSON.stringify(Ge[r])):JSON.parse(JSON.stringify(q))}function Mt(r){Object.keys(r).forEach(e=>{let t=e;q[t]&&r[t]&&Object.assign(q[t],r[t])}),console.log("Config applied:",r)}function zo(r,e){let t=r/e;t>1.6?(Mt(Ge.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Mt(Ge.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Mt(Ge.square),console.log("Applied SQUARE config for ratio:",t)):(Mt(Ge.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let r=window;r.configPresets=Ge,r.resolveAnchorVec2=r.resolveAnchorVec2||pt,r.resolveScreenAnchorPoint=r.resolveScreenAnchorPoint||_t,r.resolveScreenRatioPoint=r.resolveScreenRatioPoint||It}var ae=null;function Do(r,e,t,i,n,a={}){var j,P,O,D,V,H,B,W,J,de,we,$e,$,ie,re,pe,se,fe,Ee,Se,F,Z,Y,te,Me,He,ia,na,aa,ra,sa,oa,la,ca;let s=(j=a.enableDebugLogs)!=null?j:!1;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== STARTING LAYOUT CALCULATION ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Screen dimensions:",{width:i.width,height:i.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Time:",t),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Options:",a));let{mainContainer:o,label:l,background:c,backgroundTexture:u,app:d}=r;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 p=i.width,g=i.height;s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:p,baseHeight:g});let f=p*q.layout.screen_scale_x,h=g*q.layout.screen_scale_y,m=p/2,b=e.engine.runtime||{},v=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:q.layout.screen_scale_x,screen_scale_y:q.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:",v));let y=v.design_width_portrait||400,x=f/y;x=Math.min(x,1.15);let S=x*((P=q.engine.scale)!=null?P:1),_=(O=a.skipMainContainerTransform)!=null?O:!1;!_&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(S):(o.scale.x=S,o.scale.y=S));let R=(D=v.main_container_anchor)!=null?D:"center",T=(V=v.main_container_position_ratio)!=null?V:{x:.5,y:.5},M=(H=v.main_container_offset)!=null?H:{x:0,y:0},I=v.main_container_position_ratio?It(p,g,T):_t(p,g,R),A=I.x+M.x+q.layout.position_offset.x,w=I.y+M.y+q.layout.position_offset.y;if(!_&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(A,w):(o.position.x=A,o.position.y=w)),n&&(o!=null&&o.toLocal))for(let[ne,ee]of e.objects.entries()){let U=ee==null?void 0:ee.transform;if(!U||((B=U.position_mode)!=null?B:"static")!=="static")continue;let N=(W=n.get)==null?void 0:W.call(n,ne),me=((J=N==null?void 0:N.getDisplayObject)==null?void 0:J.call(N))||(N==null?void 0:N.pixiObject)||N;if(!me||me.parent!==o)continue;let Ot=U.position_ratio!=null?It(p,g,U.position_ratio):_t(p,g,(de=U.anchor)!=null?de:"center"),jt=o.toLocal(new vo(Ot.x,Ot.y)),Rt=(we=U.position)!=null?we:{x:0,y:0},Ne=jt.x+Rt.x,Ni=jt.y+Rt.y;typeof(N==null?void 0:N.setPosition)=="function"?N.setPosition(Ne,Ni):(he(me,Ne,Ni),($e=N==null?void 0:N.transform)!=null&&$e.position&&(N.transform.position.x=Ne,N.transform.position.y=Ni))}let C=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,L=((C==null?void 0:C.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(q.layout.debug_rect_visible&&L){(!ae||ae.parent!==d.stage)&&(ae==null||ae.destroy(),ae=new bo,ae.zIndex=9999,d.stage.addChild(ae)),ae.clear();let ne=q.layout.debug_rect_scale_x,ee=q.layout.debug_rect_scale_y,U=(p-4)*ne,_e=(g-4)*ee,N=(p-U)/2,me=(g-_e)/2;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:p,baseHeight:g,rectW:U,rectH:_e,offsetX:N,offsetY:me}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+N,y:2+me,width:U,height:_e})),ae.rect(2+N,2+me,U,_e).stroke({width:q.layout.debug_rect_thickness,color:q.layout.debug_rect_color})}else ae&&(ae.destroy(),ae=null);let k=(($=r.label)==null?void 0:$.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&k){let ne=(re=(ie=k==null?void 0:k.transform)==null?void 0:ie.anchor)!=null?re:"center",ee=(pe=k==null?void 0:k.transform)==null?void 0:pe.position_ratio,U=((se=k==null?void 0:k.transform)==null?void 0:se.offset)||{x:0,y:0};ta(l,p,g,{anchor:ne,positionRatio:ee,offset:{x:U.x*S,y:U.y*S},renderAnchor:pt(ne)})}if(l&&l.alpha>0){let ne=1+Math.sin(t*q.engine.label_pulse_speed)*q.engine.label_pulse_intensity,ee=(Ee=(fe=k==null?void 0:k.transform)==null?void 0:fe.scale)!=null?Ee:1,U=ne*S*ee;l.scale&&(typeof l.scale.set=="function"?l.scale.set(U):(l.scale.x=U,l.scale.y=U))}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:",(Se=c.constructor)==null?void 0:Se.name)),c.alpha=((Z=(F=b.background)==null?void 0:F.alpha)!=null?Z:.98)*q.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let ne=e.objects.get("background_1");s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",ne);let ee=(ne==null?void 0:ne.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ee);let U=ee.offset||{x:0,y:0},_e=((te=(Y=b.background)==null?void 0:Y.offset_y)!=null?te:0)+q.engine.background_offset_y,N=(Me=ee.anchor)!=null?Me:"center",me=ee.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:U,bgRuntimeOffsetY:_e,bgScreenAnchor:N,bgPositionRatio:me,baseWidth:p,baseHeight:g,finalScale:S}),ta(c,p,g,{anchor:N,positionRatio:me,offset:{x:U.x*S,y:U.y*S+_e},renderAnchor:pt(N)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(He=c.scale)==null?void 0:He.x,scaleY:(ia=c.scale)==null?void 0:ia.y,anchorX:(na=c.anchor)==null?void 0:na.x,anchorY:(aa=c.anchor)==null?void 0:aa.y,pivotX:(ra=c.pivot)==null?void 0:ra.x,pivotY:(sa=c.pivot)==null?void 0:sa.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:u==null?void 0:u.width,textureHeight:u==null?void 0:u.height})),u){let Ot=Math.max(f/u.width,h/u.height),jt=(la=(oa=b.background)==null?void 0:oa.scale_multiplier)!=null?la:1.05,Rt=(ca=ee.scale)!=null?ca:1,Ne=Ot*jt*q.engine.background_scale*Rt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Ne):(c.scale.x=Ne,c.scale.y=Ne))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-f/2,-h/2,f,h).fill({color:1444375}))}}function $o(r){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=r,s=((l=(o=n.engine)==null?void 0:o.runtime)==null?void 0:l.timeline)||{};e(a.showHook),setTimeout(()=>{t(1),i(1),e(a.waitInput),console.log("[GAME] \u23F3 Game ready for user input - tutorial shown")},(c=s.tutorial_delay_ms)!=null?c:1500)}export{qa as a,Kn as b,Pi as c,Mi as d,_i as e,Lt as f,eo as g,to as h,io as i,no as j,Dn as k,oo as l,Re as m,Jn as n,kt as o,Pt as p,lo as q,ho as r,fo as s,mo as t,Qn as u,ji as v,wo as w,ea as x,pt as y,_t as z,It as A,ta as B,Do as C,$o as D,Va as E,Ya as F,Zi as G,We as H,Jo as I,Ei as J,Mn as K,Ir as L,On as M,Hd as N,Nd as O,Te as P,Ns as Q,Fs as R,Hn as S,ye as T,Ce as U};
2313
+ `,e.appendChild(y);let w;try{w=p.loadAnimation({container:y,renderer:a.renderer||"svg",loop:(B=a.loop)!=null?B:!1,autoplay:(W=a.autoplay)!=null?W:!0,animationData:c})}catch(J){return y.parentNode&&y.parentNode.removeChild(y),console.warn(`[LottieOverlay] Failed to start animation: ${r}`,J),null}a.speed!==void 0&&w.setSpeed(a.speed);let x=()=>{w.destroy(),y.parentNode&&y.parentNode.removeChild(y)};return a.loop||w.addEventListener("complete",x),{animation:w,cleanup:x}}var Jn=class{constructor(e,t,i){this.systems=[];this.totalTime=0;this.context=null;this.root=e,this.config=t,this.destinationUrl=i}async createApp(e){if(this.context)return{app:this.app,gameObjectManager:this.gameObjectManager};let{app:t,stage:i}=await Kn(this.root,{background:e.background_color,text:e.text_color,primary:e.cta_background,cta_text:e.cta_text});this.app=t,this.stage=i,this.gameObjectManager=new kt(this.config),this.stage.eventMode="passive",this.stage.interactive=!1,this.stage.interactiveChildren=!0,this.stage.sortableChildren=!0,this.context={app:this.app,stage:this.stage,config:this.config,gameObjectManager:this.gameObjectManager,destinationUrl:this.destinationUrl,root:this.root,engine:this};for(let n of this.systems)n.setContext(this.context);return{app:this.app,gameObjectManager:this.gameObjectManager}}async initSystems(){if(!this.context)throw new Error("[GameEngine] createApp() must be called before initSystems()");for(let e of this.systems)e.init&&await e.init()}async init(e){return await this.createApp(e),await this.initSystems(),{app:this.app,gameObjectManager:this.gameObjectManager}}registerSystems(e){this.systems.push(...e)}async start(){for(let e of this.systems)e.onStart&&await e.onStart();this.app.ticker.add(this.update.bind(this)),window.addEventListener("handler-preview:screen",e=>{let{width:t,height:i}=e.detail;this.resize(t,i)})}update(e){let t=e.deltaTime/60;this.totalTime+=t;for(let i of this.systems)i.update&&i.update(t,this.totalTime)}resize(e,t){for(let i of this.systems)i.onResize&&i.onResize(e,t)}updateConfig(e){this.config=e;for(let t of this.systems)t.context.config=e,t.onConfigUpdate&&t.onConfigUpdate(e)}destroy(){for(let e of this.systems)e.onDestroy&&e.onDestroy();this.app.ticker.remove(this.update.bind(this)),this.app.destroy(!0,{children:!0,texture:!1})}getApp(){return this.app}getGameObjectManager(){return this.gameObjectManager}getTotalTime(){return this.totalTime}getSystem(e){let t=this.systems.find(i=>i instanceof e);if(!t)throw new Error(`System ${e.name} not found!`);return t}};var Pt=class{setContext(e){this.context=e}};var Mt=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};import*as Qr from"pixi.js";var lo=Qr;typeof window!="undefined"&&(window.__basePixi=Qr);import{Sprite as co,Text as po,TextStyle as uo,Texture as es}from"pixi.js";var ts=r=>r*Math.PI/180;function go(r,e){var s,o,l,c,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 uo({fontFamily:(o=t.font)!=null?o:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(p=t.letterSpacing)!=null?p:0}),a=new po({text:t.text,style:n});return a.label=r,a}function ho(r){var p,d,u,g,f,h,m,b,v,y;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:s}=r,o={},l={},c={};t.sortableChildren=!0;for(let[w,x]of i.objects.entries()){if(s!=null&&s.has(w)||a&&!a.has(w)||(x==null?void 0:x.enabled)===!1)continue;let S=(d=(p=x==null?void 0:x.render)==null?void 0:p.asset)==null?void 0:d.path,O=(g=(u=x==null?void 0:x.render)==null?void 0:u.asset)==null?void 0:g.type,T=!!(S&&O==="image"),_=!!((f=x==null?void 0:x.ui)!=null&&f.text),I=_?(h=x==null?void 0:x.ui)==null?void 0:h.renderMode:void 0,C;if(I==="png"&&T?C="png":I==="text"&&_?C="text":T?C="png":_?C="text":C="skip",C!=="skip"){if(C==="text"){let E=go(w,x);if(!E)continue;let L=x.render;E.alpha=typeof(L==null?void 0:L.alpha)=="number"?L.alpha:1,E.visible=(L==null?void 0:L.visible)!==!1,E.zIndex=typeof(L==null?void 0:L.z_index)=="number"?L.z_index:0,L!=null&&L.anchor&&typeof L.anchor.x=="number"&&typeof L.anchor.y=="number"?E.anchor.set(L.anchor.x,L.anchor.y):E.anchor.set(.5,.5);let A=x.transform,k=(A==null?void 0:A.position)||(A==null?void 0:A.offset);k&&E.position.set((m=k.x)!=null?m:0,(b=k.y)!=null?b:0);let P=typeof(A==null?void 0:A.scale)=="number"?A.scale:1;E.scale.set(P,P);let R=typeof(A==null?void 0:A.rotation)=="number"?A.rotation:0;E.rotation=ts(R),E.parent||t.addChild(E);try{n.create(w,E)}catch{}o[w]=E,c[w]=E}else if(C==="png"){let E=be[w]||(typeof es!="undefined"?es.EMPTY:void 0),L=new co(E);L.label=w;let A=x.render;L.alpha=typeof(A==null?void 0:A.alpha)=="number"?A.alpha:1,L.visible=(A==null?void 0:A.visible)!==!1,L.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"&&L.anchor.set(A.anchor.x,A.anchor.y);let k=x.transform,P=(k==null?void 0:k.position)||(k==null?void 0:k.offset);P&&L.position.set((v=P.x)!=null?v:0,(y=P.y)!=null?y:0);let R=typeof(k==null?void 0:k.scale)=="number"?k.scale:1;L.scale.set(R,R);let M=typeof(k==null?void 0:k.rotation)=="number"?k.rotation:0;L.rotation=ts(M),L.parent||t.addChild(L);try{n.create(w,L)}catch{}o[w]=L,l[w]=L}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var Zn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Mt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var o;let s=this.registry.get(a);if(!s){console.warn("[Assets] No config found for object:",a);return}try{let l=await Re.create(a,s,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Re.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},is=new Zn,fo=new Proxy(is,{get(r,e){if(e in r&&typeof r[e]=="function")return r[e].bind(r);if(r.get(e))return r.get(e)}});function mo(r,e){is.init(r,e)}var Qn=class extends Pt{async init(){Bi(this.context.config,this.context.app),await be.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};import{Graphics as bo,Point as vo}from"pixi.js";var Pe={width:400,height:600,designWidth:400,scaleFactor:1},ji={scale:1,position:1},Ri=[];function yo(r,e,t,i,n,a,s){Ri.push({element:r,originalScale:a,positionHelper:e,heightPercent:n}),e(r,t,i,n,a,s,!1)}function xo(){Ri.forEach(({element:r,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*Pe.scaleFactor;t(r,Pe.width,Pe.height,i,n,!0,!1)})}function wo(){Ri.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function ea(r,e){console.log(`[SCREEN] updateScreenState called: ${r}x${e}`),Pe.width=r,Pe.height=e,Pe.scaleFactor=Math.min(r/Pe.designWidth,1.15),ji.scale=Pe.scaleFactor,ji.position=1,console.log(`[SCREEN] Global multipliers - scale: ${ji.scale.toFixed(3)}`),xo()}var q={layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}};function Eo(r,e,t){let i=q[r];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${r}.${e} = ${t}`))}function So(){return q}var Ao={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Oi(r,e){return typeof r=="number"&&Number.isFinite(r)?r:e}function ut(r,e={x:.5,y:.5}){var t;if(Array.isArray(r))return{x:Oi(r[0],e.x),y:Oi(r[1],e.y)};if(r&&typeof r=="object"){let i=r;return{x:Oi(i.x,e.x),y:Oi(i.y,e.y)}}if(typeof r=="string"){let i=r.trim().toLowerCase();return(t=Ao[i])!=null?t:e}return e}function It(r,e,t,i={}){var g,f,h,m,b,v;let n=ut(t),a=(g=i.inset)!=null?g:{},s=(f=i.padding)!=null?f:{x:0,y:0},o=((h=a.left)!=null?h:0)+s.x,l=((m=a.right)!=null?m:0)+s.x,c=((b=a.top)!=null?b:0)+s.y,p=((v=a.bottom)!=null?v:0)+s.y,d=Math.max(0,r-o-l),u=Math.max(0,e-c-p);return{x:o+d*n.x,y:c+u*n.y}}function Ot(r,e,t,i={}){var h,m,b,v,y,w;let n=(h=i.inset)!=null?h:{},a=(m=i.padding)!=null?m:{x:0,y:0},s=((b=n.left)!=null?b:0)+a.x,o=((v=n.right)!=null?v:0)+a.x,l=((y=n.top)!=null?y:0)+a.y,c=((w=n.bottom)!=null?w:0)+a.y,p=Math.max(0,r-s-o),d=Math.max(0,e-l-c),u=ut(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:s+p*g,y:l+d*f}}function ta(r,e,t,i={}){var p,d,u;if(!r)return;let n=i.positionRatio?Ot(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):It(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(p=i.offset)!=null?p:{x:0,y:0},s=n.x+a.x,o=n.y+a.y;r.anchor&&i.renderAnchor&&r.anchor.set(i.renderAnchor.x,i.renderAnchor.y),he(r,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)&&xe(r,l*c)}if(typeof window!="undefined"){let r=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==r||n!==e)&&(r=i,e=n,ea(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),ea(window.innerWidth,window.innerHeight),window.updateDebugConfig=Eo,window.getDebugConfig=So,window.copyConfig=Ro,window.applyConfig=_t,window.applyConfigForRatio=zo,window.positionAtBottom=ns,window.positionAtTop=Lo,window.positionAtCenter=ko,window.positionAtLeft=Po,window.positionAtRight=Mo,window.positionAtBottomLeft=_o,window.positionAtBottomRight=Io,window.positionAtTopLeft=Oo,window.positionAtTopRight=jo,window.applyPositionContract=To,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function zi(r,e,t=0){return r*e+t}function Di(r,e,t=0){return r*(1-e)+t}function $i(r,e,t=0){return r*e+t}function Hi(r,e,t=0){return r*(1-e)+t}function ce(r,e=0){return r/2+e}function Co(r,e){return r*e}function To(r,e,t,i){var s,o,l,c,p,d,u,g,f,h,m,b,v,y,w,x,S,O,T,_;let n=0,a=0;switch(i.type){case"top":n=ce(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),a=zi(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ce(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),a=Di(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=$i(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),a=ce(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=Hi(e,i.percent,(y=(v=i.offset)==null?void 0:v.x)!=null?y:0),a=ce(t,(x=(w=i.offset)==null?void 0:w.y)!=null?x:0);break;case"center":n=ce(e,(O=(S=i.offset)==null?void 0:S.x)!=null?O:0),a=ce(t,(_=(T=i.offset)==null?void 0:T.y)!=null?_:0);break}r.position?r.position.set(n,a):(r.x=n,r.y=a),i.scale!==void 0&&i.scale!==1&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(i.scale,i.scale):(r.scale.x=i.scale,r.scale.y=i.scale))}function ns(r,e,t,i=.2,n=1,a=!0,s=!1){let o=Co(t,i),l=Di(t,i/2);he(r,ce(e),l);let c=a?n*Pe.scaleFactor:n;xe(r,c),s&&!Ri.find(p=>p.element===r)&&yo(r,ns,e,t,i,n,a)}function Lo(r,e,t,i=.1,n=1){he(r,ce(e),zi(t,i)),xe(r,n)}function ko(r,e,t,i=0,n=0,a=1){he(r,ce(e,i),ce(t,n)),xe(r,a)}function Po(r,e,t,i=.1,n=1){he(r,$i(e,i),ce(t)),xe(r,n)}function Mo(r,e,t,i=.1,n=1){he(r,Hi(e,i),ce(t)),xe(r,n)}function _o(r,e,t,i=.05,n=.05,a=1){he(r,$i(e,n),Di(t,i)),xe(r,a)}function Io(r,e,t,i=.05,n=.05,a=1){he(r,Hi(e,n),Di(t,i)),xe(r,a)}function Oo(r,e,t,i=.05,n=.05,a=1){he(r,$i(e,n),zi(t,i)),xe(r,a)}function jo(r,e,t,i=.05,n=.05,a=1){he(r,Hi(e,n),zi(t,i)),xe(r,a)}function he(r,e,t){r&&r.position?typeof r.position.set=="function"?r.position.set(e,t):(r.position.x=e,r.position.y=t):r&&(r.x=e,r.y=t)}function xe(r,e){e!==1&&r&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(e,e):r.scale.x!==void 0&&r.scale.y!==void 0&&(r.scale.x=e,r.scale.y=e))}var qe={default:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1,screen_scale_y:1},engine:{scale:1,background_scale:1.05,background_offset_y:0,background_alpha:.98,label_pulse_speed:3,label_pulse_intensity:.03}},wide:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.9,screen_scale_y:1.1},engine:{scale:1,background_scale:1.1,background_offset_y:0,background_alpha:.95,label_pulse_speed:3,label_pulse_intensity:.03}},square:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:.85,screen_scale_y:.85},engine:{scale:1,background_scale:1,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}},tall:{layout:{scale_multiplier:1,position_offset:{x:0,y:0},debug_rect_visible:!0,debug_rect_color:16711680,debug_rect_thickness:4,debug_rect_scale_x:1,debug_rect_scale_y:1,screen_scale_x:1.1,screen_scale_y:.9},engine:{scale:1,background_scale:.95,background_offset_y:0,background_alpha:1,label_pulse_speed:3,label_pulse_intensity:.03}}};function Ro(r){return r&&qe[r]?JSON.parse(JSON.stringify(qe[r])):JSON.parse(JSON.stringify(q))}function _t(r){Object.keys(r).forEach(e=>{let t=e;q[t]&&r[t]&&Object.assign(q[t],r[t])}),console.log("Config applied:",r)}function zo(r,e){let t=r/e;t>1.6?(_t(qe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(_t(qe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(_t(qe.square),console.log("Applied SQUARE config for ratio:",t)):(_t(qe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let r=window;r.configPresets=qe,r.resolveAnchorVec2=r.resolveAnchorVec2||ut,r.resolveScreenAnchorPoint=r.resolveScreenAnchorPoint||It,r.resolveScreenRatioPoint=r.resolveScreenRatioPoint||Ot}var ae=null;function Do(r,e,t,i,n,a={}){var R,M,j,D,V,H,B,W,J,de,we,$e,$,ie,re,pe,se,fe,Ee,Se,F,Z,Y,te,Me,He,ia,na,aa,ra,sa,oa,la,ca;let s=(R=a.enableDebugLogs)!=null?R:!1;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== STARTING LAYOUT CALCULATION ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Screen dimensions:",{width:i.width,height:i.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Time:",t),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Options:",a));let{mainContainer:o,label:l,background:c,backgroundTexture:p,app:d}=r;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*q.layout.screen_scale_x,h=g*q.layout.screen_scale_y,m=u/2,b=e.engine.runtime||{},v=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:q.layout.screen_scale_x,screen_scale_y:q.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:",v));let y=v.design_width_portrait||400,w=f/y;w=Math.min(w,1.15);let x=w*((M=q.engine.scale)!=null?M:1),S=(j=a.skipMainContainerTransform)!=null?j:!1;!S&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(x):(o.scale.x=x,o.scale.y=x));let O=(D=v.main_container_anchor)!=null?D:"center",T=(V=v.main_container_position_ratio)!=null?V:{x:.5,y:.5},_=(H=v.main_container_offset)!=null?H:{x:0,y:0},I=v.main_container_position_ratio?Ot(u,g,T):It(u,g,O),C=I.x+_.x+q.layout.position_offset.x,E=I.y+_.y+q.layout.position_offset.y;if(!S&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(C,E):(o.position.x=C,o.position.y=E)),n&&(o!=null&&o.toLocal))for(let[ne,ee]of e.objects.entries()){let U=ee==null?void 0:ee.transform;if(!U||((B=U.position_mode)!=null?B:"static")!=="static")continue;let N=(W=n.get)==null?void 0:W.call(n,ne),me=((J=N==null?void 0:N.getDisplayObject)==null?void 0:J.call(N))||(N==null?void 0:N.pixiObject)||N;if(!me||me.parent!==o)continue;let jt=U.position_ratio!=null?Ot(u,g,U.position_ratio):It(u,g,(de=U.anchor)!=null?de:"center"),Rt=o.toLocal(new vo(jt.x,jt.y)),zt=(we=U.position)!=null?we:{x:0,y:0},Ne=Rt.x+zt.x,Ni=Rt.y+zt.y;typeof(N==null?void 0:N.setPosition)=="function"?N.setPosition(Ne,Ni):(he(me,Ne,Ni),($e=N==null?void 0:N.transform)!=null&&$e.position&&(N.transform.position.x=Ne,N.transform.position.y=Ni))}let L=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,k=((L==null?void 0:L.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(q.layout.debug_rect_visible&&k){(!ae||ae.parent!==d.stage)&&(ae==null||ae.destroy(),ae=new bo,ae.zIndex=9999,d.stage.addChild(ae)),ae.clear();let ne=q.layout.debug_rect_scale_x,ee=q.layout.debug_rect_scale_y,U=(u-4)*ne,_e=(g-4)*ee,N=(u-U)/2,me=(g-_e)/2;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:u,baseHeight:g,rectW:U,rectH:_e,offsetX:N,offsetY:me}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+N,y:2+me,width:U,height:_e})),ae.rect(2+N,2+me,U,_e).stroke({width:q.layout.debug_rect_thickness,color:q.layout.debug_rect_color})}else ae&&(ae.destroy(),ae=null);let P=(($=r.label)==null?void 0:$.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&P){let ne=(re=(ie=P==null?void 0:P.transform)==null?void 0:ie.anchor)!=null?re:"center",ee=(pe=P==null?void 0:P.transform)==null?void 0:pe.position_ratio,U=((se=P==null?void 0:P.transform)==null?void 0:se.offset)||{x:0,y:0};ta(l,u,g,{anchor:ne,positionRatio:ee,offset:{x:U.x*x,y:U.y*x},renderAnchor:ut(ne)})}if(l&&l.alpha>0){let ne=1+Math.sin(t*q.engine.label_pulse_speed)*q.engine.label_pulse_intensity,ee=(Ee=(fe=P==null?void 0:P.transform)==null?void 0:fe.scale)!=null?Ee:1,U=ne*x*ee;l.scale&&(typeof l.scale.set=="function"?l.scale.set(U):(l.scale.x=U,l.scale.y=U))}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:",(Se=c.constructor)==null?void 0:Se.name)),c.alpha=((Z=(F=b.background)==null?void 0:F.alpha)!=null?Z:.98)*q.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let ne=e.objects.get("background_1");s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",ne);let ee=(ne==null?void 0:ne.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ee);let U=ee.offset||{x:0,y:0},_e=((te=(Y=b.background)==null?void 0:Y.offset_y)!=null?te:0)+q.engine.background_offset_y,N=(Me=ee.anchor)!=null?Me:"center",me=ee.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:U,bgRuntimeOffsetY:_e,bgScreenAnchor:N,bgPositionRatio:me,baseWidth:u,baseHeight:g,finalScale:x}),ta(c,u,g,{anchor:N,positionRatio:me,offset:{x:U.x*x,y:U.y*x+_e},renderAnchor:ut(N)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(He=c.scale)==null?void 0:He.x,scaleY:(ia=c.scale)==null?void 0:ia.y,anchorX:(na=c.anchor)==null?void 0:na.x,anchorY:(aa=c.anchor)==null?void 0:aa.y,pivotX:(ra=c.pivot)==null?void 0:ra.x,pivotY:(sa=c.pivot)==null?void 0:sa.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:p==null?void 0:p.width,textureHeight:p==null?void 0:p.height})),p){let jt=Math.max(f/p.width,h/p.height),Rt=(la=(oa=b.background)==null?void 0:oa.scale_multiplier)!=null?la:1.05,zt=(ca=ee.scale)!=null?ca:1,Ne=jt*Rt*q.engine.background_scale*zt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Ne):(c.scale.x=Ne,c.scale.y=Ne))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-f/2,-h/2,f,h).fill({color:1444375}))}}function $o(r){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=r,s=((l=(o=n.engine)==null?void 0:o.runtime)==null?void 0:l.timeline)||{};e(a.showHook),setTimeout(()=>{t(1),i(1),e(a.waitInput),console.log("[GAME] \u23F3 Game ready for user input - tutorial shown")},(c=s.tutorial_delay_ms)!=null?c:1500)}export{qa as a,Kn as b,Pi as c,Mi as d,_i as e,kt as f,eo as g,to as h,io as i,no as j,Dn as k,oo as l,Re as m,Jn as n,Pt as o,Mt as p,lo as q,ho as r,fo as s,mo as t,Qn as u,ji as v,wo as w,ea as x,ut as y,It as z,Ot as A,ta as B,Do as C,$o as D,Va as E,Ya as F,Zi as G,Ke as H,Jo as I,Ei as J,Mn as K,Ir as L,On as M,Nd as N,Fd as O,Te as P,Ns as Q,Fs as R,Hn as S,ye as T,Ce as U};