handler-playable-sdk 0.5.546 → 0.5.548

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 ye,e as Ui}from"./chunk-I5OOVR5U.js";import{i as Nt}from"./chunk-PW2FGMCO.js";import{c as gt,d as $t,e as Fe,g as pa,h as Gi,j as ua,k as ga,n as qi,o as Ht,p as Ve,q as ha,r as Vi,s as ma}from"./chunk-HVKF2KYL.js";import{a as as}from"./chunk-JXBG6UFL.js";import{Application as Zs}from"pixi.js";var _e={};function Bt(r,e,t=!1){_e[r]||(_e[r]=[]),_e[r].push({fn:e,once:t})}function Yi(r,e){if(_e[r]){if(!e){delete _e[r];return}_e[r]=_e[r].filter(t=>t.fn!==e)}}function Ft(r,...e){let t=_e[r];if(t)for(let i of[...t])i.fn(...e),i.once&&Yi(r,i.fn)}function de(r,e){Bt(r,e,!0)}var X=null,he=[],Ye=null;function va(r){X=r,he=[],Ye!==null&&(clearTimeout(Ye),Ye=null)}function ya(){var r,e,t;return{endpoint:(X==null?void 0:X.endpoint)||"",transport:(X==null?void 0:X.transport)||"beacon",batchSize:(r=X==null?void 0:X.batchSize)!=null?r:10,flushIntervalMs:(e=X==null?void 0:X.flushIntervalMs)!=null?e:300,maxQueue:(t=X==null?void 0:X.maxQueue)!=null?t:200,debug:!!(X!=null&&X.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 Wi(r,e){let t=ya();if(e&&t.endpoint){if(he.push(r),he.length>t.maxQueue&&(he=he.slice(he.length-t.maxQueue)),he.length>=t.batchSize){ba();return}Ye===null&&(Ye=window.setTimeout(()=>{Ye=null,ba()},t.flushIntervalMs))}}async function ba(){let r=ya();if(!r.endpoint||he.length===0)return;let e=he.splice(0,r.batchSize);await fa(r.endpoint,{events:e},r.transport,r.debug),he.length>0&&await fa(r.endpoint,{events:he.splice(0,r.batchSize)},r.transport,r.debug)}function xa(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 wa(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 Ea(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 Sa(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 Aa(){let r=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),r.size>0&&i()})},n=d=>{var u;r.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{r.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},s=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var p,u;let d=ht();for(let g of Array.from(r)){if(g.killed||g.paused)continue;let m=d-g.startMs-g.delayMs;if(m<0)continue;let h=g.durationMs>0?m/g.durationMs:1,f=xa(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 w=h-v;f=xa(w)}let x=g.ease(f);g.yoyo&&v%2===1&&(x=1-x);for(let w of g.props)wa(g.target,w.key,w.from+(w.to-w.from)*x);g.scaleFrom&&g.scaleTo&&Ea(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*x,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*x});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(h>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var w;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),m=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((w=u==null?void 0:u.delayMsOverride)!=null?w:0)),h=rs(p.ease),f=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,v=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),x=[];for(let I of Object.keys(p)){if(v.has(I))continue;let R=p[I];typeof R=="number"&&x.push({key:I,from:ss(d,I),to:R})}let y=Sa(d,p);return{target:d,startMs:ht(),delayMs:m,durationMs:g,ease:h,props:x,scaleFrom:y.from,scaleTo:y.to,repeat:f,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ht())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:ht(),m=ht()-g;u.startMs+=m,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let m=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof m=="number"&&wa(d,g,m)}let u=Sa(d,p);u.to&&Ea(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))s(u)},timeline(d={}){let p=[],u=0,g=!1,m=[],h=v=>{if(typeof v=="number")return Math.max(0,v*1e3);let x=typeof v=="string"?v.trim():"";return x.startsWith("+=")?u+Math.max(0,Number(x.slice(2))*1e3||0):x?Math.max(0,Number(x)*1e3||0):u},f=v=>{p.push(v);let x=Math.max(0,(typeof v.vars.duration=="number"?v.vars.duration:.5)*1e3);u=Math.max(u,v.atMs+x)},b={to(v,x,y){return f({kind:"to",target:v,vars:x,atMs:h(y)}),b},fromTo(v,x,y,w){return f({kind:"fromTo",target:v,vars:y,from:x,atMs:h(w)}),b},play(){var v,x;if(g)return b;g=!0,m=[];for(let y of p)y.kind==="fromTo"&&c.set(y.target,(v=y.from)!=null?v:{}),m.push(c.to(y.target,{...y.vars,delay:y.atMs/1e3+((x=y.vars.delay)!=null?x:0)}));return b},pause(){for(let v of m)v.pause();return b},kill(){for(let v of m)v.kill();m=[],g=!1}};return d.paused||b.play(),b}};return c}function Ta(){if(typeof window=="undefined")return;let r=window;if(!r.gsap)try{r.gsap=Aa()}catch{}}var Ca={name:"handler-playable-sdk",version:"0.5.546",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 pe=0,cs=pe++,La=pe++,ka=pe++,Ma=pe++,Pa=pe++,Ia=pe++,ja=pe++,_a=pe++,Oa=pe++,Ra=pe++,za=pe++,Da=pe++,V=cs;function $a(){return V===La}function Ha(){return V===ka}function Na(){return V===Ma}function Ba(){return V===Pa}function We(){return V===Ia}function Ke(){return V===ja}function Fa(){return V===_a}function Ua(){return V===Oa}function Ga(){return V===Ra}function Ki(){return V===za}function Xi(){return V===Da}function qa(){let r=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(r==="mraid")try{mraid.getState(),V=La;return}catch{}else if(r==="dapi")try{dapi.isReady(),V=ka;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(V=Ma)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(V=Pa)}catch{}else if(e==="mintegral")window.gameReady&&(V=Ia);else if(e==="tapjoy")window.TJ_API&&(V=ja);else if(e==="tiktok")window.openAppStore&&(V=_a);else if(e==="smadex")try{window.smxTracking&&(V=Oa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(V=Ra)}catch{}else e==="vungle"?V=za:(r==="nucleo"||e==="nucleo")&&(V=Da)}import Ji from"lottie-web";var Va=Ji;typeof window!="undefined"&&(window.lottie=Ji,window.__baseLottie=Ji);function J(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:J(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:J(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:J(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:J(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:J(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:J(360,780)}],Ko=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:J(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:J(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:J(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:J(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:J(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:J(412,915)}],Xo=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:J(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:J(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:J(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:J(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:J(800,1280)}],Zi=[{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:J(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:J(768,1024),mraidScale:.7}];var Ya=[...Zi],Wa=[{category:"playable",label:"Playable Ad",devices:Zi}],Qi=Zi[0];function Xe(r){return Ya.find(e=>e.id===r)||Qi}function Jo(r){return Ya.filter(e=>e.category===r)}var Oe=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let s=a(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}gt({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let p=window.__editableConfig,u=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:s;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function en(r){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let s=n.result,o=r.category||"misc",c=`${(r.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:s,overwrite:!0})})).json();if(!(p!=null&&p.success)){alert(`Upload failed: ${(p==null?void 0:p.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await r.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Ut=class{constructor(){this.updateManager=new Oe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let s=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,s);break;case"ai-edit":this.openAIEditor(t,i,s);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,s);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let s=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===a||d.slotId===a)){let d=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:d,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:d,assetType:"image"}),n.categories&&!n.categories.includes(d)&&n.categories.push(d),n.libraryAssets&&!n.libraryAssets[d]&&(n.libraryAssets[d]=[]);let p=window.reRenderAssetLibrary;typeof p=="function"&&p()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(n.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(e),l=(a=o==null?void 0:o.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var s;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((s=n==null?void 0:n.identity)==null?void 0:s.category)||(t.split(".")[0]==="render"?"environment":"ui");en({objectId:e,category:a,onApply:async o=>{var d,p;await this.updateManager.updateProperty(e,t,o);let l=window.__debugContext;(p=(d=l==null?void 0:l.options)==null?void 0:d.onPropertyChange)==null||p.call(d,e,t,o);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(n):typeof s.schemas=="object"&&(o=s.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let s=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,s,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var ds=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],ps=["environment","ui","character","system","backgrounds"],us=["bg","world","ui"],Ka={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}}},Gt=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 Ki,d as ye,e as Xi}from"./chunk-I5OOVR5U.js";import{i as Ut}from"./chunk-PW2FGMCO.js";import{c as Ve,d as Ft,e as We,g as va,h as Ji,j as ya,k as wa,n as Zi,o as Bt,p as Ze,q as xa,r as Qi,s as Sa}from"./chunk-HVKF2KYL.js";import{a as us}from"./chunk-JXBG6UFL.js";import{Application as _o}from"pixi.js";var Re={};function Gt(s,e,t=!1){Re[s]||(Re[s]=[]),Re[s].push({fn:e,once:t})}function en(s,e){if(Re[s]){if(!e){delete Re[s];return}Re[s]=Re[s].filter(t=>t.fn!==e)}}function qt(s,...e){let t=Re[s];if(t)for(let i of[...t])i.fn(...e),i.once&&en(s,i.fn)}function de(s,e){Gt(s,e,!0)}var X=null,he=[],Qe=null;function Ca(s){X=s,he=[],Qe!==null&&(clearTimeout(Qe),Qe=null)}function Ta(){var s,e,t;return{endpoint:(X==null?void 0:X.endpoint)||"",transport:(X==null?void 0:X.transport)||"beacon",batchSize:(s=X==null?void 0:X.batchSize)!=null?s:10,flushIntervalMs:(e=X==null?void 0:X.flushIntervalMs)!=null?e:300,maxQueue:(t=X==null?void 0:X.maxQueue)!=null?t:200,debug:!!(X!=null&&X.debug)}}async function Ea(s,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(s,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(s,{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 tn(s,e){let t=Ta();if(e&&t.endpoint){if(he.push(s),he.length>t.maxQueue&&(he=he.slice(he.length-t.maxQueue)),he.length>=t.batchSize){Aa();return}Qe===null&&(Qe=window.setTimeout(()=>{Qe=null,Aa()},t.flushIntervalMs))}}async function Aa(){let s=Ta();if(!s.endpoint||he.length===0)return;let e=he.splice(0,s.batchSize);await Ea(s.endpoint,{events:e},s.transport,s.debug),he.length>0&&await Ea(s.endpoint,{events:he.splice(0,s.batchSize)},s.transport,s.debug)}function La(s){return Math.max(0,Math.min(1,s))}function gs(s){let e=String(s!=null?s:"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 yt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function hs(s,e){let t=s==null?void 0:s[e];return typeof t=="number"?t:0}function ka(s,e,t){try{s[e]=t}catch{}}function ms(s){let e=s==null?void 0:s.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 Pa(s,e){let t=s==null?void 0:s.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 Ma(s,e){let t=ms(s);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 Ia(){let s=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),s.size>0&&i()})},n=d=>{var u;s.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{s.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},r=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var p,u;let d=yt();for(let g of Array.from(s)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let m=g.durationMs>0?h/g.durationMs:1,f=La(m),v=g.repeat>=0?g.repeat+1:1,b=g.repeat>0?Math.min(Math.floor(m),v-1):0;if(g.repeat>0&&m>=1){let x=m-b;f=La(x)}let w=g.ease(f);g.yoyo&&b%2===1&&(w=1-w);for(let x of g.props)ka(g.target,x.key,x.from+(x.to-x.from)*w);g.scaleFrom&&g.scaleTo&&Pa(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*w,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*w});try{(p=g.onUpdate)==null||p.call(g)}catch{}if(m>=v){r(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var x;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((x=u==null?void 0:u.delayMsOverride)!=null?x:0)),m=gs(p.ease),f=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,v=p.yoyo===!0,b=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),w=[];for(let I of Object.keys(p)){if(b.has(I))continue;let j=p[I];typeof j=="number"&&w.push({key:I,from:hs(d,I),to:j})}let y=Ma(d,p);return{target:d,startMs:yt(),delayMs:h,durationMs:g,ease:m,props:w,scaleFrom:y.from,scaleTo:y.to,repeat:f,yoyo:v,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>r(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=yt())},resume:()=>{var m;if(!u.paused)return;let g=(m=u.pauseAtMs)!=null?m:yt(),h=yt()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&ka(d,g,h)}let u=Ma(d,p);u.to&&Pa(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))r(u)},timeline(d={}){let p=[],u=0,g=!1,h=[],m=b=>{if(typeof b=="number")return Math.max(0,b*1e3);let w=typeof b=="string"?b.trim():"";return w.startsWith("+=")?u+Math.max(0,Number(w.slice(2))*1e3||0):w?Math.max(0,Number(w)*1e3||0):u},f=b=>{p.push(b);let w=Math.max(0,(typeof b.vars.duration=="number"?b.vars.duration:.5)*1e3);u=Math.max(u,b.atMs+w)},v={to(b,w,y){return f({kind:"to",target:b,vars:w,atMs:m(y)}),v},fromTo(b,w,y,x){return f({kind:"fromTo",target:b,vars:y,from:w,atMs:m(x)}),v},play(){var b,w;if(g)return v;g=!0,h=[];for(let y of p)y.kind==="fromTo"&&c.set(y.target,(b=y.from)!=null?b:{}),h.push(c.to(y.target,{...y.vars,delay:y.atMs/1e3+((w=y.vars.delay)!=null?w:0)}));return v},pause(){for(let b of h)b.pause();return v},kill(){for(let b of h)b.kill();h=[],g=!1}};return d.paused||v.play(),v}};return c}function ja(){if(typeof window=="undefined")return;let s=window;if(!s.gsap)try{s.gsap=Ia()}catch{}}var _a={name:"handler-playable-sdk",version:"0.5.548",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 pe=0,bs=pe++,Oa=pe++,Ra=pe++,za=pe++,Da=pe++,$a=pe++,Ha=pe++,Na=pe++,Fa=pe++,Ba=pe++,Ua=pe++,Ga=pe++,W=bs;function qa(){return W===Oa}function Va(){return W===Ra}function Wa(){return W===za}function Ya(){return W===Da}function et(){return W===$a}function tt(){return W===Ha}function Ka(){return W===Na}function Xa(){return W===Fa}function Ja(){return W===Ba}function nn(){return W===Ua}function an(){return W===Ga}function Za(){let s=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(s==="mraid")try{mraid.getState(),W=Oa;return}catch{}else if(s==="dapi")try{dapi.isReady(),W=Ra;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(W=za)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(W=Da)}catch{}else if(e==="mintegral")window.gameReady&&(W=$a);else if(e==="tapjoy")window.TJ_API&&(W=Ha);else if(e==="tiktok")window.openAppStore&&(W=Na);else if(e==="smadex")try{window.smxTracking&&(W=Fa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(W=Ba)}catch{}else e==="vungle"?W=Ua:(s==="nucleo"||e==="nucleo")&&(W=Ga)}import rn from"lottie-web";var Qa=rn;typeof window!="undefined"&&(window.lottie=rn,window.__baseLottie=rn);function J(s,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(s,e);return`${s/i}:${e/i}`}var ol=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:J(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:J(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:J(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:J(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:J(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:J(360,780)}],ll=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:J(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:J(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:J(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:J(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:J(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:J(412,915)}],cl=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:J(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:J(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:J(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:J(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:J(800,1280)}],sn=[{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:J(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:J(768,1024),mraidScale:.7}];var er=[...sn],tr=[{category:"playable",label:"Playable Ad",devices:sn}],on=sn[0];function it(s){return er.find(e=>e.id===s)||on}function dl(s){return er.filter(e=>e.category===s)}var ze=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let r=a(e);if(!r){console.error("[PropertyUpdateManager] Config not found for:",e);return}Ve({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let p=window.__editableConfig,u=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:r;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 ln(s){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 r=n.result,o=s.category||"misc",c=`${(s.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:r,overwrite:!0})})).json();if(!(p!=null&&p.success)){alert(`Upload failed: ${(p==null?void 0:p.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await s.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Vt=class{constructor(){this.updateManager=new ze}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 r=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,r);break;case"ai-edit":this.openAIEditor(t,i,r);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,r);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 r=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",r),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",r)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===a||d.slotId===a)){let d=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:d,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:d,assetType:"image"}),n.categories&&!n.categories.includes(d)&&n.categories.push(d),n.libraryAssets&&!n.libraryAssets[d]&&(n.libraryAssets[d]=[]);let p=window.reRenderAssetLibrary;typeof p=="function"&&p()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let r=window.__updateWorkbenchTabs;typeof r=="function"&&r()}if(n.libraryPanel){let r=window.getEditableObjectConfig,o=r==null?void 0:r(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 r;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((r=n==null?void 0:n.identity)==null?void 0:r.category)||(t.split(".")[0]==="render"?"environment":"ui");ln({objectId:e,category:a,onApply:async o=>{var d,p;await this.updateManager.updateProperty(e,t,o);let l=window.__debugContext;(p=(d=l==null?void 0:l.options)==null?void 0:d.onPropertyChange)==null||p.call(d,e,t,o);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),r=window.__editableConfig;if(!(r!=null&&r.schemas))return;let o=null;if(r.schemas instanceof Map?o=r.schemas.get(n):typeof r.schemas=="object"&&(o=r.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 r=`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,r,"",{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 vs=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],ys=["environment","ui","character","system","backgrounds"],ws=["bg","world","ui"],ir={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}}},Wt=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
2
2
  <div class="wizard-card">
3
3
  <div class="wizard-header">
4
4
  <div class="wizard-title">
@@ -50,19 +50,19 @@ import{c as Fi,d as ye,e as Ui}from"./chunk-I5OOVR5U.js";import{i as Nt}from"./c
50
50
  <div class="wizard-field-group">
51
51
  <label class="wizard-label required">Category</label>
52
52
  <select class="wizard-select" data-field="category">
53
- ${ps.map(e=>`<option value="${e}">${e}</option>`).join("")}
53
+ ${ys.map(e=>`<option value="${e}">${e}</option>`).join("")}
54
54
  </select>
55
55
  </div>
56
56
  <div class="wizard-field-group">
57
57
  <label class="wizard-label required">Screen</label>
58
58
  <select class="wizard-select" data-field="screenId" required>
59
- ${ds.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}
59
+ ${vs.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}
60
60
  </select>
61
61
  </div>
62
62
  <div class="wizard-field-group">
63
63
  <label class="wizard-label required">Layer</label>
64
64
  <select class="wizard-select" data-field="layer">
65
- ${us.map(e=>`<option value="${e}">${e}</option>`).join("")}
65
+ ${ws.map(e=>`<option value="${e}">${e}</option>`).join("")}
66
66
  </select>
67
67
  </div>
68
68
  </div>
@@ -221,7 +221,7 @@ import{c as Fi,d as ye,e as Ui}from"./chunk-I5OOVR5U.js";import{i as Nt}from"./c
221
221
  <label class="wizard-label">Logic Component</label>
222
222
  <select class="wizard-select" data-field="logicId">
223
223
  <option value="">None</option>
224
- ${Object.keys(Ka).map(e=>`<option value="${e}">${e}</option>`).join("")}
224
+ ${Object.keys(ir).map(e=>`<option value="${e}">${e}</option>`).join("")}
225
225
  </select>
226
226
  </div>
227
227
  <div class="wizard-field-group">
@@ -248,14 +248,14 @@ import{c as Fi,d as ye,e as Ui}from"./chunk-I5OOVR5U.js";import{i as Nt}from"./c
248
248
  <div class="wizard-type-icon">${t}</div>
249
249
  <div class="wizard-type-name">${i}</div>
250
250
  </button>
251
- `}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var a;let i=t.target,n=i.dataset.action||((a=i.closest("[data-action]"))==null?void 0:a.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let a=n.dataset.assetAction;a&&(t.preventDefault(),this.handleAssetAction(a))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let a=n.dataset.objectType;a&&this.setObjectType(a)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";en({objectId:e,category:t,onApply:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}})}openAiPicker(){if(!this.state)return;this.setAssetPickerHint('Generate and click "Save to Library" to use it here.'),window.__wizardAssetPicker={onPick:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__openAiEditor;if(typeof e!="function"){alert("AI Editor is not available.");return}let t=this.state.displayName||this.state.instanceId||"new asset";e(this.state.instanceId||"new_asset",`Create an image for ${t}`,"",{})}setAssetPickerHint(e){if(!this.modal)return;let t=this.modal.querySelector("[data-asset-picker-hint]");if(t){if(!e){t.style.display="none",t.textContent="";return}t.textContent=e,t.style.display="block"}}handleFieldChange(e){if(!this.state)return;let t=e.dataset.field;if(t){if(e instanceof HTMLInputElement&&e.type==="checkbox")this.state[t]=e.checked;else if(e instanceof HTMLInputElement&&e.type==="number"){let i=e.value===""?0:Number(e.value);this.state[t]=Number.isNaN(i)?0:i}else this.state[t]=e.value;t==="anchorPreset"&&this.applyAnchorPreset(this.state.anchorPreset),t==="logicId"&&this.applyLogicDefaults(this.state.logicId),this.updateStepUI()}}setObjectType(e){this.state&&(this.state.objectType=e,this.state.scale=e==="sprite"||e==="ui-image"?.2:1,(e==="ui-text"||e==="ui-image")&&(this.state.category="ui",this.state.layer="ui"),this.updateStepUI())}applyAnchorPreset(e){if(!this.state)return;let t={center:[.5,.5],"top-left":[0,0],"top-right":[1,0],"bottom-left":[0,1],"bottom-right":[1,1]};if(e!=="custom"&&t[e]){let[i,n]=t[e];this.state.anchorX=i,this.state.anchorY=n}}applyLogicDefaults(e){if(!this.state)return;if(!e){this.state.logicPropsRaw="";return}let t=Ka[e];t&&(this.state.logicPropsRaw=JSON.stringify(t,null,2))}goToStep(e){if(!this.state)return;let t=Math.max(1,Math.min(6,e));this.state.step=t,this.updateStepUI()}updateStepUI(){if(!this.modal||!this.state)return;Array.from(this.modal.querySelectorAll(".wizard-step")).forEach(t=>{let i=Number(t.dataset.step||"0");t.classList.toggle("active",i===this.state.step)}),this.updateProgressDots(),this.updateTypeSections(),this.syncFieldValues(),this.updatePreview(),this.updateActionButtons()}updateProgressDots(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-wizard-progress]");if(!e)return;let t=Array.from({length:6},(i,n)=>{let a=n+1;return`
251
+ `}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var a;let i=t.target,n=i.dataset.action||((a=i.closest("[data-action]"))==null?void 0:a.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let a=n.dataset.assetAction;a&&(t.preventDefault(),this.handleAssetAction(a))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let a=n.dataset.objectType;a&&this.setObjectType(a)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";ln({objectId:e,category:t,onApply:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}})}openAiPicker(){if(!this.state)return;this.setAssetPickerHint('Generate and click "Save to Library" to use it here.'),window.__wizardAssetPicker={onPick:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__openAiEditor;if(typeof e!="function"){alert("AI Editor is not available.");return}let t=this.state.displayName||this.state.instanceId||"new asset";e(this.state.instanceId||"new_asset",`Create an image for ${t}`,"",{})}setAssetPickerHint(e){if(!this.modal)return;let t=this.modal.querySelector("[data-asset-picker-hint]");if(t){if(!e){t.style.display="none",t.textContent="";return}t.textContent=e,t.style.display="block"}}handleFieldChange(e){if(!this.state)return;let t=e.dataset.field;if(t){if(e instanceof HTMLInputElement&&e.type==="checkbox")this.state[t]=e.checked;else if(e instanceof HTMLInputElement&&e.type==="number"){let i=e.value===""?0:Number(e.value);this.state[t]=Number.isNaN(i)?0:i}else this.state[t]=e.value;t==="anchorPreset"&&this.applyAnchorPreset(this.state.anchorPreset),t==="logicId"&&this.applyLogicDefaults(this.state.logicId),this.updateStepUI()}}setObjectType(e){this.state&&(this.state.objectType=e,this.state.scale=e==="sprite"||e==="ui-image"?.2:1,(e==="ui-text"||e==="ui-image")&&(this.state.category="ui",this.state.layer="ui"),this.updateStepUI())}applyAnchorPreset(e){if(!this.state)return;let t={center:[.5,.5],"top-left":[0,0],"top-right":[1,0],"bottom-left":[0,1],"bottom-right":[1,1]};if(e!=="custom"&&t[e]){let[i,n]=t[e];this.state.anchorX=i,this.state.anchorY=n}}applyLogicDefaults(e){if(!this.state)return;if(!e){this.state.logicPropsRaw="";return}let t=ir[e];t&&(this.state.logicPropsRaw=JSON.stringify(t,null,2))}goToStep(e){if(!this.state)return;let t=Math.max(1,Math.min(6,e));this.state.step=t,this.updateStepUI()}updateStepUI(){if(!this.modal||!this.state)return;Array.from(this.modal.querySelectorAll(".wizard-step")).forEach(t=>{let i=Number(t.dataset.step||"0");t.classList.toggle("active",i===this.state.step)}),this.updateProgressDots(),this.updateTypeSections(),this.syncFieldValues(),this.updatePreview(),this.updateActionButtons()}updateProgressDots(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-wizard-progress]");if(!e)return;let t=Array.from({length:6},(i,n)=>{let a=n+1;return`
252
252
  <div class="wizard-step-indicator">
253
253
  <span class="wizard-step-dot ${a===this.state.step?"active":a<this.state.step?"completed":""}"></span>
254
254
  <span class="wizard-step-label">Step ${a}</span>
255
255
  </div>
256
- `});e.innerHTML=t.join("")}updateTypeSections(){if(!this.modal||!this.state)return;let e=this.state.objectType;Array.from(this.modal.querySelectorAll("[data-type-section]")).forEach(n=>{let a=n.dataset.typeSection,o=a==="sprite"&&(e==="sprite"||e==="ui-image")||a===e;n.style.display=o?"block":"none"});let i=this.modal.querySelector("[data-type-help]");if(i){let n=e==="ui-text"?"UI text uses the UI renderer with font settings.":e==="graphics"?"Graphics are simple shapes with width/height and fill.":e==="container"?"Containers are empty parents for grouping objects.":"Sprite/UI image uses image assets.";i.textContent=n}}syncFieldValues(){if(!this.modal||!this.state)return;let e=this.state;Array.from(this.modal.querySelectorAll("[data-field]")).forEach(n=>{let a=n.dataset.field;if(!a)return;let s=e[a];n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked=!!s:typeof s!="undefined"&&(n.value=String(s))}),Array.from(this.modal.querySelectorAll("[data-object-type]")).forEach(n=>{n.classList.toggle("selected",n.dataset.objectType===this.state.objectType)})}updatePreview(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-preview-json]"),t=this.modal.querySelector("[data-validation-errors]");if(!e||!t)return;let i=this.buildPayload();e.textContent=JSON.stringify(i,null,2);let n=this.validate();n.length>0?(t.style.display="block",t.textContent=n.join(`
257
- `)):(t.style.display="none",t.textContent="")}updateActionButtons(){if(!this.modal||!this.state)return;let e=this.modal.querySelector('[data-action="back"]'),t=this.modal.querySelector('[data-action="next"]');e&&(e.disabled=this.state.step===1),t&&(t.textContent=this.state.step===6?"Create":"Next",t.disabled=this.state.step===6&&this.validate().length>0)}validate(){if(!this.state)return[];let e=[],t=this.state.instanceId.trim();return t||e.push("Object ID is required."),t.startsWith("json.")&&e.push('Object ID must not start with "json." (instance id only).'),t&&!/^[a-zA-Z0-9._-]+$/.test(t)&&e.push("Object ID must use letters, numbers, dot, dash, or underscore."),t&&!this.isInstanceIdUnique(t)&&e.push(`Object ID "${t}" already exists.`),(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&!this.state.assetPath.trim()&&e.push("Asset path is required for image-based objects."),this.state.objectType==="ui-text"&&!this.state.text.trim()&&e.push("Text content is required for UI Text."),e}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}buildPayload(){if(!this.state)return{};let e=this.state.instanceId.trim(),t=`json.${e}`;return{screenId:this.state.screenId,instanceId:e,objectConfigId:t,layer:this.state.layer,config:this.buildObjectConfig(t)}}buildObjectConfig(e){if(!this.state)return{};let t={identity:{id:e,category:this.state.category},transform:{position:{x:this.state.positionX,y:this.state.positionY},offset:{x:this.state.offsetX,y:this.state.offsetY},scale:this.state.scale,rotation:this.state.rotation,anchor:{x:this.state.anchorX,y:this.state.anchorY},position_ratio:null,position_mode:this.state.positionMode},render:{alpha:this.state.alpha,visible:!0,tint:this.state.tint||null,z_index:this.state.zIndex},instance_id:this.state.instanceId.trim(),object_config:e};return(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&(t.render.asset={type:"image",path:this.normalizeAssetPath(this.state.assetPath.trim())}),this.state.objectType==="ui-text"&&(t.ui={kind:"text",renderMode:"text",text:this.state.text,font:this.state.font,fontSize:this.state.fontSize,letterSpacing:this.state.letterSpacing,align:this.state.align,color:this.state.tint||"#FFFFFF"},t.render.tint=null),this.state.objectType==="graphics"&&(t.effects={width:this.state.graphicsWidth,height:this.state.graphicsHeight,fill_color:this.state.graphicsFill,fill_alpha:this.state.graphicsAlpha}),this.state.interactionEnabled&&(t.interaction={enabled:!0,drag:{enabled:this.state.dragEnabled},hover:{enabled:this.state.hoverEnabled},click:{enabled:this.state.clickEnabled}}),this.state.logicId&&(t.logic={id:this.state.logicId,props:this.parseLogicProps(this.state.logicPropsRaw)}),t}parseLogicProps(e){if(!e||!e.trim())return{};try{return JSON.parse(e)}catch{return{}}}normalizeAssetPath(e){return!e||e.startsWith("raw/")?e:e.startsWith("/raw/")?e.replace(/^\/raw\//,"raw/"):e}async submit(){var i;if(!this.state)return;if(this.validate().length>0){this.updatePreview();return}let t=this.buildPayload();try{let n=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let s=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
258
- `))||(a==null?void 0:a.error)||"Failed to create object.";alert(s);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),this.close()}catch(n){alert(`Failed to create object: ${n instanceof Error?n.message:String(n)}`)}}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[AddObjectWizard] Failed to sync screens:",e)}}};var qt=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.options=e}open(e){this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=`
256
+ `});e.innerHTML=t.join("")}updateTypeSections(){if(!this.modal||!this.state)return;let e=this.state.objectType;Array.from(this.modal.querySelectorAll("[data-type-section]")).forEach(n=>{let a=n.dataset.typeSection,o=a==="sprite"&&(e==="sprite"||e==="ui-image")||a===e;n.style.display=o?"block":"none"});let i=this.modal.querySelector("[data-type-help]");if(i){let n=e==="ui-text"?"UI text uses the UI renderer with font settings.":e==="graphics"?"Graphics are simple shapes with width/height and fill.":e==="container"?"Containers are empty parents for grouping objects.":"Sprite/UI image uses image assets.";i.textContent=n}}syncFieldValues(){if(!this.modal||!this.state)return;let e=this.state;Array.from(this.modal.querySelectorAll("[data-field]")).forEach(n=>{let a=n.dataset.field;if(!a)return;let r=e[a];n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked=!!r:typeof r!="undefined"&&(n.value=String(r))}),Array.from(this.modal.querySelectorAll("[data-object-type]")).forEach(n=>{n.classList.toggle("selected",n.dataset.objectType===this.state.objectType)})}updatePreview(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-preview-json]"),t=this.modal.querySelector("[data-validation-errors]");if(!e||!t)return;let i=this.buildPayload();e.textContent=JSON.stringify(i,null,2);let n=this.validate();n.length>0?(t.style.display="block",t.textContent=n.join(`
257
+ `)):(t.style.display="none",t.textContent="")}updateActionButtons(){if(!this.modal||!this.state)return;let e=this.modal.querySelector('[data-action="back"]'),t=this.modal.querySelector('[data-action="next"]');e&&(e.disabled=this.state.step===1),t&&(t.textContent=this.state.step===6?"Create":"Next",t.disabled=this.state.step===6&&this.validate().length>0)}validate(){if(!this.state)return[];let e=[],t=this.state.instanceId.trim();return t||e.push("Object ID is required."),t.startsWith("json.")&&e.push('Object ID must not start with "json." (instance id only).'),t&&!/^[a-zA-Z0-9._-]+$/.test(t)&&e.push("Object ID must use letters, numbers, dot, dash, or underscore."),t&&!this.isInstanceIdUnique(t)&&e.push(`Object ID "${t}" already exists.`),(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&!this.state.assetPath.trim()&&e.push("Asset path is required for image-based objects."),this.state.objectType==="ui-text"&&!this.state.text.trim()&&e.push("Text content is required for UI Text."),e}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}buildPayload(){if(!this.state)return{};let e=this.state.instanceId.trim(),t=`json.${e}`;return{screenId:this.state.screenId,instanceId:e,objectConfigId:t,layer:this.state.layer,config:this.buildObjectConfig(t)}}buildObjectConfig(e){if(!this.state)return{};let t={identity:{id:e,category:this.state.category},transform:{position:{x:this.state.positionX,y:this.state.positionY},offset:{x:this.state.offsetX,y:this.state.offsetY},scale:this.state.scale,rotation:this.state.rotation,anchor:{x:this.state.anchorX,y:this.state.anchorY},position_ratio:null,position_mode:this.state.positionMode},render:{alpha:this.state.alpha,visible:!0,tint:this.state.tint||null,z_index:this.state.zIndex},instance_id:this.state.instanceId.trim(),object_config:e};return(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&(t.render.asset={type:"image",path:this.normalizeAssetPath(this.state.assetPath.trim())}),this.state.objectType==="ui-text"&&(t.ui={kind:"text",renderMode:"text",text:this.state.text,font:this.state.font,fontSize:this.state.fontSize,letterSpacing:this.state.letterSpacing,align:this.state.align,color:this.state.tint||"#FFFFFF"},t.render.tint=null),this.state.objectType==="graphics"&&(t.effects={width:this.state.graphicsWidth,height:this.state.graphicsHeight,fill_color:this.state.graphicsFill,fill_alpha:this.state.graphicsAlpha}),this.state.interactionEnabled&&(t.interaction={enabled:!0,drag:{enabled:this.state.dragEnabled},hover:{enabled:this.state.hoverEnabled},click:{enabled:this.state.clickEnabled}}),this.state.logicId&&(t.logic={id:this.state.logicId,props:this.parseLogicProps(this.state.logicPropsRaw)}),t}parseLogicProps(e){if(!e||!e.trim())return{};try{return JSON.parse(e)}catch{return{}}}normalizeAssetPath(e){return!e||e.startsWith("raw/")?e:e.startsWith("/raw/")?e.replace(/^\/raw\//,"raw/"):e}async submit(){var i;if(!this.state)return;if(this.validate().length>0){this.updatePreview();return}let t=this.buildPayload();try{let n=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let r=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
258
+ `))||(a==null?void 0:a.error)||"Failed to create object.";alert(r);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),this.close()}catch(n){alert(`Failed to create object: ${n instanceof Error?n.message:String(n)}`)}}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[AddObjectWizard] Failed to sync screens:",e)}}};var Yt=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.options=e}open(e){this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=`
259
259
  <div class="context-menu-item" data-action="duplicate">Duplicate</div>
260
260
  <div class="context-menu-item" data-action="rename">Rename</div>
261
261
  <div class="context-menu-item" data-action="move">Move to Screen</div>
@@ -264,11 +264,11 @@ import{c as Fi,d as ye,e as Ui}from"./chunk-I5OOVR5U.js";import{i as Nt}from"./c
264
264
  <div class="context-menu-item" data-action="inspect">Open in Inspector</div>
265
265
  <div class="context-menu-separator"></div>
266
266
  <div class="context-menu-item danger" data-action="delete">Delete</div>
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?
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,r=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),r>0&&(this.menu.style.top=`${i-r-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,r,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
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})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let p=((n=d==null?void 0:d.errors)==null?void 0:n.join(`
269
- `))||(d==null?void 0:d.error)||"Duplicate failed.";alert(p);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
- `))||(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){if(this.options.onMoveRequest){this.options.onMoveRequest(this.options.objectId,t),this.close();return}try{let s=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,fromScreenId:this.options.screenId,toScreenId:t})}),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
- `))||(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 mt=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],Vt=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.templates=[];this.isLoadingTemplates=!1;this.targetScreen="gameplay";this.view="root";this.templateQuery="";this.templateGroup=null;this.options=e}getTargetScreenStorageKey(){return`handler_preview_add_menu_target_screen::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}async open(e){await this.loadTemplates(),this.loadTargetScreen(),this.view="root",this.templateQuery="",this.templateGroup=null,this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}async loadTemplates(){if(!this.isLoadingTemplates){this.isLoadingTemplates=!0;try{let e=await fetch("/api/objects/templates");if(e.ok){let t=await e.json();this.templates=Array.isArray(t.templates)?t.templates:[]}}catch(e){console.warn("[AddObjectMenu] Failed to load templates:",e),this.templates=[]}finally{this.isLoadingTemplates=!1}}}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=this.renderMenuHtml(),this.menu=e,this.updateTargetScreenUI()}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,s=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),s>0&&(this.menu.style.top=`${i-s-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let t=e.target,i=t==null?void 0:t.closest("[data-action]");if(!i||i.classList.contains("disabled"))return;let n=i.dataset.action;if(!n)return;if(e.preventDefault(),e.stopPropagation(),n==="set-screen"){let d=i.dataset.screenId;if(!d||!mt.some(p=>p.value===d))return;this.setTargetScreen(d);return}if(n==="open-view"){let d=(i.dataset.view||"").trim();(d==="templates"||d==="templates-group"||d==="screens"||d==="systems"||d==="root")&&this.setView(d);return}if(n==="back"){this.setView("root");return}if(n==="open-template-group"){let d=(i.dataset.templateGroup||"").trim();if(!d)return;this.templateGroup=d,this.setView("templates-group");return}if(n==="template-pack"){let d=(i.dataset.templatePack||"").trim();(d==="ui"||d==="screen")&&this.handleInstallTemplatePack(d);return}let a=i.dataset.objectType,s=i.dataset.systemType,o=i.dataset.templateId,l=i.dataset.screenId,c=l!=null?l:this.targetScreen;n==="object"&&a?this.handleCreateObject(a,c):n==="system"&&s?this.handleCreateSystem(s,c):n==="template"&&o&&this.handleCreateFromTemplate(o,c)}),this.menu.addEventListener("input",e=>{if(!this.menu)return;let t=e.target,i=t&&t instanceof HTMLInputElement?t:null;i&&i.classList.contains("context-menu-search")&&(this.templateQuery=i.value||"",this.updateMenuContents({preserveTemplateSearchFocus:!0}))}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}async promptScreen(e="Select Screen"){return new Promise(t=>{var c,d,p;let i=document.createElement("div");i.className="add-menu-modal-overlay",i.innerHTML=`
269
+ `))||(d==null?void 0:d.error)||"Duplicate failed.";alert(p);return}(r=(a=this.options).onRefresh)==null||r.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,r;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
+ `))||(l==null?void 0:l.error)||"Rename failed.";alert(c);return}(n=(i=this.options).onRefresh)==null||n.call(i),(r=(a=this.options).onSelect)==null||r.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){if(this.options.onMoveRequest){this.options.onMoveRequest(this.options.objectId,t),this.close();return}try{let r=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 r.json().catch(()=>({}));if(!r.ok||(o==null?void 0:o.success)===!1){let l=((i=o==null?void 0:o.errors)==null?void 0:i.join(`
271
+ `))||(o==null?void 0:o.error)||"Move failed.";alert(l);return}(a=(n=this.options).onRefresh)==null||a.call(n),this.close()}catch(r){alert(`Move failed: ${r instanceof Error?r.message:String(r)}`)}}}handleCopyConfig(){var n,a;let e=window.getEditableObjectConfig,t=typeof e=="function"?e(this.options.objectId):null;if(!t){let r=window.__editableObjectConfigs;r&&typeof r.get=="function"&&(t=(n=r.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 wt=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],Kt=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.templates=[];this.isLoadingTemplates=!1;this.targetScreen="gameplay";this.view="root";this.templateQuery="";this.templateGroup=null;this.options=e}getTargetScreenStorageKey(){return`handler_preview_add_menu_target_screen::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}async open(e){await this.loadTemplates(),this.loadTargetScreen(),this.view="root",this.templateQuery="",this.templateGroup=null,this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}async loadTemplates(){if(!this.isLoadingTemplates){this.isLoadingTemplates=!0;try{let e=await fetch("/api/objects/templates");if(e.ok){let t=await e.json();this.templates=Array.isArray(t.templates)?t.templates:[]}}catch(e){console.warn("[AddObjectMenu] Failed to load templates:",e),this.templates=[]}finally{this.isLoadingTemplates=!1}}}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=this.renderMenuHtml(),this.menu=e,this.updateTargetScreenUI()}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,r=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),r>0&&(this.menu.style.top=`${i-r-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let t=e.target,i=t==null?void 0:t.closest("[data-action]");if(!i||i.classList.contains("disabled"))return;let n=i.dataset.action;if(!n)return;if(e.preventDefault(),e.stopPropagation(),n==="set-screen"){let d=i.dataset.screenId;if(!d||!wt.some(p=>p.value===d))return;this.setTargetScreen(d);return}if(n==="open-view"){let d=(i.dataset.view||"").trim();(d==="templates"||d==="templates-group"||d==="screens"||d==="systems"||d==="root")&&this.setView(d);return}if(n==="back"){this.setView("root");return}if(n==="open-template-group"){let d=(i.dataset.templateGroup||"").trim();if(!d)return;this.templateGroup=d,this.setView("templates-group");return}if(n==="template-pack"){let d=(i.dataset.templatePack||"").trim();(d==="ui"||d==="screen")&&this.handleInstallTemplatePack(d);return}let a=i.dataset.objectType,r=i.dataset.systemType,o=i.dataset.templateId,l=i.dataset.screenId,c=l!=null?l:this.targetScreen;n==="object"&&a?this.handleCreateObject(a,c):n==="system"&&r?this.handleCreateSystem(r,c):n==="template"&&o&&this.handleCreateFromTemplate(o,c)}),this.menu.addEventListener("input",e=>{if(!this.menu)return;let t=e.target,i=t&&t instanceof HTMLInputElement?t:null;i&&i.classList.contains("context-menu-search")&&(this.templateQuery=i.value||"",this.updateMenuContents({preserveTemplateSearchFocus:!0}))}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}async promptScreen(e="Select Screen"){return new Promise(t=>{var c,d,p;let i=document.createElement("div");i.className="add-menu-modal-overlay",i.innerHTML=`
272
272
  <div class="add-menu-modal">
273
273
  <div class="add-menu-modal-header">
274
274
  <div class="add-menu-modal-title">${this.escapeHtml(e)}</div>
@@ -277,7 +277,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
277
277
  <div class="add-menu-modal-body">
278
278
  <label class="add-menu-modal-label">Screen:</label>
279
279
  <select class="add-menu-modal-select" id="screen-select" required>
280
- ${mt.map((u,g)=>`<option value="${this.escapeHtml(u.value)}" ${g===2?"selected":""}>${this.escapeHtml(u.label)}</option>`).join("")}
280
+ ${wt.map((u,g)=>`<option value="${this.escapeHtml(u.value)}" ${g===2?"selected":""}>${this.escapeHtml(u.label)}</option>`).join("")}
281
281
  </select>
282
282
  </div>
283
283
  <div class="add-menu-modal-footer">
@@ -285,8 +285,8 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
285
285
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
286
286
  </div>
287
287
  </div>
288
- `;let n=()=>{i.parentNode&&i.parentNode.removeChild(i)},a=()=>{let g=i.querySelector("#screen-select").value.trim();if(!g||!mt.some(m=>m.value===g)){alert("Please select a valid screen.");return}n(),t(g)},s=()=>{n(),t(null)};i.querySelector(".add-menu-modal").addEventListener("click",u=>{u.stopPropagation()}),(c=i.querySelector('[data-action="confirm"]'))==null||c.addEventListener("click",a),(d=i.querySelector('[data-action="cancel"]'))==null||d.addEventListener("click",s),(p=i.querySelector(".add-menu-modal-close"))==null||p.addEventListener("click",s),i.addEventListener("click",u=>{u.target===i&&s()});let l=i.querySelector("#screen-select");l.addEventListener("keydown",u=>{u.key==="Enter"?(u.preventDefault(),a()):u.key==="Escape"&&(u.preventDefault(),s())}),document.body.appendChild(i),l.focus()})}loadTargetScreen(){try{let t=(window.localStorage.getItem(this.getTargetScreenStorageKey())||"").trim();mt.some(i=>i.value===t)?this.targetScreen=t:this.targetScreen="gameplay"}catch{this.targetScreen="gameplay"}}setTargetScreen(e){this.targetScreen=e;try{window.localStorage.setItem(this.getTargetScreenStorageKey(),e)}catch{}this.updateTargetScreenUI()}updateTargetScreenUI(){let e=this.menu;if(!e)return;Array.from(e.querySelectorAll(".context-menu-screen-chip[data-screen-id]")).forEach(i=>{let n=i.dataset.screenId;i.classList.toggle("active",n===this.targetScreen)})}setView(e){var t;if(this.view=e,e!=="templates-group"&&(this.templateGroup=null),this.updateMenuContents(),e==="templates"||e==="templates-group"){let i=(t=this.menu)==null?void 0:t.querySelector(".context-menu-search");i&&i.focus()}}updateMenuContents(e){if(!this.menu)return;let t=!!(e!=null&&e.preserveTemplateSearchFocus)&&document.activeElement===this.menu.querySelector(".context-menu-search");if(this.menu.innerHTML=this.renderMenuHtml(),this.updateTargetScreenUI(),t){let i=this.menu.querySelector(".context-menu-search");i==null||i.focus(),i&&(i.selectionStart=i.selectionEnd=i.value.length)}}renderMenuHtml(){return this.view==="templates"?this.renderTemplatesView():this.view==="templates-group"?this.renderTemplatesGroupView():this.view==="screens"?this.renderScreensView():this.view==="systems"?this.renderSystemsView():this.renderRootView()}getPackTemplateIds(e){return e==="ui"?["template.ui.rotating_logo","template.ui.floating_cta_badge","template.ui.bottom_cta_button","template.ui.hand_pointer","template.ui.title_banner","template.ui.instruction_text","template.ui.score_hud"]:["template.screen.rotating_coin","template.screen.rotating_gem","template.screen.tap_destroy_target","template.screen.draggable_piece","template.screen.snap_slot","template.screen.collectable_coin","template.screen.player_swerve","template.screen.enemy_damageable"]}getMissingPackTemplateIds(e){let t=new Set(this.templates.map(i=>String(i.id||"").toLowerCase()));return this.getPackTemplateIds(e).filter(i=>!t.has(i.toLowerCase()))}async handleInstallTemplatePack(e){var t;try{let n=await fetch(e==="ui"?"/api/templates/ui":"/api/templates/screen",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let s=((t=a==null?void 0:a.errors)==null?void 0:t.join(`
289
- `))||(a==null?void 0:a.error)||"Failed to install templates.";alert(s);return}await this.loadTemplates(),this.updateMenuContents()}catch(i){alert(`Failed to install templates: ${i instanceof Error?i.message:String(i)}`)}}renderRootView(){let e=this.templates.length;return`
288
+ `;let n=()=>{i.parentNode&&i.parentNode.removeChild(i)},a=()=>{let g=i.querySelector("#screen-select").value.trim();if(!g||!wt.some(h=>h.value===g)){alert("Please select a valid screen.");return}n(),t(g)},r=()=>{n(),t(null)};i.querySelector(".add-menu-modal").addEventListener("click",u=>{u.stopPropagation()}),(c=i.querySelector('[data-action="confirm"]'))==null||c.addEventListener("click",a),(d=i.querySelector('[data-action="cancel"]'))==null||d.addEventListener("click",r),(p=i.querySelector(".add-menu-modal-close"))==null||p.addEventListener("click",r),i.addEventListener("click",u=>{u.target===i&&r()});let l=i.querySelector("#screen-select");l.addEventListener("keydown",u=>{u.key==="Enter"?(u.preventDefault(),a()):u.key==="Escape"&&(u.preventDefault(),r())}),document.body.appendChild(i),l.focus()})}loadTargetScreen(){try{let t=(window.localStorage.getItem(this.getTargetScreenStorageKey())||"").trim();wt.some(i=>i.value===t)?this.targetScreen=t:this.targetScreen="gameplay"}catch{this.targetScreen="gameplay"}}setTargetScreen(e){this.targetScreen=e;try{window.localStorage.setItem(this.getTargetScreenStorageKey(),e)}catch{}this.updateTargetScreenUI()}updateTargetScreenUI(){let e=this.menu;if(!e)return;Array.from(e.querySelectorAll(".context-menu-screen-chip[data-screen-id]")).forEach(i=>{let n=i.dataset.screenId;i.classList.toggle("active",n===this.targetScreen)})}setView(e){var t;if(this.view=e,e!=="templates-group"&&(this.templateGroup=null),this.updateMenuContents(),e==="templates"||e==="templates-group"){let i=(t=this.menu)==null?void 0:t.querySelector(".context-menu-search");i&&i.focus()}}updateMenuContents(e){if(!this.menu)return;let t=!!(e!=null&&e.preserveTemplateSearchFocus)&&document.activeElement===this.menu.querySelector(".context-menu-search");if(this.menu.innerHTML=this.renderMenuHtml(),this.updateTargetScreenUI(),t){let i=this.menu.querySelector(".context-menu-search");i==null||i.focus(),i&&(i.selectionStart=i.selectionEnd=i.value.length)}}renderMenuHtml(){return this.view==="templates"?this.renderTemplatesView():this.view==="templates-group"?this.renderTemplatesGroupView():this.view==="screens"?this.renderScreensView():this.view==="systems"?this.renderSystemsView():this.renderRootView()}getPackTemplateIds(e){return e==="ui"?["template.ui.rotating_logo","template.ui.floating_cta_badge","template.ui.bottom_cta_button","template.ui.hand_pointer","template.ui.title_banner","template.ui.instruction_text","template.ui.score_hud"]:["template.screen.rotating_coin","template.screen.rotating_gem","template.screen.tap_destroy_target","template.screen.draggable_piece","template.screen.snap_slot","template.screen.collectable_coin","template.screen.player_swerve","template.screen.enemy_damageable"]}getMissingPackTemplateIds(e){let t=new Set(this.templates.map(i=>String(i.id||"").toLowerCase()));return this.getPackTemplateIds(e).filter(i=>!t.has(i.toLowerCase()))}async handleInstallTemplatePack(e){var t;try{let n=await fetch(e==="ui"?"/api/templates/ui":"/api/templates/screen",{method:"POST",headers:{"Content-Type":"application/json"},body:"{}"}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let r=((t=a==null?void 0:a.errors)==null?void 0:t.join(`
289
+ `))||(a==null?void 0:a.error)||"Failed to install templates.";alert(r);return}await this.loadTemplates(),this.updateMenuContents()}catch(i){alert(`Failed to install templates: ${i instanceof Error?i.message:String(i)}`)}}renderRootView(){let e=this.templates.length;return`
290
290
  ${this.renderTargetScreenSection()}
291
291
  <div class="context-menu-section-title">Objects</div>
292
292
  <div class="context-menu-item" data-action="object" data-object-type="sprite">\u{1F5BC}\uFE0F Sprite</div>
@@ -303,7 +303,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
303
303
  <div class="context-menu-section-title">Templates</div>
304
304
  <input class="context-menu-search" type="text" placeholder="Search templates\u2026" value="${this.escapeHtml(this.templateQuery)}" />
305
305
  ${o||'<div class="context-menu-item disabled">No matches</div>'}
306
- `}let n=i.map(s=>{var d,p;let o=(p=(d=t.get(s))==null?void 0:d.length)!=null?p:0,l=s==="UI Templates"||s==="Screen Templates";return o<=0&&!l?`<div class="context-menu-item disabled">${this.escapeHtml(s)} <span class="context-menu-subtle">0</span></div>`:`<div class="${o>0,"context-menu-item context-menu-submenu"}" data-action="open-template-group" data-template-group="${this.escapeHtml(s)}">${this.escapeHtml(s)} <span class="context-menu-subtle">${o}</span></div>`}).join(""),a=this.templates.length>0?"":'<div class="context-menu-item disabled">No templates available</div>';return`
306
+ `}let n=i.map(r=>{var d,p;let o=(p=(d=t.get(r))==null?void 0:d.length)!=null?p:0,l=r==="UI Templates"||r==="Screen Templates";return o<=0&&!l?`<div class="context-menu-item disabled">${this.escapeHtml(r)} <span class="context-menu-subtle">0</span></div>`:`<div class="${o>0,"context-menu-item context-menu-submenu"}" data-action="open-template-group" data-template-group="${this.escapeHtml(r)}">${this.escapeHtml(r)} <span class="context-menu-subtle">${o}</span></div>`}).join(""),a=this.templates.length>0?"":'<div class="context-menu-item disabled">No templates available</div>';return`
307
307
  <div class="context-menu-item context-menu-back" data-action="back">\u2190 Back</div>
308
308
  <div class="context-menu-section-title">Templates</div>
309
309
  <input class="context-menu-search" type="text" placeholder="Search templates\u2026" value="${this.escapeHtml(this.templateQuery)}" />
@@ -334,14 +334,14 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
334
334
  `}renderTargetScreenSection(){return`
335
335
  <div class="context-menu-section-title">Target Screen</div>
336
336
  <div class="context-menu-screen-grid">
337
- ${mt.map(e=>`
337
+ ${wt.map(e=>`
338
338
  <button class="context-menu-screen-chip ${e.value===this.targetScreen?"active":""}" type="button" data-action="set-screen" data-screen-id="${this.escapeHtml(e.value)}">
339
339
  ${this.escapeHtml(e.label)}
340
340
  </button>
341
341
  `).join("")}
342
342
  </div>
343
343
  <div class="context-menu-separator"></div>
344
- `}groupTemplates(e){let t=new Map,i=(n,a)=>{var o;let s=(o=t.get(n))!=null?o:[];s.push(a),t.set(n,s)};return e.forEach(n=>{let a=(n.id||"").toLowerCase();return a.startsWith("template.ui.")||a.startsWith("template.start.")||a.startsWith("template.endgame.")?i("UI Templates",n):a.startsWith("template.screen.")?i("Screen Templates",n):a.includes(".template")?i("Gameplay Templates",n):a.startsWith("effects.")||a.includes("effect")?i("Effects",n):i("Other",n)}),t}async promptName(e="new_object",t="Enter Object Name"){return new Promise(i=>{var d,p,u;let n=document.createElement("div");n.className="add-menu-modal-overlay",n.innerHTML=`
344
+ `}groupTemplates(e){let t=new Map,i=(n,a)=>{var o;let r=(o=t.get(n))!=null?o:[];r.push(a),t.set(n,r)};return e.forEach(n=>{let a=(n.id||"").toLowerCase();return a.startsWith("template.ui.")||a.startsWith("template.start.")||a.startsWith("template.endgame.")?i("UI Templates",n):a.startsWith("template.screen.")?i("Screen Templates",n):a.includes(".template")?i("Gameplay Templates",n):a.startsWith("effects.")||a.includes("effect")?i("Effects",n):i("Other",n)}),t}async promptName(e="new_object",t="Enter Object Name"){return new Promise(i=>{var d,p,u;let n=document.createElement("div");n.className="add-menu-modal-overlay",n.innerHTML=`
345
345
  <div class="add-menu-modal">
346
346
  <div class="add-menu-modal-header">
347
347
  <div class="add-menu-modal-title">${this.escapeHtml(t)}</div>
@@ -357,7 +357,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
357
357
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
358
358
  </div>
359
359
  </div>
360
- `;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},s=()=>{let m=n.querySelector("#name-input").value.trim(),h=this.sanitizeInstanceId(m);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()}),(d=n.querySelector('[data-action="confirm"]'))==null||d.addEventListener("click",s),(p=n.querySelector('[data-action="cancel"]'))==null||p.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()})}async promptSpawnerConfig(){return new Promise(e=>{var m,h,f;let t=document.createElement("div");t.className="add-menu-modal-overlay";let i="template_id",n=`${i}_spawner_1`,a="",s=JSON.stringify([{x:-120,y:-120},{x:0,y:-120},{x:120,y:-120}],null,2),o=JSON.stringify({x:[-240,240],y:[-170,-170]},null,2),l="";t.innerHTML=`
360
+ `;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{let h=n.querySelector("#name-input").value.trim(),m=this.sanitizeInstanceId(h);if(!m){alert("Invalid name. Use letters, numbers, dots, dashes, or underscores.");return}a(),i(m)},o=()=>{a(),i(null)};n.querySelector(".add-menu-modal").addEventListener("click",g=>{g.stopPropagation()}),(d=n.querySelector('[data-action="confirm"]'))==null||d.addEventListener("click",r),(p=n.querySelector('[data-action="cancel"]'))==null||p.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(),r()):g.key==="Escape"&&(g.preventDefault(),o())}),c.select(),document.body.appendChild(n),c.focus()})}async promptSpawnerConfig(){return new Promise(e=>{var h,m,f;let t=document.createElement("div");t.className="add-menu-modal-overlay";let i="template_id",n=`${i}_spawner_1`,a="",r=JSON.stringify([{x:-120,y:-120},{x:0,y:-120},{x:120,y:-120}],null,2),o=JSON.stringify({x:[-240,240],y:[-170,-170]},null,2),l="";t.innerHTML=`
361
361
  <div class="add-menu-modal add-menu-modal-wide">
362
362
  <div class="add-menu-modal-header">
363
363
  <div class="add-menu-modal-title">Create Spawner</div>
@@ -397,7 +397,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
397
397
  </div>
398
398
  <div class="add-menu-modal-row">
399
399
  <label class="add-menu-modal-label">Spawn Points (JSON):</label>
400
- <textarea class="add-menu-modal-textarea" id="spawner-spawn-points" rows="5">${this.escapeHtml(s)}</textarea>
400
+ <textarea class="add-menu-modal-textarea" id="spawner-spawn-points" rows="5">${this.escapeHtml(r)}</textarea>
401
401
  </div>
402
402
  <div class="add-menu-modal-row">
403
403
  <label class="add-menu-modal-label">Random Bounds (JSON):</label>
@@ -449,18 +449,18 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
449
449
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Create</button>
450
450
  </div>
451
451
  </div>
452
- `;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=b=>{let v=b.trim();if(!v)return null;try{return JSON.parse(v)}catch{return null}},p=()=>{var B;let b=t.querySelector("#spawner-instance-id").value.trim(),v=t.querySelector("#spawner-template-id").value.trim(),x=t.querySelector("#spawner-spawn-templates").value,y=t.querySelector("#spawner-position-source").value.trim(),w=t.querySelector("#spawner-point-mode").value.trim(),I=t.querySelector("#spawner-spawn-points").value,R=t.querySelector("#spawner-random-bounds").value,k=t.querySelector("#spawner-pattern").value.trim(),j=Number(t.querySelector("#spawner-rate").value.trim()),_=Number(t.querySelector("#spawner-pool").value.trim()),C=Number(t.querySelector("#spawner-lifetime").value.trim()),A=t.querySelector("#spawner-return-on-invisible").checked,L=t.querySelector("#spawner-movement").value.trim(),T=t.querySelector("#spawner-velocity").value.trim(),S=t.querySelector("#spawner-velocity-range").value,E=d(x),P=Array.isArray(E)&&E.length?E:null,M=typeof((B=P==null?void 0:P[0])==null?void 0:B.templateId)=="string"?String(P[0].templateId):v;if(!b){alert("Instance ID is required.");return}if(!M){alert("Template ID is required (or provide Spawn Templates JSON).");return}let O={templateId:M,spawnPattern:k,spawnRate:Number.isFinite(j)?j:650,poolSize:Number.isFinite(_)?_:18,returnOnInvisible:A,positionSource:y,spawnPointMode:w,movementMode:L,lifetime:Number.isFinite(C)?C:5e3};P&&(O.spawnTemplates=P);let D=d(I);Array.isArray(D)&&(O.spawnPoints=D);let N=d(R);if(N&&typeof N=="object"&&(O.randomBounds=N),T.includes(",")){let[U,W]=T.split(",").map(oe=>oe.trim()),Q=Number(U),ie=Number(W);Number.isFinite(Q)&&Number.isFinite(ie)&&(O.velocity={x:Q,y:ie})}let H=d(S);H&&typeof H=="object"&&(O.velocityRange=H),c(),e({templateId:M,instanceId:b,spawnerProps:O})},u=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",b=>b.stopPropagation()),(m=t.querySelector('[data-action="confirm"]'))==null||m.addEventListener("click",p),(h=t.querySelector('[data-action="cancel"]'))==null||h.addEventListener("click",u),(f=t.querySelector(".add-menu-modal-close"))==null||f.addEventListener("click",u),t.addEventListener("click",b=>{b.target===t&&u()}),document.body.appendChild(t),t.querySelector("#spawner-instance-id").focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let s=a,o=this.buildDefaultConfig(e,s,a);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:s,objectConfigId:o.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:o})}),u=await p.json().catch(()=>({}));if(!p.ok||(u==null?void 0:u.success)===!1){let m=((l=u==null?void 0:u.errors)==null?void 0:l.join(`
453
- `))||(u==null?void 0:u.error)||"Failed to create object.";alert(m);return}let{trackObjectCreation:g}=await import("./ConfigOverride-V7DLPL5I.js");g(s,i,o),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),(d=(c=this.options).onRefresh)==null||d.call(c)}catch(p){alert(`Failed to create object: ${p instanceof Error?p.message:String(p)}`)}}async handleCreateFromTemplate(e,t){var s,o,l;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",a=await this.promptName(n);if(a)try{let c=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:a,screenId:i})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let p=((s=d==null?void 0:d.errors)==null?void 0:s.join(`
454
- `))||(d==null?void 0:d.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,s,o,l,c,d,p,u,g,m,h,f,b,v,x,y,w,I,R,k,j,_,C,A,L,T;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let S=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),E=await S.json().catch(()=>({}));if(!S.ok||(E==null?void 0:E.success)===!1){let P=((n=E==null?void 0:E.errors)==null?void 0:n.join(`
455
- `))||(E==null?void 0:E.error)||"Failed to create collectable system.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(s=(a=this.options).onRefresh)==null||s.call(a)}catch(S){alert(`Failed to create collectable system: ${S instanceof Error?S.message:String(S)}`)}if(e==="drag-snap-couples")try{let S=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),E=await S.json().catch(()=>({}));if(!S.ok||(E==null?void 0:E.success)===!1){let P=((o=E==null?void 0:E.errors)==null?void 0:o.join(`
456
- `))||(E==null?void 0:E.error)||"Failed to create drag-snap system.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(S){alert(`Failed to create drag-snap system: ${S instanceof Error?S.message:String(S)}`)}if(e==="swerve-collect")try{let S=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),E=await S.json().catch(()=>({}));if(!S.ok||(E==null?void 0:E.success)===!1){let P=((d=E==null?void 0:E.errors)==null?void 0:d.join(`
457
- `))||(E==null?void 0:E.error)||"Failed to create swerve collect system.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(u=(p=this.options).onRefresh)==null||u.call(p)}catch(S){alert(`Failed to create swerve collect system: ${S instanceof Error?S.message:String(S)}`)}if(e==="tap-destroy")try{let S=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),E=await S.json().catch(()=>({}));if(!S.ok||(E==null?void 0:E.success)===!1){let P=((g=E==null?void 0:E.errors)==null?void 0:g.join(`
458
- `))||(E==null?void 0:E.error)||"Failed to create tap destroy system.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(h=(m=this.options).onRefresh)==null||h.call(m)}catch(S){alert(`Failed to create tap destroy system: ${S instanceof Error?S.message:String(S)}`)}if(e==="scratch-card")try{let S=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),E=await S.json().catch(()=>({}));if(!S.ok||(E==null?void 0:E.success)===!1){let P=((f=E==null?void 0:E.errors)==null?void 0:f.join(`
459
- `))||(E==null?void 0:E.error)||"Failed to create scratch card system.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(v=(b=this.options).onRefresh)==null||v.call(b)}catch(S){alert(`Failed to create scratch card system: ${S instanceof Error?S.message:String(S)}`)}if(e==="start-screen"||e==="start-screen-no-hand")try{let E=await fetch("/api/systems/start-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="start-screen"})}),P=await E.json().catch(()=>({}));if(!E.ok||(P==null?void 0:P.success)===!1){let M=((x=P==null?void 0:P.errors)==null?void 0:x.join(`
460
- `))||(P==null?void 0:P.error)||"Failed to create start screen template.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(w=(y=this.options).onRefresh)==null||w.call(y)}catch(S){alert(`Failed to create start screen template: ${S instanceof Error?S.message:String(S)}`)}if(e==="endgame-screen"||e==="endgame-screen-no-hand")try{let E=await fetch("/api/systems/endgame-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="endgame-screen"})}),P=await E.json().catch(()=>({}));if(!E.ok||(P==null?void 0:P.success)===!1){let M=((I=P==null?void 0:P.errors)==null?void 0:I.join(`
461
- `))||(P==null?void 0:P.error)||"Failed to create endgame screen template.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(k=(R=this.options).onRefresh)==null||k.call(R)}catch(S){alert(`Failed to create endgame screen template: ${S instanceof Error?S.message:String(S)}`)}if(e==="bullet-system")try{let S=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),E=await S.json().catch(()=>({}));if(!S.ok||(E==null?void 0:E.success)===!1){let P=((j=E==null?void 0:E.errors)==null?void 0:j.join(`
462
- `))||(E==null?void 0:E.error)||"Failed to create bullet system.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(C=(_=this.options).onRefresh)==null||C.call(_)}catch(S){alert(`Failed to create bullet system: ${S instanceof Error?S.message:String(S)}`)}if(e==="spawner"){let S=await this.promptSpawnerConfig();if(!S)return;let{templateId:E,instanceId:P,spawnerProps:M}=S;try{let O=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,templateId:E,instanceId:P,spawnerProps:M})}),D=await O.json().catch(()=>({}));if(!O.ok||(D==null?void 0:D.success)===!1){let N=((A=D==null?void 0:D.errors)==null?void 0:A.join(`
463
- `))||(D==null?void 0:D.error)||"Failed to create spawner.";alert(N);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(T=(L=this.options).onRefresh)==null||T.call(L)}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 Yt=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.selectedIds=new Set;this.lastSelectedIndex=-1;this.objectEntries=[];this.options=null;this.retryTimer=null;this.screenFilter="all";this.showTemplates=!1;this.isContextMenuOpen=!1;this.systemBundles=new Map}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getShowTemplatesStorageKey(){return`handler_preview_show_templates::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
452
+ `;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=v=>{let b=v.trim();if(!b)return null;try{return JSON.parse(b)}catch{return null}},p=()=>{var F;let v=t.querySelector("#spawner-instance-id").value.trim(),b=t.querySelector("#spawner-template-id").value.trim(),w=t.querySelector("#spawner-spawn-templates").value,y=t.querySelector("#spawner-position-source").value.trim(),x=t.querySelector("#spawner-point-mode").value.trim(),I=t.querySelector("#spawner-spawn-points").value,j=t.querySelector("#spawner-random-bounds").value,T=t.querySelector("#spawner-pattern").value.trim(),_=Number(t.querySelector("#spawner-rate").value.trim()),O=Number(t.querySelector("#spawner-pool").value.trim()),L=Number(t.querySelector("#spawner-lifetime").value.trim()),A=t.querySelector("#spawner-return-on-invisible").checked,k=t.querySelector("#spawner-movement").value.trim(),C=t.querySelector("#spawner-velocity").value.trim(),E=t.querySelector("#spawner-velocity-range").value,S=d(w),M=Array.isArray(S)&&S.length?S:null,P=typeof((F=M==null?void 0:M[0])==null?void 0:F.templateId)=="string"?String(M[0].templateId):b;if(!v){alert("Instance ID is required.");return}if(!P){alert("Template ID is required (or provide Spawn Templates JSON).");return}let R={templateId:P,spawnPattern:T,spawnRate:Number.isFinite(_)?_:650,poolSize:Number.isFinite(O)?O:18,returnOnInvisible:A,positionSource:y,spawnPointMode:x,movementMode:k,lifetime:Number.isFinite(L)?L:5e3};M&&(R.spawnTemplates=M);let D=d(I);Array.isArray(D)&&(R.spawnPoints=D);let N=d(j);if(N&&typeof N=="object"&&(R.randomBounds=N),C.includes(",")){let[G,Y]=C.split(",").map(oe=>oe.trim()),Q=Number(G),ie=Number(Y);Number.isFinite(Q)&&Number.isFinite(ie)&&(R.velocity={x:Q,y:ie})}let H=d(E);H&&typeof H=="object"&&(R.velocityRange=H),c(),e({templateId:P,instanceId:v,spawnerProps:R})},u=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",v=>v.stopPropagation()),(h=t.querySelector('[data-action="confirm"]'))==null||h.addEventListener("click",p),(m=t.querySelector('[data-action="cancel"]'))==null||m.addEventListener("click",u),(f=t.querySelector(".add-menu-modal-close"))==null||f.addEventListener("click",u),t.addEventListener("click",v=>{v.target===t&&u()}),document.body.appendChild(t),t.querySelector("#spawner-instance-id").focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let r=a,o=this.buildDefaultConfig(e,r,a);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:r,objectConfigId:o.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:o})}),u=await p.json().catch(()=>({}));if(!p.ok||(u==null?void 0:u.success)===!1){let h=((l=u==null?void 0:u.errors)==null?void 0:l.join(`
453
+ `))||(u==null?void 0:u.error)||"Failed to create object.";alert(h);return}let{trackObjectCreation:g}=await import("./ConfigOverride-V7DLPL5I.js");g(r,i,o),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),(d=(c=this.options).onRefresh)==null||d.call(c)}catch(p){alert(`Failed to create object: ${p instanceof Error?p.message:String(p)}`)}}async handleCreateFromTemplate(e,t){var r,o,l;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",a=await this.promptName(n);if(a)try{let c=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:a,screenId:i})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let p=((r=d==null?void 0:d.errors)==null?void 0:r.join(`
454
+ `))||(d==null?void 0:d.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,r,o,l,c,d,p,u,g,h,m,f,v,b,w,y,x,I,j,T,_,O,L,A,k,C;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let E=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let M=((n=S==null?void 0:S.errors)==null?void 0:n.join(`
455
+ `))||(S==null?void 0:S.error)||"Failed to create collectable system.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(r=(a=this.options).onRefresh)==null||r.call(a)}catch(E){alert(`Failed to create collectable system: ${E instanceof Error?E.message:String(E)}`)}if(e==="drag-snap-couples")try{let E=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let M=((o=S==null?void 0:S.errors)==null?void 0:o.join(`
456
+ `))||(S==null?void 0:S.error)||"Failed to create drag-snap system.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(E){alert(`Failed to create drag-snap system: ${E instanceof Error?E.message:String(E)}`)}if(e==="swerve-collect")try{let E=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let M=((d=S==null?void 0:S.errors)==null?void 0:d.join(`
457
+ `))||(S==null?void 0:S.error)||"Failed to create swerve collect system.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(u=(p=this.options).onRefresh)==null||u.call(p)}catch(E){alert(`Failed to create swerve collect system: ${E instanceof Error?E.message:String(E)}`)}if(e==="tap-destroy")try{let E=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let M=((g=S==null?void 0:S.errors)==null?void 0:g.join(`
458
+ `))||(S==null?void 0:S.error)||"Failed to create tap destroy system.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(m=(h=this.options).onRefresh)==null||m.call(h)}catch(E){alert(`Failed to create tap destroy system: ${E instanceof Error?E.message:String(E)}`)}if(e==="scratch-card")try{let E=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let M=((f=S==null?void 0:S.errors)==null?void 0:f.join(`
459
+ `))||(S==null?void 0:S.error)||"Failed to create scratch card system.";alert(M);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(b=(v=this.options).onRefresh)==null||b.call(v)}catch(E){alert(`Failed to create scratch card system: ${E instanceof Error?E.message:String(E)}`)}if(e==="start-screen"||e==="start-screen-no-hand")try{let S=await fetch("/api/systems/start-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="start-screen"})}),M=await S.json().catch(()=>({}));if(!S.ok||(M==null?void 0:M.success)===!1){let P=((w=M==null?void 0:M.errors)==null?void 0:w.join(`
460
+ `))||(M==null?void 0:M.error)||"Failed to create start screen template.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(x=(y=this.options).onRefresh)==null||x.call(y)}catch(E){alert(`Failed to create start screen template: ${E instanceof Error?E.message:String(E)}`)}if(e==="endgame-screen"||e==="endgame-screen-no-hand")try{let S=await fetch("/api/systems/endgame-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="endgame-screen"})}),M=await S.json().catch(()=>({}));if(!S.ok||(M==null?void 0:M.success)===!1){let P=((I=M==null?void 0:M.errors)==null?void 0:I.join(`
461
+ `))||(M==null?void 0:M.error)||"Failed to create endgame screen template.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(T=(j=this.options).onRefresh)==null||T.call(j)}catch(E){alert(`Failed to create endgame screen template: ${E instanceof Error?E.message:String(E)}`)}if(e==="bullet-system")try{let E=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let M=((_=S==null?void 0:S.errors)==null?void 0:_.join(`
462
+ `))||(S==null?void 0:S.error)||"Failed to create bullet system.";alert(M);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(E){alert(`Failed to create bullet system: ${E instanceof Error?E.message:String(E)}`)}if(e==="spawner"){let E=await this.promptSpawnerConfig();if(!E)return;let{templateId:S,instanceId:M,spawnerProps:P}=E;try{let R=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,templateId:S,instanceId:M,spawnerProps:P})}),D=await R.json().catch(()=>({}));if(!R.ok||(D==null?void 0:D.success)===!1){let N=((A=D==null?void 0:D.errors)==null?void 0:A.join(`
463
+ `))||(D==null?void 0:D.error)||"Failed to create spawner.";alert(N);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(C=(k=this.options).onRefresh)==null||C.call(k)}catch(R){alert(`Failed to create spawner: ${R instanceof Error?R.message:String(R)}`)}}}}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 Xt=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.selectedIds=new Set;this.lastSelectedIndex=-1;this.objectEntries=[];this.options=null;this.retryTimer=null;this.screenFilter="all";this.showTemplates=!1;this.isContextMenuOpen=!1;this.systemBundles=new Map}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getShowTemplatesStorageKey(){return`handler_preview_show_templates::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
464
464
  <div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects">
465
465
  <div class="scene-panel-header" data-panel-handle>
466
466
  <div class="panel-title">
@@ -499,7 +499,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
499
499
  </div>
500
500
  <div class="panel-resize-handle-v" data-panel-resize-v></div>
501
501
  </div>
502
- `}initialize(e,t){var s,o,l,c,d,p,u,g,m;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(s=this.root)==null?void 0:s.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(l=this.searchInput)==null||l.addEventListener("input",()=>this.refreshObjects()),(c=this.listContainer)==null||c.addEventListener("click",h=>{let f=h.target,b=f==null?void 0:f.closest("[data-object-visibility-toggle][data-object-id]");if(b){let w=b.dataset.objectId;if(!w)return;h.preventDefault(),h.stopPropagation(),this.toggleObjectVisibility(w);return}let v=f==null?void 0:f.closest("[data-system-bundle-action][data-system-bundle-id]");if(!v)return;h.preventDefault(),h.stopPropagation();let x=v.dataset.systemBundleAction,y=v.dataset.systemBundleId;if(!(!x||!y)){if(x==="toggle-visibility"){this.toggleSystemBundleVisibility(y);return}x==="delete"&&this.deleteSystemBundle(y)}});let i=(d=this.root)==null?void 0:d.querySelector("[data-add-object]");i==null||i.addEventListener("click",h=>{h.stopPropagation();let f=i.getBoundingClientRect();this.openAddObjectMenu({x:f.left,y:f.bottom+4})});let n=(p=this.root)==null?void 0:p.querySelector("#scene-screen-filter");if(n){try{let h=window.localStorage.getItem(this.getScreenFilterStorageKey());h&&(this.screenFilter=h)}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 h=n.value||"all";this.screenFilter=h;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}let a=(u=this.root)==null?void 0:u.querySelector("#scene-templates-toggle");if(a){try{let h=window.localStorage.getItem(this.getShowTemplatesStorageKey());this.showTemplates=h==="true"}catch{}a.checked=this.showTemplates,a.addEventListener("change",()=>{this.showTemplates=!!a.checked;try{window.localStorage.setItem(this.getShowTemplatesStorageKey(),this.showTemplates?"true":"false")}catch{}this.refreshObjects()})}(g=this.root)==null||g.addEventListener("click",h=>{let f=h.target;if(!f||f.closest("[data-context-menu]"))return;if(f.tagName==="INPUT"&&f.classList.contains("scene-object-checkbox")){let I=f.dataset.objectId;if(!I)return;h.stopPropagation(),this.toggleBatchSelect(I);return}let b=f.closest(".scene-object-item[data-object-id]");if(!b)return;let v=b.dataset.objectId;if(!v)return;let x=h.ctrlKey||h.metaKey;h.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,v):x?this.toggleBatchSelect(v):this.select(v)}),(m=this.listContainer)==null||m.addEventListener("contextmenu",h=>{var I;let f=h.target,b=f==null?void 0:f.closest("[data-object-id]");if(!b)return;let v=b.dataset.objectId;if(!v)return;h.preventDefault();let x=window.getEditableObjectConfig,y=typeof x=="function"?x(v):null;if(!y){let R=window.__editableObjectConfigs;R&&typeof R.get=="function"&&(y=(I=R.get(v))!=null?I:null)}let w=this.inferScreen(v,y);this.showContextMenu(v,w,h.clientX,h.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){e?(this.selectedIds.clear(),this.selectedIds.add(e),this.selectedId=e):(this.selectedIds.clear(),this.selectedId=null),this.updateSelectionUI()}getSelectedIds(){return Array.from(this.selectedIds)}updateSelectionUI(){var a,s,o,l,c;if(!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{let p=d.dataset.objectId,u=p?this.selectedIds.has(p):!1,g=p===this.selectedId;d.classList.toggle("selected",u),d.classList.toggle("active",g);let m=d.closest(".scene-object-item-wrapper"),h=m==null?void 0:m.querySelector(".scene-object-checkbox");h&&(h.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-object]");if(t&&i&&n){let d=this.selectedIds.size===1?this.selectedId:null;if(d){let p=window.getEditableObjectConfig,u=typeof p=="function"?p(d):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(l=b.get(d))!=null?l:null)}let g=this.inferScreen(d,u),m={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((c=u==null?void 0:u.identity)==null?void 0:c.id)||d).toString(),f=this.formatDisplayName(h);i.textContent=m[g]||g,n.textContent=f,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var x;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.refreshEditableConfigIndex;if(typeof t=="function"&&t(),typeof e!="function"){this.scheduleRetry();return}let i=e();if(!Array.isArray(i)||i.length===0){let y=window.__editableObjectConfigs;y&&typeof y.keys=="function"&&(i=Array.from(y.keys()))}if(!Array.isArray(i)||i.length===0){this.scheduleRetry();return}let n=(((x=this.searchInput)==null?void 0:x.value)||"").trim().toLowerCase(),a=["loading","start","gameplay","tutorial","endgame"],s=Object.fromEntries(a.map(y=>[y,[]])),o=Object.fromEntries(a.map(y=>[y,[]])),l=[],c=[],d=new Map;this.systemBundles=new Map;let p=y=>{var R,k,j,_,C;let w=(_=(j=(k=(R=window.__editableConfig)==null?void 0:R.objects)==null?void 0:k.get)==null?void 0:j.call(k,y))!=null?_:null;if(w)return w;let I=window.__editableObjectConfigs;return I&&typeof I.get=="function"&&(C=I.get(y))!=null?C:null};i.forEach(y=>{var N,H,B,U,W,Q,ie,oe;let w=p(y),I=(((N=w==null?void 0:w.identity)==null?void 0:N.category)||"scene").toString(),R=(((H=w==null?void 0:w.identity)==null?void 0:H.id)||y).toString(),k=I.toLowerCase(),j=R.toLowerCase(),_=k.includes("ui")||j.startsWith("ui")||j.includes("label"),C=k==="system",A=((B=w==null?void 0:w.identity)==null?void 0:B.is_template)===!0||j.includes(".template")||y.toLowerCase().includes(".template"),L=typeof((U=w==null?void 0:w.identity)==null?void 0:U.system_group)=="string"?w.identity.system_group:null,T=typeof((W=w==null?void 0:w.identity)==null?void 0:W.system_label)=="string"?w.identity.system_label:L?this.formatDisplayName(L):null,S=this.formatDisplayName(R||y),E=((Q=w==null?void 0:w.render)==null?void 0:Q.visible)===!1||(w==null?void 0:w.enabled)===!1,P=this.getObjectType(w),M={id:y,label:S,category:I,isUi:_,isTemplate:A,isUnused:E,objectType:P,systemGroupId:L,systemLabel:T},O=this.inferScreen(M.id,w);if(!(this.screenFilter!=="all"&&O!==this.screenFilter||!(!n||M.id.toLowerCase().includes(n)||M.label.toLowerCase().includes(n)))){if(L){if(A&&!this.showTemplates)return;let $=(ie=d.get(L))!=null?ie:[];$.push(M),d.set(L,$);let Z=(oe=this.systemBundles.get(L))!=null?oe:{label:T!=null?T:L,objectIds:[]};Z.label=T!=null?T:Z.label,Z.objectIds.push(y),this.systemBundles.set(L,Z);return}if(A){if(!this.showTemplates)return;c.push(M);return}C?l.push(M):(M.isUnused?o:s)[O].push(M)}});let u={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},m=[...Array.from(d.entries()).map(([y,w])=>{var I,R,k,j;return{groupId:y,label:(R=(I=this.systemBundles.get(y))==null?void 0:I.label)!=null?R:y,objectIds:(j=(k=this.systemBundles.get(y))==null?void 0:k.objectIds)!=null?j:[],entries:w}})].sort((y,w)=>y.label.localeCompare(w.label)),h=m.length>0?this.renderSystemBundlesGroup(m):"",f=l.length>0?this.renderSystemGroup(l):"",b=a.map(y=>this.renderGroup(u[y],[...s[y],...o[y]])).join(""),v=c.length>0?this.renderGroup("Templates",c):"";if(this.listContainer.innerHTML=h+f+b+v,this.objectEntries=[...m.flatMap(y=>y.entries),...l,...a.flatMap(y=>[...s[y],...o[y]]),...c],l.length>0){let y=this.listContainer.querySelector("[data-delete-system-group]");y==null||y.addEventListener("click",w=>{w.stopPropagation(),this.deleteSystemGroup(l)})}this.updateSelectionUI()}renderSystemBundlesGroup(e){if(!e.length)return"";let t=e.map(i=>this.renderSystemBundle(i.groupId,i.label,i.objectIds,i.entries)).join("");return`
502
+ `}initialize(e,t){var r,o,l,c,d,p,u,g,h;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(r=this.root)==null?void 0:r.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(l=this.searchInput)==null||l.addEventListener("input",()=>this.refreshObjects()),(c=this.listContainer)==null||c.addEventListener("click",m=>{let f=m.target,v=f==null?void 0:f.closest("[data-object-visibility-toggle][data-object-id]");if(v){let x=v.dataset.objectId;if(!x)return;m.preventDefault(),m.stopPropagation(),this.toggleObjectVisibility(x);return}let b=f==null?void 0:f.closest("[data-system-bundle-action][data-system-bundle-id]");if(!b)return;m.preventDefault(),m.stopPropagation();let w=b.dataset.systemBundleAction,y=b.dataset.systemBundleId;if(!(!w||!y)){if(w==="toggle-visibility"){this.toggleSystemBundleVisibility(y);return}w==="delete"&&this.deleteSystemBundle(y)}});let i=(d=this.root)==null?void 0:d.querySelector("[data-add-object]");i==null||i.addEventListener("click",m=>{m.stopPropagation();let f=i.getBoundingClientRect();this.openAddObjectMenu({x:f.left,y:f.bottom+4})});let n=(p=this.root)==null?void 0:p.querySelector("#scene-screen-filter");if(n){try{let m=window.localStorage.getItem(this.getScreenFilterStorageKey());m&&(this.screenFilter=m)}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 m=n.value||"all";this.screenFilter=m;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}let a=(u=this.root)==null?void 0:u.querySelector("#scene-templates-toggle");if(a){try{let m=window.localStorage.getItem(this.getShowTemplatesStorageKey());this.showTemplates=m==="true"}catch{}a.checked=this.showTemplates,a.addEventListener("change",()=>{this.showTemplates=!!a.checked;try{window.localStorage.setItem(this.getShowTemplatesStorageKey(),this.showTemplates?"true":"false")}catch{}this.refreshObjects()})}(g=this.root)==null||g.addEventListener("click",m=>{let f=m.target;if(!f||f.closest("[data-context-menu]"))return;if(f.tagName==="INPUT"&&f.classList.contains("scene-object-checkbox")){let I=f.dataset.objectId;if(!I)return;m.stopPropagation(),this.toggleBatchSelect(I);return}let v=f.closest(".scene-object-item[data-object-id]");if(!v)return;let b=v.dataset.objectId;if(!b)return;let w=m.ctrlKey||m.metaKey;m.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,b):w?this.toggleBatchSelect(b):this.select(b)}),(h=this.listContainer)==null||h.addEventListener("contextmenu",m=>{var I;let f=m.target,v=f==null?void 0:f.closest("[data-object-id]");if(!v)return;let b=v.dataset.objectId;if(!b)return;m.preventDefault();let w=window.getEditableObjectConfig,y=typeof w=="function"?w(b):null;if(!y){let j=window.__editableObjectConfigs;j&&typeof j.get=="function"&&(y=(I=j.get(b))!=null?I:null)}let x=this.inferScreen(b,y);this.showContextMenu(b,x,m.clientX,m.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){e?(this.selectedIds.clear(),this.selectedIds.add(e),this.selectedId=e):(this.selectedIds.clear(),this.selectedId=null),this.updateSelectionUI()}getSelectedIds(){return Array.from(this.selectedIds)}updateSelectionUI(){var a,r,o,l,c;if(!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{let p=d.dataset.objectId,u=p?this.selectedIds.has(p):!1,g=p===this.selectedId;d.classList.toggle("selected",u),d.classList.toggle("active",g);let h=d.closest(".scene-object-item-wrapper"),m=h==null?void 0:h.querySelector(".scene-object-checkbox");m&&(m.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(r=this.root)==null?void 0:r.querySelector("[data-breadcrumb-screen]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-object]");if(t&&i&&n){let d=this.selectedIds.size===1?this.selectedId:null;if(d){let p=window.getEditableObjectConfig,u=typeof p=="function"?p(d):null;if(!u){let v=window.__editableObjectConfigs;v&&typeof v.get=="function"&&(u=(l=v.get(d))!=null?l:null)}let g=this.inferScreen(d,u),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},m=(((c=u==null?void 0:u.identity)==null?void 0:c.id)||d).toString(),f=this.formatDisplayName(m);i.textContent=h[g]||g,n.textContent=f,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var w;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.refreshEditableConfigIndex;if(typeof t=="function"&&t(),typeof e!="function"){this.scheduleRetry();return}let i=e();if(!Array.isArray(i)||i.length===0){let y=window.__editableObjectConfigs;y&&typeof y.keys=="function"&&(i=Array.from(y.keys()))}if(!Array.isArray(i)||i.length===0){this.scheduleRetry();return}let n=(((w=this.searchInput)==null?void 0:w.value)||"").trim().toLowerCase(),a=["loading","start","gameplay","tutorial","endgame"],r=Object.fromEntries(a.map(y=>[y,[]])),o=Object.fromEntries(a.map(y=>[y,[]])),l=[],c=[],d=new Map;this.systemBundles=new Map;let p=y=>{var j,T,_,O,L;let x=(O=(_=(T=(j=window.__editableConfig)==null?void 0:j.objects)==null?void 0:T.get)==null?void 0:_.call(T,y))!=null?O:null;if(x)return x;let I=window.__editableObjectConfigs;return I&&typeof I.get=="function"&&(L=I.get(y))!=null?L:null};i.forEach(y=>{var N,H,F,G,Y,Q,ie,oe;let x=p(y),I=(((N=x==null?void 0:x.identity)==null?void 0:N.category)||"scene").toString(),j=(((H=x==null?void 0:x.identity)==null?void 0:H.id)||y).toString(),T=I.toLowerCase(),_=j.toLowerCase(),O=T.includes("ui")||_.startsWith("ui")||_.includes("label"),L=T==="system",A=((F=x==null?void 0:x.identity)==null?void 0:F.is_template)===!0||_.includes(".template")||y.toLowerCase().includes(".template"),k=typeof((G=x==null?void 0:x.identity)==null?void 0:G.system_group)=="string"?x.identity.system_group:null,C=typeof((Y=x==null?void 0:x.identity)==null?void 0:Y.system_label)=="string"?x.identity.system_label:k?this.formatDisplayName(k):null,E=this.formatDisplayName(j||y),S=((Q=x==null?void 0:x.render)==null?void 0:Q.visible)===!1||(x==null?void 0:x.enabled)===!1,M=this.getObjectType(x),P={id:y,label:E,category:I,isUi:O,isTemplate:A,isUnused:S,objectType:M,systemGroupId:k,systemLabel:C},R=this.inferScreen(P.id,x);if(!(this.screenFilter!=="all"&&R!==this.screenFilter||!(!n||P.id.toLowerCase().includes(n)||P.label.toLowerCase().includes(n)))){if(k){if(A&&!this.showTemplates)return;let $=(ie=d.get(k))!=null?ie:[];$.push(P),d.set(k,$);let Z=(oe=this.systemBundles.get(k))!=null?oe:{label:C!=null?C:k,objectIds:[]};Z.label=C!=null?C:Z.label,Z.objectIds.push(y),this.systemBundles.set(k,Z);return}if(A){if(!this.showTemplates)return;c.push(P);return}L?l.push(P):(P.isUnused?o:r)[R].push(P)}});let u={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=[...Array.from(d.entries()).map(([y,x])=>{var I,j,T,_;return{groupId:y,label:(j=(I=this.systemBundles.get(y))==null?void 0:I.label)!=null?j:y,objectIds:(_=(T=this.systemBundles.get(y))==null?void 0:T.objectIds)!=null?_:[],entries:x}})].sort((y,x)=>y.label.localeCompare(x.label)),m=h.length>0?this.renderSystemBundlesGroup(h):"",f=l.length>0?this.renderSystemGroup(l):"",v=a.map(y=>this.renderGroup(u[y],[...r[y],...o[y]])).join(""),b=c.length>0?this.renderGroup("Templates",c):"";if(this.listContainer.innerHTML=m+f+v+b,this.objectEntries=[...h.flatMap(y=>y.entries),...l,...a.flatMap(y=>[...r[y],...o[y]]),...c],l.length>0){let y=this.listContainer.querySelector("[data-delete-system-group]");y==null||y.addEventListener("click",x=>{x.stopPropagation(),this.deleteSystemGroup(l)})}this.updateSelectionUI()}renderSystemBundlesGroup(e){if(!e.length)return"";let t=e.map(i=>this.renderSystemBundle(i.groupId,i.label,i.objectIds,i.entries)).join("");return`
503
503
  <div class="scene-object-group scene-object-group-system">
504
504
  <div class="scene-object-group-title">
505
505
  <span>\u{1F9E9} Systems <span class="scene-object-count">${e.length}</span></span>
@@ -508,12 +508,12 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
508
508
  ${t}
509
509
  </div>
510
510
  </div>
511
- `}renderSystemBundle(e,t,i,n){let a=this.isBundleAllHidden(i),s=a?"Show all objects in this system":"Hide all objects in this system",o=a?"is-hidden":"",l=n.map(d=>this.renderEntryItem(d)).join(""),c=this.escapeHtml(e);return`
511
+ `}renderSystemBundle(e,t,i,n){let a=this.isBundleAllHidden(i),r=a?"Show all objects in this system":"Hide all objects in this system",o=a?"is-hidden":"",l=n.map(d=>this.renderEntryItem(d)).join(""),c=this.escapeHtml(e);return`
512
512
  <div class="scene-object-group scene-object-group-bundle" data-system-bundle="${c}">
513
513
  <div class="scene-object-group-title">
514
514
  <span>${this.escapeHtml(t)} <span class="scene-object-count">${i.length}</span></span>
515
515
  <div class="scene-object-group-actions">
516
- <button class="scene-object-group-action scene-object-group-visibility ${o}" data-system-bundle-action="toggle-visibility" data-system-bundle-id="${c}" type="button" title="${s}">\u{1F441}\uFE0F</button>
516
+ <button class="scene-object-group-action scene-object-group-visibility ${o}" data-system-bundle-action="toggle-visibility" data-system-bundle-id="${c}" type="button" title="${r}">\u{1F441}\uFE0F</button>
517
517
  <button class="scene-object-group-delete" data-system-bundle-action="delete" data-system-bundle-id="${c}" type="button" title="Delete this system">\u{1F5D1}\uFE0F</button>
518
518
  </div>
519
519
  </div>
@@ -521,10 +521,10 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
521
521
  ${l}
522
522
  </div>
523
523
  </div>
524
- `}renderEntryItem(e){var l,c,d;let t=window.getEditableObjectConfig,i=typeof t=="function"?t(e.id):null;if(!i){let p=window.__editableObjectConfigs;p&&typeof p.get=="function"&&(i=(l=p.get(e.id))!=null?l:null)}let n=(c=i==null?void 0:i.ui)!=null&&c.text?`"${i.ui.text.substring(0,12)}${i.ui.text.length>12?"...":""}"`:"",a=e.isTemplate?'<span class="scene-object-badge template">template</span>':"",s=((d=i==null?void 0:i.render)==null?void 0:d.visible)===!1;return`
524
+ `}renderEntryItem(e){var l,c,d;let t=window.getEditableObjectConfig,i=typeof t=="function"?t(e.id):null;if(!i){let p=window.__editableObjectConfigs;p&&typeof p.get=="function"&&(i=(l=p.get(e.id))!=null?l:null)}let n=(c=i==null?void 0:i.ui)!=null&&c.text?`"${i.ui.text.substring(0,12)}${i.ui.text.length>12?"...":""}"`:"",a=e.isTemplate?'<span class="scene-object-badge template">template</span>':"",r=((d=i==null?void 0:i.render)==null?void 0:d.visible)===!1;return`
525
525
  <div class="scene-object-item-wrapper">
526
526
  <input type="checkbox" class="scene-object-checkbox" ${this.selectedIds.has(e.id)?"checked":""} data-object-id="${e.id}">
527
- ${this.renderVisibilityButton(e.id,s)}
527
+ ${this.renderVisibilityButton(e.id,r)}
528
528
  <button class="scene-object-item ${e.isUnused?"unused":""}" data-object-id="${e.id}">
529
529
  <span class="scene-object-label">${e.label}</span>
530
530
  ${n?`<span class="scene-object-text-preview">${n}</span>`:""}
@@ -532,7 +532,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
532
532
  <span class="scene-object-badge ${e.isUi?"ui":"scene"}">${e.category}</span>
533
533
  </button>
534
534
  </div>
535
- `}escapeHtml(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}toggleObjectVisibility(e){var a;let t=(a=window.__editableConfig)==null?void 0:a.objects;if(!t||typeof t.get!="function")return;let i=t.get(e);if(!i)return;i.render||(i.render={});let n=i.render.visible!==!1;i.render.visible=!n;try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e,action:"update"}}))}catch{}this.refreshObjects()}renderVisibilityButton(e,t){let i=t?"Show object":"Hide object";return`<button class="${t?"scene-object-eye is-hidden":"scene-object-eye"}" type="button" data-object-visibility-toggle="true" data-object-id="${this.escapeHtml(e)}" title="${i}">\u{1F441}\uFE0F</button>`}isBundleAllHidden(e){var i;if(!e.length)return!1;let t=(i=window.__editableConfig)==null?void 0:i.objects;return e.every(n=>{var s,o,l;let a=(o=(s=t==null?void 0:t.get)==null?void 0:s.call(t,n))!=null?o:null;return((l=a==null?void 0:a.render)==null?void 0:l.visible)===!1})}toggleSystemBundleVisibility(e){var o;let t=this.systemBundles.get(e);if(!t)return;let i=t.objectIds||[];if(!i.length)return;let n=(o=window.__editableConfig)==null?void 0:o.objects;if(!n||typeof n.get!="function")return;let s=this.isBundleAllHidden(i);i.forEach(l=>{let c=n.get(l);c&&(c.render||(c.render={}),c.render.visible=s)});try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}this.refreshObjects()}async deleteSystemBundle(e){let t=this.systemBundles.get(e);if(!t)return;let i=t.label||e,n=Array.from(new Set(t.objectIds||[]));!n.length||!window.confirm(`Delete system "${i}" (${n.length} object${n.length!==1?"s":""})? This removes them from the screen configuration.`)||await this.deleteMultipleObjects(n)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var o,l;let i=window.__HANDLER_SCREEN_INDEX,n=(o=i==null?void 0:i.instanceToScreen)==null?void 0:o[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let a=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${a}`.toLowerCase();return s.includes("loading")?"loading":s.includes("start")?"start":s.includes("tutorial")?"tutorial":s.includes("endgame")||s.includes("end_card")||s.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,s,o,l,c,d;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.endsWith(".json")?"animation":((o=(s=e.render)==null?void 0:s.asset)==null?void 0:o.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(d=(c=e.gameplay)==null?void 0:c.tuning)!=null&&d.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(a=>{var g,m,h;let s=typeof i=="function"?i(a.id):null;if(!s){let f=window.__editableObjectConfigs;f&&typeof f.get=="function"&&(s=(g=f.get(a.id))!=null?g:null)}let o=this.getTypeIconByType(a.objectType),l=this.getAssetPreview(s),c=(m=s==null?void 0:s.ui)!=null&&m.text?`"${s.ui.text.substring(0,12)}${s.ui.text.length>12?"...":""}"`:"",d=a.isTemplate?'<span class="scene-object-badge template">template</span>':"",p=((h=s==null?void 0:s.render)==null?void 0:h.visible)===!1;return`
535
+ `}escapeHtml(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}toggleObjectVisibility(e){var a;let t=(a=window.__editableConfig)==null?void 0:a.objects;if(!t||typeof t.get!="function")return;let i=t.get(e);if(!i)return;i.render||(i.render={});let n=i.render.visible!==!1;i.render.visible=!n;try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{objectId:e,action:"update"}}))}catch{}this.refreshObjects()}renderVisibilityButton(e,t){let i=t?"Show object":"Hide object";return`<button class="${t?"scene-object-eye is-hidden":"scene-object-eye"}" type="button" data-object-visibility-toggle="true" data-object-id="${this.escapeHtml(e)}" title="${i}">\u{1F441}\uFE0F</button>`}isBundleAllHidden(e){var i;if(!e.length)return!1;let t=(i=window.__editableConfig)==null?void 0:i.objects;return e.every(n=>{var r,o,l;let a=(o=(r=t==null?void 0:t.get)==null?void 0:r.call(t,n))!=null?o:null;return((l=a==null?void 0:a.render)==null?void 0:l.visible)===!1})}toggleSystemBundleVisibility(e){var o;let t=this.systemBundles.get(e);if(!t)return;let i=t.objectIds||[];if(!i.length)return;let n=(o=window.__editableConfig)==null?void 0:o.objects;if(!n||typeof n.get!="function")return;let r=this.isBundleAllHidden(i);i.forEach(l=>{let c=n.get(l);c&&(c.render||(c.render={}),c.render.visible=r)});try{window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}this.refreshObjects()}async deleteSystemBundle(e){let t=this.systemBundles.get(e);if(!t)return;let i=t.label||e,n=Array.from(new Set(t.objectIds||[]));!n.length||!window.confirm(`Delete system "${i}" (${n.length} object${n.length!==1?"s":""})? This removes them from the screen configuration.`)||await this.deleteMultipleObjects(n)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var 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(),r=`${e} ${a}`.toLowerCase();return r.includes("loading")?"loading":r.includes("start")?"start":r.includes("tutorial")?"tutorial":r.includes("endgame")||r.includes("end_card")||r.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,r,o,l,c,d;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.endsWith(".json")?"animation":((o=(r=e.render)==null?void 0:r.asset)==null?void 0:o.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(d=(c=e.gameplay)==null?void 0:c.tuning)!=null&&d.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(a=>{var g,h,m;let r=typeof i=="function"?i(a.id):null;if(!r){let f=window.__editableObjectConfigs;f&&typeof f.get=="function"&&(r=(g=f.get(a.id))!=null?g:null)}let o=this.getTypeIconByType(a.objectType),l=this.getAssetPreview(r),c=(h=r==null?void 0:r.ui)!=null&&h.text?`"${r.ui.text.substring(0,12)}${r.ui.text.length>12?"...":""}"`:"",d=a.isTemplate?'<span class="scene-object-badge template">template</span>':"",p=((m=r==null?void 0:r.render)==null?void 0:m.visible)===!1;return`
536
536
  <div class="scene-object-item-wrapper">
537
537
  <input type="checkbox" class="scene-object-checkbox" ${this.selectedIds.has(a.id)?"checked":""} data-object-id="${a.id}">
538
538
  ${this.renderVisibilityButton(a.id,p)}
@@ -550,7 +550,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
550
550
  ${n}
551
551
  </div>
552
552
  </div>
553
- `}renderSystemGroup(e){if(!e.length)return"";let t=window.getEditableObjectConfig,i=e.map(n=>{var p,u,g;let a=typeof t=="function"?t(n.id):null;if(!a){let m=window.__editableObjectConfigs;m&&typeof m.get=="function"&&(a=(p=m.get(n.id))!=null?p: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?"...":""}"`:"",c=((g=a==null?void 0:a.render)==null?void 0:g.visible)===!1;return`
553
+ `}renderSystemGroup(e){if(!e.length)return"";let t=window.getEditableObjectConfig,i=e.map(n=>{var p,u,g;let a=typeof t=="function"?t(n.id):null;if(!a){let h=window.__editableObjectConfigs;h&&typeof h.get=="function"&&(a=(p=h.get(n.id))!=null?p:null)}let r=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?"...":""}"`:"",c=((g=a==null?void 0:a.render)==null?void 0:g.visible)===!1;return`
554
554
  <div class="scene-object-item-wrapper">
555
555
  <input type="checkbox" class="scene-object-checkbox" ${this.selectedIds.has(n.id)?"checked":""} data-object-id="${n.id}">
556
556
  ${this.renderVisibilityButton(n.id,c)}
@@ -570,20 +570,20 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
570
570
  ${i}
571
571
  </div>
572
572
  </div>
573
- `}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var i,n,a,s,o,l;if(!e)return"\u{1F4E6}";if((i=e.render)!=null&&i.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((n=e.ui)!=null&&n.text)return"\u{1F4DD}";if(((a=e.identity)==null?void 0:a.category)==="ui")return"\u{1F3A8}";if(e.effects||(o=(s=e.identity)==null?void 0:s.id)!=null&&o.includes("effect"))return"\u2728";if(e.audio)return"\u{1F50A}";let t=((l=e.identity)==null?void 0:l.id)||"";return t.includes("background")?"\u{1F5BC}\uFE0F":t.includes("character")?"\u{1F464}":t.includes("key")?"\u{1F511}":t.includes("draggable")?"\u{1F3AF}":t.includes("machine")?"\u2699\uFE0F":t.includes("tutorial")||t.includes("hand")?"\u{1F446}":"\u{1F4E6}"}getAssetPreview(e){var i;if(!e)return null;let t=(i=e.render)==null?void 0:i.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var i,n,a,s;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((a=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:a.panel_bg_color)||((s=e.ui)==null?void 0:s.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var i,n,a,s;if(!e)return"";let t=[];return((i=e.render)==null?void 0:i.visible)===!1&&t.push("hidden"),((n=e.render)==null?void 0:n.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((a=e.interaction)!=null&&a.clickable||(s=e.ui)!=null&&s.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t,i,n;this.selectedId=e,this.selectedIds.has(e)||this.selectedIds.add(e),this.updateLastSelectedIndex(e),this.updateSelectionUI(),(t=this.options)==null||t.onSelect(e),(n=(i=this.options)==null?void 0:i.onMultiSelect)==null||n.call(i,Array.from(this.selectedIds))}toggleBatchSelect(e){var t,i;this.selectedIds.has(e)?this.selectedIds.delete(e):this.selectedIds.add(e),this.updateSelectionUI(),(i=(t=this.options)==null?void 0:t.onMultiSelect)==null||i.call(t,Array.from(this.selectedIds))}toggleSelect(e){this.toggleBatchSelect(e)}selectRange(e,t){var s,o,l;let i=this.objectEntries.findIndex(c=>c.id===t);if(i===-1)return;let n=Math.min(e,i),a=Math.max(e,i);for(let c=n;c<=a;c++)c>=0&&c<this.objectEntries.length&&this.selectedIds.add(this.objectEntries[c].id);this.selectedId=t,this.updateLastSelectedIndex(t),this.updateSelectionUI(),(s=this.options)==null||s.onSelect(this.selectedId),(l=(o=this.options)==null?void 0:o.onMultiSelect)==null||l.call(o,Array.from(this.selectedIds))}updateLastSelectedIndex(e){this.lastSelectedIndex=this.objectEntries.findIndex(t=>t.id===e)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectMenu(e){try{await new Vt({onRefresh:()=>this.refreshObjects(),onClose:()=>{}}).open(e)}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectMenu:",t)}}async openAddObjectWizard(e){try{new Gt().open({screenId:e})}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectWizard:",t)}}async showContextMenu(e,t,i,n){if(!this.isContextMenuOpen){this.isContextMenuOpen=!0,this.selectedIds.has(e)||this.select(e);try{new qt({objectId:e,screenId:t,onSelect:s=>{s&&this.select(s)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:s=>this.deleteObject(s),onMoveRequest:(s,o)=>this.moveObject(s,o)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var n;let t=this.getSelectedIds();if(t.length>1&&t.includes(e)){if(!window.confirm(`Delete ${t.length} selected object${t.length!==1?"s":""}? This removes them from the screen configuration.`))return;await this.deleteMultipleObjects(t)}else{if(!window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))return;try{let s=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e})}),o=await s.json().catch(()=>null);if(!s.ok||(o==null?void 0:o.success)===!1){let l=((n=o==null?void 0:o.errors)==null?void 0:n.join(`
573
+ `}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,r,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=(r=e.identity)==null?void 0:r.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,r;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)||((r=e.ui)==null?void 0:r.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var i,n,a,r;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||(r=e.ui)!=null&&r.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t,i,n;this.selectedId=e,this.selectedIds.has(e)||this.selectedIds.add(e),this.updateLastSelectedIndex(e),this.updateSelectionUI(),(t=this.options)==null||t.onSelect(e),(n=(i=this.options)==null?void 0:i.onMultiSelect)==null||n.call(i,Array.from(this.selectedIds))}toggleBatchSelect(e){var t,i;this.selectedIds.has(e)?this.selectedIds.delete(e):this.selectedIds.add(e),this.updateSelectionUI(),(i=(t=this.options)==null?void 0:t.onMultiSelect)==null||i.call(t,Array.from(this.selectedIds))}toggleSelect(e){this.toggleBatchSelect(e)}selectRange(e,t){var r,o,l;let i=this.objectEntries.findIndex(c=>c.id===t);if(i===-1)return;let n=Math.min(e,i),a=Math.max(e,i);for(let c=n;c<=a;c++)c>=0&&c<this.objectEntries.length&&this.selectedIds.add(this.objectEntries[c].id);this.selectedId=t,this.updateLastSelectedIndex(t),this.updateSelectionUI(),(r=this.options)==null||r.onSelect(this.selectedId),(l=(o=this.options)==null?void 0:o.onMultiSelect)==null||l.call(o,Array.from(this.selectedIds))}updateLastSelectedIndex(e){this.lastSelectedIndex=this.objectEntries.findIndex(t=>t.id===e)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectMenu(e){try{await new Kt({onRefresh:()=>this.refreshObjects(),onClose:()=>{}}).open(e)}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectMenu:",t)}}async openAddObjectWizard(e){try{new Wt().open({screenId:e})}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectWizard:",t)}}async showContextMenu(e,t,i,n){if(!this.isContextMenuOpen){this.isContextMenuOpen=!0,this.selectedIds.has(e)||this.select(e);try{new Yt({objectId:e,screenId:t,onSelect:r=>{r&&this.select(r)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:r=>this.deleteObject(r),onMoveRequest:(r,o)=>this.moveObject(r,o)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var n;let t=this.getSelectedIds();if(t.length>1&&t.includes(e)){if(!window.confirm(`Delete ${t.length} selected object${t.length!==1?"s":""}? This removes them from the screen configuration.`))return;await this.deleteMultipleObjects(t)}else{if(!window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))return;try{let r=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e})}),o=await r.json().catch(()=>null);if(!r.ok||(o==null?void 0:o.success)===!1){let l=((n=o==null?void 0:o.errors)==null?void 0:n.join(`
574
574
  `))||(o==null?void 0:o.error)||"Delete failed.";alert(l);return}o!=null&&o.failedDeletions&&o.failedDeletions.length>0&&alert(`Warning: Some files could not be deleted:
575
575
  ${o.failedDeletions.join(`
576
- `)}`),o!=null&&o.deletedFiles&&o.deletedFiles.length>0&&console.log(`[SceneObjectsPanel] Successfully deleted files: ${o.deletedFiles.join(", ")}`),await this.syncScreens(),this.selectedIds.delete(e),this.selectedId===e&&(this.selectedId=null),this.refreshObjects()}catch(s){alert(`Delete failed: ${s instanceof Error?s.message:String(s)}`)}}}async deleteMultipleObjects(e){var a;let t=0,i=0,n=[];for(let s of e)try{let o=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:s,skipSync:!0})}),l=await o.json().catch(()=>null);if(o.ok&&(l==null?void 0:l.success)!==!1)t++,this.selectedIds.delete(s);else{i++;let c=((a=l==null?void 0:l.errors)==null?void 0:a.join(`
577
- `))||(l==null?void 0:l.error)||"Delete failed.";n.push(`${s}: ${c}`)}}catch(o){i++,n.push(`${s}: ${o instanceof Error?o.message:String(o)}`)}if(i>0){let s=n.length>0?n.join(`
576
+ `)}`),o!=null&&o.deletedFiles&&o.deletedFiles.length>0&&console.log(`[SceneObjectsPanel] Successfully deleted files: ${o.deletedFiles.join(", ")}`),await this.syncScreens(),this.selectedIds.delete(e),this.selectedId===e&&(this.selectedId=null),this.refreshObjects()}catch(r){alert(`Delete failed: ${r instanceof Error?r.message:String(r)}`)}}}async deleteMultipleObjects(e){var a;let t=0,i=0,n=[];for(let r of e)try{let o=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:r,skipSync:!0})}),l=await o.json().catch(()=>null);if(o.ok&&(l==null?void 0:l.success)!==!1)t++,this.selectedIds.delete(r);else{i++;let c=((a=l==null?void 0:l.errors)==null?void 0:a.join(`
577
+ `))||(l==null?void 0:l.error)||"Delete failed.";n.push(`${r}: ${c}`)}}catch(o){i++,n.push(`${r}: ${o instanceof Error?o.message:String(o)}`)}if(i>0){let r=n.length>0?n.join(`
578
578
  `):`${i} object(s) failed to delete.`;alert(`Deleted ${t} object(s). Errors:
579
- ${s}`)}t===e.length&&console.log(`[SceneObjectsPanel] Successfully deleted ${t} object(s)`),this.selectedId=this.selectedIds.size>0?Array.from(this.selectedIds)[0]:null,await this.syncScreens(),this.refreshObjects()}async deleteSystemGroup(e){var 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 d=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:c})}),p=await d.json().catch(()=>null);if(d.ok&&(p==null?void 0:p.success)!==!1)a++;else{s++;let u=((l=p==null?void 0:p.errors)==null?void 0:l.join(`
580
- `))||(p==null?void 0:p.error)||"Delete failed.";o.push(`${c}: ${u}`)}}catch(d){s++,o.push(`${c}: ${d instanceof Error?d.message:String(d)}`)}if(s>0){let c=o.length>0?o.join(`
581
- `):`${s} object(s) failed to delete.`;alert(`Deleted ${a} object(s). Errors:
582
- ${c}`)}await this.syncScreens(),this.refreshObjects()}async moveObject(e,t){var a;let i=this.getSelectedIds();if(i.length>1&&i.includes(e))await this.moveMultipleObjects(i,t);else{let s=this.inferScreen(e,null);if(t===s)return;try{let o=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e,fromScreenId:s,toScreenId:t})}),l=await o.json().catch(()=>({}));if(!o.ok||(l==null?void 0:l.success)===!1){let c=((a=l==null?void 0:l.errors)==null?void 0:a.join(`
583
- `))||(l==null?void 0:l.error)||"Move failed.";alert(c);return}this.refreshObjects()}catch(o){alert(`Move failed: ${o instanceof Error?o.message:String(o)}`)}}}async moveMultipleObjects(e,t){var s;let i=0,n=0,a=[];for(let o of e){let l=this.inferScreen(o,null);if(t===l){i++;continue}try{let c=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:o,fromScreenId:l,toScreenId:t})}),d=await c.json().catch(()=>({}));if(c.ok&&(d==null?void 0:d.success)!==!1)i++;else{n++;let p=((s=d==null?void 0:d.errors)==null?void 0:s.join(`
579
+ ${r}`)}t===e.length&&console.log(`[SceneObjectsPanel] Successfully deleted ${t} object(s)`),this.selectedId=this.selectedIds.size>0?Array.from(this.selectedIds)[0]:null,await this.syncScreens(),this.refreshObjects()}async deleteSystemGroup(e){var 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,r=0,o=[];for(let c of n)try{let d=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:c})}),p=await d.json().catch(()=>null);if(d.ok&&(p==null?void 0:p.success)!==!1)a++;else{r++;let u=((l=p==null?void 0:p.errors)==null?void 0:l.join(`
580
+ `))||(p==null?void 0:p.error)||"Delete failed.";o.push(`${c}: ${u}`)}}catch(d){r++,o.push(`${c}: ${d instanceof Error?d.message:String(d)}`)}if(r>0){let c=o.length>0?o.join(`
581
+ `):`${r} object(s) failed to delete.`;alert(`Deleted ${a} object(s). Errors:
582
+ ${c}`)}await this.syncScreens(),this.refreshObjects()}async moveObject(e,t){var a;let i=this.getSelectedIds();if(i.length>1&&i.includes(e))await this.moveMultipleObjects(i,t);else{let r=this.inferScreen(e,null);if(t===r)return;try{let o=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e,fromScreenId:r,toScreenId:t})}),l=await o.json().catch(()=>({}));if(!o.ok||(l==null?void 0:l.success)===!1){let c=((a=l==null?void 0:l.errors)==null?void 0:a.join(`
583
+ `))||(l==null?void 0:l.error)||"Move failed.";alert(c);return}this.refreshObjects()}catch(o){alert(`Move failed: ${o instanceof Error?o.message:String(o)}`)}}}async moveMultipleObjects(e,t){var r;let i=0,n=0,a=[];for(let o of e){let l=this.inferScreen(o,null);if(t===l){i++;continue}try{let c=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:o,fromScreenId:l,toScreenId:t})}),d=await c.json().catch(()=>({}));if(c.ok&&(d==null?void 0:d.success)!==!1)i++;else{n++;let p=((r=d==null?void 0:d.errors)==null?void 0:r.join(`
584
584
  `))||(d==null?void 0:d.error)||"Move failed.";a.push(`${o}: ${p}`)}}catch(c){n++,a.push(`${o}: ${c instanceof Error?c.message:String(c)}`)}}if(n>0){let o=a.length>0?a.join(`
585
585
  `):`${n} object(s) failed to move.`;alert(`Moved ${i} object(s). Errors:
586
- ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[SceneObjectsPanel] Failed to sync screens:",e)}}};var Wt=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
586
+ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[SceneObjectsPanel] Failed to sync screens:",e)}}};var Jt=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
587
587
  <div class="scene-tools-corner-panel ${this.isCollapsed?"collapsed":""}" data-panel="scene-tools-corner">
588
588
  <div class="scene-tools-header" data-tools-header data-panel-handle>
589
589
  <span class="scene-tools-title">Scene Tools</span>
@@ -628,7 +628,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
628
628
  </div>
629
629
  </div>
630
630
  </div>
631
- `}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,d)=>{var u;let p=(u=this.root)==null?void 0:u.querySelector(`[data-status="${c}"]`);p&&p.classList.toggle("active",d)},s=this.root.querySelector("#debug-highlight-object");s==null||s.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightObject(!!s.checked),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 Kt=class{constructor(){this.root=null;this.options=null}render(){return`
631
+ `}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,d)=>{var u;let p=(u=this.root)==null?void 0:u.querySelector(`[data-status="${c}"]`);p&&p.classList.toggle("active",d)},r=this.root.querySelector("#debug-highlight-object");r==null||r.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightObject(!!r.checked),a("bounds",r.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 Zt=class{constructor(){this.root=null;this.options=null}render(){return`
632
632
  <div class="nudge-panel hidden" data-panel="nudge-panel">
633
633
  <div class="nudge-panel-header" data-panel-handle>
634
634
  <span class="nudge-panel-title">Nudge Controls</span>
@@ -685,7 +685,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
685
685
  </div>
686
686
  </div>
687
687
  </div>
688
- `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(a=>{a.addEventListener("click",()=>{var l,c,d,p;let s=a.dataset.nudge,o=this.getNudgeStep();switch(s){case"up":(l=this.options)==null||l.onNudge(0,-o);break;case"down":(c=this.options)==null||c.onNudge(0,o);break;case"left":(d=this.options)==null||d.onNudge(-o,0);break;case"right":(p=this.options)==null||p.onNudge(o,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(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 d=s.find(p=>(p==null?void 0:p.slotId)&&p.slotId===(c==null?void 0:c.slotId));d!=null&&d.currentAsset&&d.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=d.currentAsset)}let o=i.libraryAssets||{};for(let[c,d]of Object.entries(o)){if(!Array.isArray(d))continue;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let p=new Set((a.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of d){let g=u==null?void 0:u.filename;!g||p.has(g)||(a.libraryAssets[c].unshift(u),p.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
688
+ `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(a=>{a.addEventListener("click",()=>{var l,c,d,p;let r=a.dataset.nudge,o=this.getNudgeStep();switch(r){case"up":(l=this.options)==null||l.onNudge(0,-o);break;case"down":(c=this.options)==null||c.onNudge(0,o);break;case"left":(d=this.options)==null||d.onNudge(-o,0);break;case"right":(p=this.options)==null||p.onNudge(o,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(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 xt=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]:[]},r=Array.isArray(i.slots)?i.slots:[];if(r.length>0&&a.slots.length>0)for(let c of a.slots){let d=r.find(p=>(p==null?void 0:p.slotId)&&p.slotId===(c==null?void 0:c.slotId));d!=null&&d.currentAsset&&d.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=d.currentAsset)}let o=i.libraryAssets||{};for(let[c,d]of Object.entries(o)){if(!Array.isArray(d))continue;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let p=new Set((a.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of d){let g=u==null?void 0:u.filename;!g||p.has(g)||(a.libraryAssets[c].unshift(u),p.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
689
689
  <div class="scene-panel library-panel panel-accent-purple" data-panel="library">
690
690
  <div class="scene-panel-header" data-panel-handle>
691
691
  <div class="panel-title">
@@ -704,7 +704,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
704
704
  </div>
705
705
  <div class="panel-resize-handle" data-panel-resize></div>
706
706
  </div>
707
- `}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 d=document.createElement("div");d.className="slot-asset",d.textContent=e.currentAsset,l.appendChild(c),l.appendChild(d),a.appendChild(l);let p=document.createElement("div");p.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async f=>{f.stopPropagation(),await this.handleAIEdit(e)}),p.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async f=>{f.stopPropagation(),await this.handleUpload(e)}),p.appendChild(g);let m=document.createElement("button");m.className="slot-reset",m.title="Reset to default",m.textContent="\u21BA",m.addEventListener("click",async f=>{f.stopPropagation(),await this.handleReset(e)}),p.appendChild(m);let h=document.createElement("span");if(h.className="slot-expand-icon",h.textContent=i?"\u25BC":"\u25B6",p.appendChild(h),a.appendChild(p),a.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(a),i){let f=this.createLibraryElement(e,t);n.appendChild(f)}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 d=document.createElement("div");d.className="library-item";let p=document.createElement("img");p.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,p.alt=c.displayName,p.className="library-thumbnail",p.onerror=()=>{p.style.opacity="0.3"},d.appendChild(p);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,d.appendChild(u),d.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(d)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),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 d=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(d.success){console.log("[Library] \u2705 Upload saved:",d.path);let p=window.addAssetToRegistry;typeof p=="function"&&p(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:",d.error),alert(`Upload failed: ${d.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 Xt=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 Jt=class{render(e,t,i,n){let a=this.formatLabel(t),s=i?this.getThumbnailUrl(i):"";return`
707
+ `}initialize(e,t){var a,r,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=(r=this.root)==null?void 0:r.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 r=document.createElement("div");r.className="library-category-header",r.textContent=this.formatCategoryName(i),a.appendChild(r);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 r=document.createElement("div");r.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"},r.appendChild(o),a.appendChild(r);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let d=document.createElement("div");d.className="slot-asset",d.textContent=e.currentAsset,l.appendChild(c),l.appendChild(d),a.appendChild(l);let p=document.createElement("div");p.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async f=>{f.stopPropagation(),await this.handleAIEdit(e)}),p.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async f=>{f.stopPropagation(),await this.handleUpload(e)}),p.appendChild(g);let h=document.createElement("button");h.className="slot-reset",h.title="Reset to default",h.textContent="\u21BA",h.addEventListener("click",async f=>{f.stopPropagation(),await this.handleReset(e)}),p.appendChild(h);let m=document.createElement("span");if(m.className="slot-expand-icon",m.textContent=i?"\u25BC":"\u25B6",p.appendChild(m),a.appendChild(p),a.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(a),i){let f=this.createLibraryElement(e,t);n.appendChild(f)}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(r=>{let o=new Map;for(let c of n)o.set(c.filename,c);for(let c of r)o.has(c.filename)||o.set(c.filename,c);let l=Array.from(o.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let d=document.createElement("div");d.className="library-item";let p=document.createElement("img");p.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,p.alt=c.displayName,p.className="library-thumbnail",p.onerror=()=>{p.style.opacity="0.3"},d.appendChild(p);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,d.appendChild(u),d.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(d)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],r=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=r.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 d=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(d.success){console.log("[Library] \u2705 Upload saved:",d.path);let p=window.addAssetToRegistry;typeof p=="function"&&p(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:",d.error),alert(`Upload failed: ${d.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 r;let a=(r=this.slotsContainer)==null?void 0:r.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 Qt=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 ei=class{render(e,t,i,n){let a=this.formatLabel(t),r=i?this.getThumbnailUrl(i):"";return`
708
708
  <div class="inspector-property" data-property-type="image">
709
709
  <div class="inspector-property-header">
710
710
  <label class="inspector-label">${a}</label>
@@ -715,9 +715,9 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
715
715
  <button class="debug-btn debug-btn-sm" data-action="reset" data-path="${n}" data-object="${e}" title="Reset">\u21BA</button>
716
716
  </div>
717
717
  </div>
718
- ${s?`
718
+ ${r?`
719
719
  <div class="inspector-image-preview">
720
- <img src="${s}" alt="${a}" class="inspector-thumbnail" />
720
+ <img src="${r}" alt="${a}" class="inspector-thumbnail" />
721
721
  </div>
722
722
  `:`
723
723
  <div class="inspector-image-preview inspector-image-empty">
@@ -726,7 +726,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
726
726
  </div>
727
727
  `}
728
728
  </div>
729
- `}getThumbnailUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("http")?e:`/raw/${e}?t=${Date.now()}`}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Zt=class{render(e,t,i,n){let a=i||"#000000";return`
729
+ `}getThumbnailUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("http")?e:`/raw/${e}?t=${Date.now()}`}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ti=class{render(e,t,i,n){let a=i||"#000000";return`
730
730
  <div class="inspector-property inspector-property-color">
731
731
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
732
732
  <div class="inspector-color-group">
@@ -742,7 +742,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
742
742
  data-object-id="${e}" />
743
743
  </div>
744
744
  </div>
745
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Qt=class{render(e,t,i,n){return`
745
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ii=class{render(e,t,i,n){return`
746
746
  <div class="inspector-property inspector-property-number">
747
747
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
748
748
  <input type="number"
@@ -752,7 +752,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
752
752
  data-object-id="${e}"
753
753
  step="any" />
754
754
  </div>
755
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ei=class{render(e,t,i,n){let a=String(i||"");return`
755
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ni=class{render(e,t,i,n){let a=String(i||"");return`
756
756
  <div class="inspector-property inspector-property-text">
757
757
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
758
758
  <div class="inspector-input-group">
@@ -763,7 +763,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
763
763
  data-object-id="${e}" />
764
764
  </div>
765
765
  </div>
766
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ti=class{render(e,t,i,n){return`
766
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ai=class{render(e,t,i,n){return`
767
767
  <div class="inspector-property inspector-property-boolean">
768
768
  <label class="inspector-property-label">
769
769
  <input type="checkbox"
@@ -774,7 +774,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
774
774
  <span>${this.formatLabel(t)}</span>
775
775
  </label>
776
776
  </div>
777
- `}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"&&this.registry){let s=this.registry,o=Array.isArray(i)?i:[],l=o.map((d,p)=>{let u=`${n}.${p}`,g=`
777
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ri=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let r=this.registry,o=Array.isArray(i)?i:[],l=o.map((d,p)=>{let u=`${n}.${p}`,g=`
778
778
  <button class="inspector-button inspector-button-small"
779
779
  data-logic-remove="true"
780
780
  data-object-id="${e}"
@@ -782,17 +782,17 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
782
782
  data-index="${p}">
783
783
  Remove
784
784
  </button>
785
- `;if(d&&typeof d=="object"&&!Array.isArray(d)){let h=s.renderProperty(e,"logic",d,u);return`
785
+ `;if(d&&typeof d=="object"&&!Array.isArray(d)){let m=r.renderProperty(e,"logic",d,u);return`
786
786
  <div class="inspector-array-item inspector-logic-item">
787
787
  <div class="inspector-array-item-header">
788
788
  <span>Logic ${p+1}</span>
789
789
  ${g}
790
790
  </div>
791
791
  <div class="inspector-array-item-body">
792
- ${h}
792
+ ${m}
793
793
  </div>
794
794
  </div>
795
- `}let m=typeof d=="string"?d:JSON.stringify(d);return`
795
+ `}let h=typeof d=="string"?d:JSON.stringify(d);return`
796
796
  <div class="inspector-array-item inspector-logic-item">
797
797
  <div class="inspector-array-item-header">
798
798
  <span>Logic ${p+1}</span>
@@ -806,7 +806,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
806
806
  </button>
807
807
  </div>
808
808
  <div class="inspector-array-item-body inspector-array-item-raw">
809
- ${m}
809
+ ${h}
810
810
  </div>
811
811
  </div>
812
812
  `}).join(""),c=`
@@ -831,14 +831,14 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
831
831
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
832
832
  <div class="inspector-array-empty">Empty array</div>
833
833
  </div>
834
- `;let a=i.map((s,o)=>typeof s=="string"?`<div class="inspector-array-item">\u2022 ${s}</div>`:typeof s=="object"?`<div class="inspector-array-item">\u2022 ${JSON.stringify(s)}</div>`:`<div class="inspector-array-item">\u2022 ${String(s)}</div>`).join("");return`
834
+ `;let a=i.map((r,o)=>typeof r=="string"?`<div class="inspector-array-item">\u2022 ${r}</div>`:typeof r=="object"?`<div class="inspector-array-item">\u2022 ${JSON.stringify(r)}</div>`:`<div class="inspector-array-item">\u2022 ${String(r)}</div>`).join("");return`
835
835
  <div class="inspector-property inspector-property-array">
836
836
  <label class="inspector-property-label">${this.formatLabel(t)} (${i.length} items)</label>
837
837
  <div class="inspector-array-list">
838
838
  ${a}
839
839
  </div>
840
840
  </div>
841
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ni=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}`,d=this.registry.renderProperty(e,o,l,c);d&&a.push(d)}return a.length===0?"":a.length<=4&&a.every(o=>o.includes("inspector-property"))?`
841
+ `}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){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}`,d=this.registry.renderProperty(e,o,l,c);d&&a.push(d)}return a.length===0?"":a.length<=4&&a.every(o=>o.includes("inspector-property"))?`
842
842
  <div class="inspector-subsection">
843
843
  <div class="inspector-subsection-title">${this.formatLabel(t)}</div>
844
844
  <div class="inspector-subsection-content">
@@ -852,7 +852,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
852
852
  ${a.join("")}
853
853
  </div>
854
854
  </div>
855
- `}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(f=>String(f)).filter(f=>f.trim().length>0);return Array.from(new Set(h)).sort((f,b)=>f.localeCompare(b))})(),c=s&&!l.includes(s)?[s,...l]:l;a.push(`
855
+ `}renderLogic(e,t,i,n){let a=[],r=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:[],m=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(f=>String(f)).filter(f=>f.trim().length>0);return Array.from(new Set(m)).sort((f,v)=>f.localeCompare(v))})(),c=r&&!l.includes(r)?[r,...l]:l;a.push(`
856
856
  <div class="inspector-property inspector-property-text">
857
857
  <label class="inspector-property-label">Id</label>
858
858
  <div class="inspector-input-group">
@@ -860,42 +860,42 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
860
860
  data-property-path="${n}.id"
861
861
  data-object-id="${e}"
862
862
  data-logic-id-selector="true">
863
- <option value="" ${s?"":"selected"}>None</option>
864
- ${c.map(u=>`<option value="${u}" ${u===s?"selected":""}>${u}</option>`).join("")}
863
+ <option value="" ${r?"":"selected"}>None</option>
864
+ ${c.map(u=>`<option value="${u}" ${u===r?"selected":""}>${u}</option>`).join("")}
865
865
  </select>
866
866
  </div>
867
867
  </div>
868
- `);for(let u in i){if(u==="id")continue;let g=i[u],m=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let f=[];for(let b in g){let v=g[b],x=`${m}.${b}`,y=o[b];if(b==="targetId"||b==="inputId"){let w=this.registry.getObjectIds(),I=typeof v=="string"?v:"",R=I&&!w.includes(I)?[I,...w]:w;f.push(`
868
+ `);for(let u in i){if(u==="id")continue;let g=i[u],h=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let f=[];for(let v in g){let b=g[v],w=`${h}.${v}`,y=o[v];if(v==="targetId"||v==="inputId"){let x=this.registry.getObjectIds(),I=typeof b=="string"?b:"",j=I&&!x.includes(I)?[I,...x]:x;f.push(`
869
869
  <div class="inspector-property inspector-property-text">
870
- <label class="inspector-property-label">${this.formatLabel(b)}</label>
870
+ <label class="inspector-property-label">${this.formatLabel(v)}</label>
871
871
  <div class="inspector-input-group">
872
872
  <select class="inspector-component-select inspector-input"
873
- data-property-path="${x}"
873
+ data-property-path="${w}"
874
874
  data-object-id="${e}">
875
875
  <option value="" ${I?"":"selected"}>None</option>
876
- ${R.map(k=>`<option value="${k}" ${k===I?"selected":""}>${k}</option>`).join("")}
876
+ ${j.map(T=>`<option value="${T}" ${T===I?"selected":""}>${T}</option>`).join("")}
877
877
  </select>
878
878
  </div>
879
879
  </div>
880
880
  `);continue}if(Array.isArray(y)&&y.length)f.push(`
881
881
  <div class="inspector-property inspector-property-text">
882
- <label class="inspector-property-label">${this.formatLabel(b)}</label>
882
+ <label class="inspector-property-label">${this.formatLabel(v)}</label>
883
883
  <div class="inspector-input-group">
884
884
  <select class="inspector-component-select inspector-input"
885
- data-property-path="${x}"
885
+ data-property-path="${w}"
886
886
  data-object-id="${e}">
887
- ${y.map(w=>`<option value="${String(w)}" ${String(w)===String(v)?"selected":""}>${String(w)}</option>`).join("")}
887
+ ${y.map(x=>`<option value="${String(x)}" ${String(x)===String(b)?"selected":""}>${String(x)}</option>`).join("")}
888
888
  </select>
889
889
  </div>
890
890
  </div>
891
- `);else{let w=this.registry.renderProperty(e,b,v,x);w&&f.push(w)}}f.length&&a.push(`
891
+ `);else{let x=this.registry.renderProperty(e,v,b,w);x&&f.push(x)}}f.length&&a.push(`
892
892
  <div class="inspector-property inspector-property-object">
893
893
  <div class="inspector-object-header">Props</div>
894
894
  <div class="inspector-object-body">
895
895
  ${f.join("")}
896
896
  </div>
897
897
  </div>
898
- `);continue}let h=this.registry.renderProperty(e,u,g,m);h&&a.push(h)}if(a.length===0)return"";let p=/(^|\.)logic\.\d+$/.test(n)?"":`
898
+ `);continue}let m=this.registry.renderProperty(e,u,g,h);m&&a.push(m)}if(a.length===0)return"";let p=/(^|\.)logic\.\d+$/.test(n)?"":`
899
899
  <div class="inspector-array-actions" style="margin-top: 12px;">
900
900
  <button class="inspector-button"
901
901
  data-logic-add="true"
@@ -913,18 +913,18 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
913
913
  ${p}
914
914
  </div>
915
915
  </div>
916
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ai=class{render(e,t,i,n,a){let s=i==null?"":String(i),o=Array.from(new Set(a.map(c=>String(c)))),l=s&&!o.includes(s)?[s,...o]:o;return`
916
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var oi=class{render(e,t,i,n,a){let r=i==null?"":String(i),o=Array.from(new Set(a.map(c=>String(c)))),l=r&&!o.includes(r)?[r,...o]:o;return`
917
917
  <div class="inspector-property inspector-property-text">
918
918
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
919
919
  <div class="inspector-input-group">
920
920
  <select class="inspector-component-select inspector-input"
921
921
  data-property-path="${n}"
922
922
  data-object-id="${e}">
923
- ${l.map(c=>`<option value="${c}" ${c===s?"selected":""}>${c}</option>`).join("")}
923
+ ${l.map(c=>`<option value="${c}" ${c===r?"selected":""}>${c}</option>`).join("")}
924
924
  </select>
925
925
  </div>
926
926
  </div>
927
- `}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 a=this.safeStringify(i);return`
927
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var li=class{render(e,t,i,n){let a=this.safeStringify(i);return`
928
928
  <div class="inspector-property inspector-property-text">
929
929
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
930
930
  <div class="inspector-input-group">
@@ -935,7 +935,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
935
935
  rows="6">${a}</textarea>
936
936
  </div>
937
937
  </div>
938
- `}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 si=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,d=typeof(o==null?void 0:o.y)=="number"?o.y:0;return`
938
+ `}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 ci=class{render(e,t,i,n){let r=(Array.isArray(i)?i:[]).map((o,l)=>{let c=typeof(o==null?void 0:o.x)=="number"?o.x:0,d=typeof(o==null?void 0:o.y)=="number"?o.y:0;return`
939
939
  <div class="inspector-row" style="gap:8px; align-items:center;">
940
940
  <input type="number"
941
941
  class="inspector-input"
@@ -958,7 +958,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
958
958
  <div class="inspector-property inspector-property-object">
959
959
  <div class="inspector-object-header">${this.formatLabel(t)}</div>
960
960
  <div class="inspector-object-body">
961
- ${s||'<div class="inspector-text-sm" style="opacity:0.7;">No spawn points.</div>'}
961
+ ${r||'<div class="inspector-text-sm" style="opacity:0.7;">No spawn points.</div>'}
962
962
  <div class="inspector-row" style="margin-top:8px;">
963
963
  <button type="button"
964
964
  class="inspector-btn inspector-btn-sm primary"
@@ -968,7 +968,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
968
968
  </div>
969
969
  </div>
970
970
  </div>
971
- `}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(e){this.registry=e}render(e,t,i,n){let a=Array.isArray(i)?i:[],o=["",...this.registry.getObjectIds()],l=a.map((c,d)=>{let p=typeof(c==null?void 0:c.templateId)=="string"?c.templateId:"",u=typeof(c==null?void 0:c.weight)=="number"?c.weight:1,g=o.map(m=>`<option value="${m}"${m===p?" selected":""}>${m||"(none)"}</option>`).join("");return`
971
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var di=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,d)=>{let p=typeof(c==null?void 0:c.templateId)=="string"?c.templateId:"",u=typeof(c==null?void 0:c.weight)=="number"?c.weight:1,g=o.map(h=>`<option value="${h}"${h===p?" selected":""}>${h||"(none)"}</option>`).join("");return`
972
972
  <div class="inspector-row" style="gap:8px; align-items:center;">
973
973
  <select class="inspector-select inspector-input"
974
974
  data-property-path="${n}.${d}.templateId"
@@ -1003,8 +1003,8 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-scre
1003
1003
  </div>
1004
1004
  </div>
1005
1005
  </div>
1006
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var li=class{constructor(){this.typeDetector=new Xt,this.imageRenderer=new Jt,this.colorRenderer=new Zt,this.numberRenderer=new Qt,this.textRenderer=new ei,this.booleanRenderer=new ti,this.arrayRenderer=new ii(this),this.objectRenderer=new ni(this),this.selectRenderer=new ai,this.jsonRenderer=new ri,this.spawnPointsRenderer=new si,this.spawnTemplatesRenderer=new oi(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 d=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof d!="string"||!d.startsWith("enum:"))return null;let u=d.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,s)=>a.localeCompare(s))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),s=a==="logic"||a==="logic_id"||a==="logicid",o=a==="id"&&n.toLowerCase().includes("logic");if((s||o)&&typeof i=="string"){let m=this.getLogicOptions(),h=this.selectRenderer.render(e,t,i,n,m);return s?`
1007
- ${h}
1006
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var pi=class{constructor(){this.typeDetector=new Qt,this.imageRenderer=new ei,this.colorRenderer=new ti,this.numberRenderer=new ii,this.textRenderer=new ni,this.booleanRenderer=new ai,this.arrayRenderer=new ri(this),this.objectRenderer=new si(this),this.selectRenderer=new oi,this.jsonRenderer=new li,this.spawnPointsRenderer=new ci,this.spawnTemplatesRenderer=new di(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 r=String(e||"").split(".").filter(Boolean);if(r.length<2)return null;let o=r[0],l=r.slice(1).join("."),c=a instanceof Map?a.get(o):a==null?void 0:a[o];if(!c)return null;let d=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof d!="string"||!d.startsWith("enum:"))return null;let u=d.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,r)=>a.localeCompare(r))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),r=a==="logic"||a==="logic_id"||a==="logicid",o=a==="id"&&n.toLowerCase().includes("logic");if((r||o)&&typeof i=="string"){let h=this.getLogicOptions(),m=this.selectRenderer.render(e,t,i,n,h);return r?`
1007
+ ${m}
1008
1008
  <div class="inspector-array-actions">
1009
1009
  <button class="inspector-button"
1010
1010
  data-logic-add="true"
@@ -1013,7 +1013,7 @@ ${h}
1013
1013
  Add Logic
1014
1014
  </button>
1015
1015
  </div>
1016
- `: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"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let p=c[t];if(p&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let m=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,m,n,p)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let m=this.getObjectIds(),h=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...m]);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"],f=i==null?"1":String(i);return this.selectRenderer.render(e,t,f,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 ci=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new li,this.updateManager=new Oe,this.quickActions=new Ut;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`
1016
+ `:m}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let p=c[t];if(p&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let h=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,h,n,p)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),m=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?m+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':m}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let m=["1","-1"],f=i==null?"1":String(i);return this.selectRenderer.render(e,t,f,n,m)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let m=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,m,n)}}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function xs(s,e){let t;return function(...n){let a=()=>{clearTimeout(t),s(...n)};clearTimeout(t),t=setTimeout(a,e)}}var ui=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 pi,this.updateManager=new ze,this.quickActions=new Vt;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`
1017
1017
  <div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
1018
1018
  <div class="scene-panel-header" data-panel-handle>
1019
1019
  <div class="panel-title">
@@ -1034,22 +1034,22 @@ ${h}
1034
1034
  </div>
1035
1035
  </div>
1036
1036
  </div>
1037
- `}initialize(e,t){var i;this.options=t,this.root=e.querySelector('[data-panel="inspector"]'),this.contentContainer=(i=this.root)==null?void 0:i.querySelector("[data-inspector-content]")}loadObject(e){this.selectedObjectId=e;let t=window.getEditableObjectConfig;if(typeof t!="function"){this.showError("Config system not ready");return}let i=t(e);if(!i){console.error("[InspectorPanel] Object not found in config system:",e),this.showError(`Object not found: ${e}`);return}this.renderProperties(e,i)}renderProperties(e,t){if(!this.contentContainer)return;let i=[],n=t.identity||{},a=n.id||e,s=n.category||"unknown";i.push(`
1037
+ `}initialize(e,t){var i;this.options=t,this.root=e.querySelector('[data-panel="inspector"]'),this.contentContainer=(i=this.root)==null?void 0:i.querySelector("[data-inspector-content]")}loadObject(e){this.selectedObjectId=e;let t=window.getEditableObjectConfig;if(typeof t!="function"){this.showError("Config system not ready");return}let i=t(e);if(!i){console.error("[InspectorPanel] Object not found in config system:",e),this.showError(`Object not found: ${e}`);return}this.renderProperties(e,i)}renderProperties(e,t){if(!this.contentContainer)return;let i=[],n=t.identity||{},a=n.id||e,r=n.category||"unknown";i.push(`
1038
1038
  <div class="inspector-header">
1039
1039
  <div class="inspector-header-info">
1040
1040
  <div class="inspector-object-name">${a}</div>
1041
- <div class="inspector-object-category">${s}</div>
1041
+ <div class="inspector-object-category">${r}</div>
1042
1042
  </div>
1043
1043
  ${this.renderConversionButtons(e,t)}
1044
1044
  </div>
1045
- `);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,d;let i=!!t.ui,n=((o=t.ui)==null?void 0:o.renderMode)==="png"||((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.type)==="image";if(!(i||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||n)return"";let s=(d=t.ui)!=null&&d.text?"ui.text":"render.asset.path";return`
1045
+ `);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,d;let i=!!t.ui,n=((o=t.ui)==null?void 0:o.renderMode)==="png"||((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.type)==="image";if(!(i||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||n)return"";let r=(d=t.ui)!=null&&d.text?"ui.text":"render.asset.path";return`
1046
1046
  <div class="inspector-quick-actions">
1047
1047
  <button class="debug-btn debug-btn-sm success ai-simple-btn" type="button" data-convert-toggle>
1048
1048
  \u2728 Convert to PNG
1049
1049
  </button>
1050
1050
  <div class="inspector-convert-menu hidden" data-convert-menu>
1051
1051
  <button class="debug-btn debug-btn-sm" data-action="library" data-path="render.asset.path" data-object="${e}">\u{1F3A8} Library</button>
1052
- <button class="debug-btn debug-btn-sm" data-action="ai-convert" data-path="${s}" data-object="${e}">\u2728 AI</button>
1052
+ <button class="debug-btn debug-btn-sm" data-action="ai-convert" data-path="${r}" data-object="${e}">\u2728 AI</button>
1053
1053
  <button class="debug-btn debug-btn-sm" data-action="upload" data-path="render.asset.path" data-object="${e}">\u{1F4E4} Upload</button>
1054
1054
  </div>
1055
1055
  </div>
@@ -1063,7 +1063,7 @@ ${h}
1063
1063
  <button class="debug-btn debug-btn-sm primary" data-inspector-add-component-btn>Add</button>
1064
1064
  </div>
1065
1065
  </div>
1066
- `}renderSection(e,t,i,n){if(t==="motion")return this.renderMotionSection(e,i,n);if(t==="logic")return this.renderLogicSection(e,i,n);let a=[],s=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let c in i){if(!this.showAdvanced&&s.includes(c))continue;let d=i[c],p=`${n}.${c}`,u=this.rendererRegistry.renderProperty(e,c,d,p);u&&a.push(u)}return a.length===0?"":`
1066
+ `}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=[],r=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let c in i){if(!this.showAdvanced&&r.includes(c))continue;let d=i[c],p=`${n}.${c}`,u=this.rendererRegistry.renderProperty(e,c,d,p);u&&a.push(u)}return a.length===0?"":`
1067
1067
  <div class="inspector-section ${t==="transform"?"":"collapsed"}" data-section="${t}">
1068
1068
  <div class="inspector-section-header" data-section-toggle="${t}">
1069
1069
  <span class="inspector-section-arrow">\u25BC</span>
@@ -1085,7 +1085,7 @@ ${h}
1085
1085
  ${n}
1086
1086
  </div>
1087
1087
  </div>
1088
- `:""}applyMotionDefaults(e,t){if(!t||typeof t!="object")return e!=null?e:{};let i={...e!=null?e:{}};for(let n of Object.keys(t)){let a=t[n],s=i[n];a!=null&&typeof a=="object"&&!Array.isArray(a)?i[n]=this.applyMotionDefaults(s,a):s===void 0&&(i[n]=a)}return i}renderMotionSection(e,t,i){var m;let n=[],a=this.getMotionDefaults(),s=this.applyMotionDefaults(t!=null?t:{},a!=null?a:{}),o=(m=s.intro)!=null?m:{},l=o.enabled===!0&&(typeof o.duration!="number"||o.duration<=0)?'<div class="inspector-warning">\u26A0\uFE0F Duration must be > 0 to play.</div>':"",c=`
1088
+ `:""}applyMotionDefaults(e,t){if(!t||typeof t!="object")return e!=null?e:{};let i={...e!=null?e:{}};for(let n of Object.keys(t)){let a=t[n],r=i[n];a!=null&&typeof a=="object"&&!Array.isArray(a)?i[n]=this.applyMotionDefaults(r,a):r===void 0&&(i[n]=a)}return i}renderMotionSection(e,t,i){var h;let n=[],a=this.getMotionDefaults(),r=this.applyMotionDefaults(t!=null?t:{},a!=null?a:{}),o=(h=r.intro)!=null?h:{},l=o.enabled===!0&&(typeof o.duration!="number"||o.duration<=0)?'<div class="inspector-warning">\u26A0\uFE0F Duration must be > 0 to play.</div>':"",c=`
1089
1089
  <div class="inspector-motion-presets">
1090
1090
  <span class="inspector-subsection-title">Intro Motions</span>
1091
1091
  <div class="inspector-motion-buttons">
@@ -1102,7 +1102,7 @@ ${h}
1102
1102
  <button class="debug-btn debug-btn-sm ${this.motionSimpleMode?"primary":""}" data-motion-simple-toggle>
1103
1103
  ${this.motionSimpleMode?"Simple":"Advanced"}
1104
1104
  </button>
1105
- `,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',u=h=>{let f=h.split(".").filter(Boolean),b=s;for(let y of f)b=b==null?void 0:b[y];let v=f[f.length-1],x=`${i}.${h}`;return this.rendererRegistry.renderProperty(e,v,b,x)};if(this.motionSimpleMode){let h=u("enabled");h&&n.push(h);let f=[],b=u("intro.enabled"),v=u("intro.type"),x=u("intro.duration"),y=u("intro.easing");b&&f.push(b),v&&f.push(v),x&&f.push(x),y&&f.push(y),f.length&&n.push(`
1105
+ `,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',u=m=>{let f=m.split(".").filter(Boolean),v=r;for(let y of f)v=v==null?void 0:v[y];let b=f[f.length-1],w=`${i}.${m}`;return this.rendererRegistry.renderProperty(e,b,v,w)};if(this.motionSimpleMode){let m=u("enabled");m&&n.push(m);let f=[],v=u("intro.enabled"),b=u("intro.type"),w=u("intro.duration"),y=u("intro.easing");v&&f.push(v),b&&f.push(b),w&&f.push(w),y&&f.push(y),f.length&&n.push(`
1106
1106
  <div class="inspector-subsection">
1107
1107
  <div class="inspector-subsection-title">Intro</div>
1108
1108
  <div class="inspector-subsection-content">
@@ -1111,18 +1111,18 @@ ${h}
1111
1111
  ${f.join("")}
1112
1112
  </div>
1113
1113
  </div>
1114
- `);let w=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),I=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),R=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),k=[u("continuousRotate.enabled"),u("continuousRotate.speed"),u("continuousRotate.direction")].filter(Boolean),j=[u("orbit.enabled"),u("orbit.radius"),u("orbit.speed"),u("orbit.direction"),u("orbit.pivotOffsetX"),u("orbit.pivotOffsetY")].filter(Boolean);if(w.length||I.length||R.length||k.length||j.length){let C=(L,T)=>T.length?`
1114
+ `);let x=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),I=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),j=[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||I.length||j.length||T.length||_.length){let L=(k,C)=>C.length?`
1115
1115
  <div class="inspector-motion-continuous-group">
1116
- <div class="inspector-subsection-title">${L}</div>
1117
- <div class="inspector-subsection-content">${T.join("")}</div>
1118
- </div>`:"",A=[C("Pulse",w),C("Swing",I),C("Move forever",R),C("Rotate (pivoting itself)",k),C("Rotate around",j)].filter(Boolean).join("");n.push(`
1116
+ <div class="inspector-subsection-title">${k}</div>
1117
+ <div class="inspector-subsection-content">${C.join("")}</div>
1118
+ </div>`:"",A=[L("Pulse",x),L("Swing",I),L("Move forever",j),L("Rotate (pivoting itself)",T),L("Rotate around",_)].filter(Boolean).join("");n.push(`
1119
1119
  <div class="inspector-subsection inspector-subsection-continuous">
1120
1120
  <div class="inspector-subsection-title">Continuous</div>
1121
1121
  <div class="inspector-subsection-content inspector-motion-continuous-groups">
1122
1122
  ${A}
1123
1123
  </div>
1124
1124
  </div>
1125
- `)}}else for(let h in s){let f=s[h],b=`${i}.${h}`,v=this.rendererRegistry.renderProperty(e,h,f,b);v&&n.push(v)}return n.length===0?"":`
1125
+ `)}}else for(let m in r){let f=r[m],v=`${i}.${m}`,b=this.rendererRegistry.renderProperty(e,m,f,v);b&&n.push(b)}return n.length===0?"":`
1126
1126
  <div class="inspector-section ${this.expandMotionOnNextRender?"":"collapsed"}" data-section="motion">
1127
1127
  <div class="inspector-section-header" data-section-toggle="motion">
1128
1128
  <span class="inspector-section-arrow">\u25BC</span>
@@ -1135,7 +1135,7 @@ ${h}
1135
1135
  ${n.join("")}
1136
1136
  </div>
1137
1137
  </div>
1138
- `}attachEventListeners(){var y,w,I,R;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=gs((k,j,_)=>{var C,A;this.updateManager.updateProperty(k,j,_),(A=(C=this.options)==null?void 0:C.onPropertyChange)==null||A.call(C,k,j,_)},300),i=k=>k?/(^|\.)logic(\.\d+)?\.id$/.test(k):!1;e.forEach(k=>{let j=C=>{var S,E;let A=C.target,L=A.dataset.propertyPath,T=A.dataset.objectId;if(L&&T){let P=A.value;if(A.type==="checkbox")P=A.checked;else if(A.type==="number"){if(P=parseFloat(A.value),isNaN(P))return}else if(A.dataset.json==="true")try{P=JSON.parse(A.value)}catch{return}A.type==="text"||A.type==="range"||A.tagName==="TEXTAREA"?t(T,L,P):(this.updateManager.updateProperty(T,L,P),(E=(S=this.options)==null?void 0:S.onPropertyChange)==null||E.call(S,T,L,P))}},_=k.dataset.propertyPath;i(_)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",_),k.addEventListener("change",async C=>{var D;let A=C.target,L=A.dataset.propertyPath,T=A.dataset.objectId,S=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",S),!L||!T)return;await this.updateManager.updateProperty(T,L,S),console.log("[Inspector v1.0.0] Logic ID updated");let E=window,P=(D=E==null?void 0:E.__HANDLER_LOGIC_META)==null?void 0:D[S],M=this.getDefaultPropsForLogic(S,P);console.log("[Inspector v1.0.0] New logic default props:",M);let O=L.replace(/\.id$/,".props");await this.updateManager.updateProperty(T,O,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(T)})):(k.addEventListener("change",j),(k.tagName==="INPUT"||k.tagName==="TEXTAREA")&&k.addEventListener("input",j))}),this.contentContainer.querySelectorAll("[data-action]").forEach(k=>{k.addEventListener("click",j=>{let _=j.target,C=_.dataset.action,A=_.dataset.path,L=_.dataset.object;C&&A&&L&&this.quickActions.handleAction(C,L,A)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(k=>{k.addEventListener("click",j=>{var A,L;let _=j.target,C=_.dataset.sectionToggle||((A=_.closest("[data-section-toggle]"))==null?void 0:A.getAttribute("data-section-toggle"));if(C){let T=(L=this.contentContainer)==null?void 0:L.querySelector(`[data-section="${C}"]`);T==null||T.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(k=>{k.addEventListener("click",async j=>{let C=j.currentTarget.dataset.motionPreset;!C||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,C)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(k=>{k.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(k=>{k.addEventListener("click",async j=>{let _=j.target,C=_.dataset.objectId,A=_.dataset.propertyPath;if(!C||!A)return;let L=window.getEditableObjectConfig,T=L==null?void 0:L(C);if(!T)return;let S=this.updateManager.getNestedProperty(T,A),E=Array.isArray(S)?[...S]:[];E.push({x:0,y:0}),await this.updateManager.updateProperty(C,A,E),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(k=>{k.addEventListener("click",async j=>{let _=j.target,C=_.dataset.objectId,A=_.dataset.propertyPath,L=Number(_.dataset.index||"-1");if(!C||!A||L<0)return;let T=window.getEditableObjectConfig,S=T==null?void 0:T(C);if(!S)return;let E=this.updateManager.getNestedProperty(S,A);if(!Array.isArray(E))return;let P=E.filter((M,O)=>O!==L);await this.updateManager.updateProperty(C,A,P),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(k=>{k.addEventListener("click",async j=>{let _=j.target,C=_.dataset.objectId,A=_.dataset.propertyPath;if(!C||!A)return;let L=window.getEditableObjectConfig,T=L==null?void 0:L(C);if(!T)return;let S=this.updateManager.getNestedProperty(T,A),E=Array.isArray(S)?[...S]:[];E.push({templateId:"",weight:1}),await this.updateManager.updateProperty(C,A,E),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(k=>{k.addEventListener("click",async j=>{var M;let _=j.target,C=_.dataset.objectId,A=_.dataset.propertyPath,L=Number((M=_.dataset.index)!=null?M:-1);if(!C||!A||L<0)return;let T=window.getEditableObjectConfig,S=T==null?void 0:T(C);if(!S)return;let E=this.updateManager.getNestedProperty(S,A);if(!Array.isArray(E))return;let P=E.filter((O,D)=>D!==L);await this.updateManager.updateProperty(C,A,P),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(k=>{k.addEventListener("click",async j=>{var N;let _=j.target,C=_.dataset.objectId,A=_.dataset.propertyPath;if(!C||!A)return;let L=window.getEditableObjectConfig,T=L==null?void 0:L(C);if(!T)return;let S=this.updateManager.getNestedProperty(T,A),E;Array.isArray(S)?E=[...S]:S!=null?typeof S=="string"?E=[{id:S,props:{}}]:typeof S=="object"?E=[S]:E=[]:E=[];let P=this.getDefaultLogicId(),M=window,O=(N=M==null?void 0:M.__HANDLER_LOGIC_META)==null?void 0:N[P],D=this.getDefaultPropsForLogic(P,O);E.push({id:P,props:D}),console.log("[InspectorPanel] Adding logic to array:",{objectId:C,path:A,current:S,next:E}),await this.updateManager.updateProperty(C,A,E),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(k=>{k.addEventListener("click",async j=>{var M;let _=j.target,C=_.dataset.objectId,A=_.dataset.propertyPath,L=Number((M=_.dataset.index)!=null?M:-1);if(!C||!A||L<0)return;let T=window.getEditableObjectConfig,S=T==null?void 0:T(C);if(!S)return;let E=this.updateManager.getNestedProperty(S,A);if(!Array.isArray(E))return;let P=E.filter((O,D)=>D!==L);await this.updateManager.updateProperty(C,A,P),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(k=>{k.addEventListener("click",async j=>{var H,B;let _=j.target,C=_.dataset.objectId,A=_.dataset.propertyPath,L=Number((H=_.dataset.index)!=null?H:-1);if(!C||!A||L<0)return;let T=window.getEditableObjectConfig,S=T==null?void 0:T(C);if(!S)return;let E=this.updateManager.getNestedProperty(S,A);if(!Array.isArray(E))return;let P=E[L];if(typeof P!="string")return;let M=window,O=(B=M==null?void 0:M.__HANDLER_LOGIC_META)==null?void 0:B[P],D=this.getDefaultPropsForLogic(P,O),N=[...E];N[L]={id:P,props:D},await this.updateManager.updateProperty(C,A,N),this.loadObject(C)})});let f=(y=this.root)==null?void 0:y.querySelector("[data-inspector-advanced]");f==null||f.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(w=this.root)==null?void 0:w.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var j;let k=(j=this.root)==null?void 0:j.querySelector("[data-convert-menu]");k==null||k.classList.toggle("hidden")});let v=(I=this.contentContainer)==null?void 0:I.querySelector("[data-inspector-add-component-btn]"),x=(R=this.contentContainer)==null?void 0:R.querySelector("[data-inspector-component-select]");v==null||v.addEventListener("click",async()=>{let k=x.value;k&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,k)})}getMotionDefaults(){var i,n,a,s;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(s=(a=t.motion)==null?void 0:a.defaults)!=null?s:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),s={...(l=n.motion)!=null?l:a},o={...(c=s.intro)!=null?c:{}};s.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",s.intro=o,await this.updateManager.updateProperty(e,"motion",s),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},s={...(l=a.intro)!=null?l:{}};a.enabled=!0,s.enabled=!0,a.intro=s,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,s=a==null?void 0:a.schemas,o=null;s instanceof Map?o=s.get(t):s&&typeof s=="object"&&(o=s[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,s;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((s=(a=i.render)==null?void 0:a.asset)==null?void 0:s.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
1138
+ `}attachEventListeners(){var y,x,I,j;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=xs((T,_,O)=>{var L,A;this.updateManager.updateProperty(T,_,O),(A=(L=this.options)==null?void 0:L.onPropertyChange)==null||A.call(L,T,_,O)},300),i=T=>T?/(^|\.)logic(\.\d+)?\.id$/.test(T):!1;e.forEach(T=>{let _=L=>{var E,S;let A=L.target,k=A.dataset.propertyPath,C=A.dataset.objectId;if(k&&C){let M=A.value;if(A.type==="checkbox")M=A.checked;else if(A.type==="number"){if(M=parseFloat(A.value),isNaN(M))return}else if(A.dataset.json==="true")try{M=JSON.parse(A.value)}catch{return}A.type==="text"||A.type==="range"||A.tagName==="TEXTAREA"?t(C,k,M):(this.updateManager.updateProperty(C,k,M),(S=(E=this.options)==null?void 0:E.onPropertyChange)==null||S.call(E,C,k,M))}},O=T.dataset.propertyPath;i(O)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",O),T.addEventListener("change",async L=>{var D;let A=L.target,k=A.dataset.propertyPath,C=A.dataset.objectId,E=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",E),!k||!C)return;await this.updateManager.updateProperty(C,k,E),console.log("[Inspector v1.0.0] Logic ID updated");let S=window,M=(D=S==null?void 0:S.__HANDLER_LOGIC_META)==null?void 0:D[E],P=this.getDefaultPropsForLogic(E,M);console.log("[Inspector v1.0.0] New logic default props:",P);let R=k.replace(/\.id$/,".props");await this.updateManager.updateProperty(C,R,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(C)})):(T.addEventListener("change",_),(T.tagName==="INPUT"||T.tagName==="TEXTAREA")&&T.addEventListener("input",_))}),this.contentContainer.querySelectorAll("[data-action]").forEach(T=>{T.addEventListener("click",_=>{let O=_.target,L=O.dataset.action,A=O.dataset.path,k=O.dataset.object;L&&A&&k&&this.quickActions.handleAction(L,k,A)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(T=>{T.addEventListener("click",_=>{var A,k;let O=_.target,L=O.dataset.sectionToggle||((A=O.closest("[data-section-toggle]"))==null?void 0:A.getAttribute("data-section-toggle"));if(L){let C=(k=this.contentContainer)==null?void 0:k.querySelector(`[data-section="${L}"]`);C==null||C.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(T=>{T.addEventListener("click",async _=>{let L=_.currentTarget.dataset.motionPreset;!L||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,L)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(T=>{T.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(T=>{T.addEventListener("click",async _=>{let O=_.target,L=O.dataset.objectId,A=O.dataset.propertyPath;if(!L||!A)return;let k=window.getEditableObjectConfig,C=k==null?void 0:k(L);if(!C)return;let E=this.updateManager.getNestedProperty(C,A),S=Array.isArray(E)?[...E]:[];S.push({x:0,y:0}),await this.updateManager.updateProperty(L,A,S),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(T=>{T.addEventListener("click",async _=>{let O=_.target,L=O.dataset.objectId,A=O.dataset.propertyPath,k=Number(O.dataset.index||"-1");if(!L||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(L);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let M=S.filter((P,R)=>R!==k);await this.updateManager.updateProperty(L,A,M),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(T=>{T.addEventListener("click",async _=>{let O=_.target,L=O.dataset.objectId,A=O.dataset.propertyPath;if(!L||!A)return;let k=window.getEditableObjectConfig,C=k==null?void 0:k(L);if(!C)return;let E=this.updateManager.getNestedProperty(C,A),S=Array.isArray(E)?[...E]:[];S.push({templateId:"",weight:1}),await this.updateManager.updateProperty(L,A,S),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(T=>{T.addEventListener("click",async _=>{var P;let O=_.target,L=O.dataset.objectId,A=O.dataset.propertyPath,k=Number((P=O.dataset.index)!=null?P:-1);if(!L||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(L);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let M=S.filter((R,D)=>D!==k);await this.updateManager.updateProperty(L,A,M),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(T=>{T.addEventListener("click",async _=>{var N;let O=_.target,L=O.dataset.objectId,A=O.dataset.propertyPath;if(!L||!A)return;let k=window.getEditableObjectConfig,C=k==null?void 0:k(L);if(!C)return;let E=this.updateManager.getNestedProperty(C,A),S;Array.isArray(E)?S=[...E]:E!=null?typeof E=="string"?S=[{id:E,props:{}}]:typeof E=="object"?S=[E]:S=[]:S=[];let M=this.getDefaultLogicId(),P=window,R=(N=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:N[M],D=this.getDefaultPropsForLogic(M,R);S.push({id:M,props:D}),console.log("[InspectorPanel] Adding logic to array:",{objectId:L,path:A,current:E,next:S}),await this.updateManager.updateProperty(L,A,S),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(T=>{T.addEventListener("click",async _=>{var P;let O=_.target,L=O.dataset.objectId,A=O.dataset.propertyPath,k=Number((P=O.dataset.index)!=null?P:-1);if(!L||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(L);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let M=S.filter((R,D)=>D!==k);await this.updateManager.updateProperty(L,A,M),this.loadObject(L)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(T=>{T.addEventListener("click",async _=>{var H,F;let O=_.target,L=O.dataset.objectId,A=O.dataset.propertyPath,k=Number((H=O.dataset.index)!=null?H:-1);if(!L||!A||k<0)return;let C=window.getEditableObjectConfig,E=C==null?void 0:C(L);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let M=S[k];if(typeof M!="string")return;let P=window,R=(F=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:F[M],D=this.getDefaultPropsForLogic(M,R),N=[...S];N[k]={id:M,props:D},await this.updateManager.updateProperty(L,A,N),this.loadObject(L)})});let f=(y=this.root)==null?void 0:y.querySelector("[data-inspector-advanced]");f==null||f.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let v=(x=this.root)==null?void 0:x.querySelector("[data-convert-toggle]");v==null||v.addEventListener("click",()=>{var _;let T=(_=this.root)==null?void 0:_.querySelector("[data-convert-menu]");T==null||T.classList.toggle("hidden")});let b=(I=this.contentContainer)==null?void 0:I.querySelector("[data-inspector-add-component-btn]"),w=(j=this.contentContainer)==null?void 0:j.querySelector("[data-inspector-component-select]");b==null||b.addEventListener("click",async()=>{let T=w.value;T&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,T)})}getMotionDefaults(){var i,n,a,r;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"?(r=(a=t.motion)==null?void 0:a.defaults)!=null?r:{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(),r={...(l=n.motion)!=null?l:a},o={...(c=r.intro)!=null?c:{}};r.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",r.intro=o,await this.updateManager.updateProperty(e,"motion",r),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},r={...(l=a.intro)!=null?l:{}};a.enabled=!0,r.enabled=!0,a.intro=r,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,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,r=a==null?void 0:a.schemas,o=null;r instanceof Map?o=r.get(t):r&&typeof r=="object"&&(o=r[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,r;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((r=(a=i.render)==null?void 0:a.asset)==null?void 0:r.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=`
1139
1139
  <div class="inspector-empty">
1140
1140
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
1141
1141
  <span class="inspector-empty-text">${e}</span>
@@ -1145,17 +1145,17 @@ ${h}
1145
1145
  <span class="inspector-empty-icon">\u{1F3AF}</span>
1146
1146
  <span class="inspector-empty-text">Select an object to inspect</span>
1147
1147
  </div>
1148
- `)}};import*as or from"jszip";function tn(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 di(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 tn(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 Re(r){var e,t;try{let i=await tn(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 nn(r){return tn(r).then(e=>e).catch(()=>null)}function an(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((p,u)=>{let g=new Image;g.onload=()=>p(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(p=>({r:s[p.offset],g:s[p.offset+1],b:s[p.offset+2]})),c=0;for(let p=0;p<s.length;p+=4){let u=s[p],g=s[p+1],m=s[p+2],h=!1;for(let f of l)if(Math.sqrt(Math.pow(u-f.r,2)+Math.pow(g-f.g,2)+Math.pow(m-f.b,2))<e){h=!0;break}h&&(s[p+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(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 Te(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function te(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=te(r.id))!=null?i:te(r.name);if(e)return e;let t=(n=te(r.file))!=null?n:te(r.asset);return t?Qa((a=t.split("/").pop())!=null?a:t):void 0}function ms(r,e,t){var i,n,a;if(typeof e=="string")return{id:r,file:e,role:t};if(Te(e)){let s=(i=te(e.file))!=null?i:te(e.asset);return s?{id:(n=te(e.id))!=null?n:r,file:s,role:(a=te(e.role))!=null?a:t,dataUrl:te(e.dataUrl),layout:e.layout}:null}return null}function rn(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(Te(s)){let o=hs(s),l=(i=te(s.file))!=null?i:te(s.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=te(s.role))!=null?n:e,dataUrl:te(s.dataUrl),layout:s.layout})}}return a}if(Te(r)){let a=[];for(let[s,o]of Object.entries(r)){let l=ms(s,o,e);l&&a.push(l)}return a}return[]}function fs(r){var e,t;return(t=(e=te(r.brand_name))!=null?e:te(r.brandName))!=null?t:te(r.name)}function bs(r){if(Te(r.brand_dna)&&Te(r.brand_dna.colors))return r.brand_dna;if(Te(r.colors)){let e={colors:r.colors};return typeof r.style=="string"&&(e.style=r.style),Te(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 sn(r,e={}){var s,o,l;let t=r.filter(Te),i=(o=(s=t.map(fs).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(...rn(c.layers,"visual element")),"assets"in c&&a.push(...rn(c.assets,"visual element")),Te(c.endgame)&&"assets"in c.endgame&&a.push(...rn(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 pi(r,e,t=[],i={}){var n,a,s,o,l,c,d;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 p=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 m=await p.models.generateContent({model:u,contents:g}),h="",f=(s=(a=(n=m.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:s.parts;if(f)for(let b of f)b.text&&(h+=b.text);if(!h.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${h.length}`),h}catch(p){throw console.error("[Gemini] API error:",p),(o=p.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=p.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=p.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=p.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):p}}import{GoogleGenAI as 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(`
1149
- `)||"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(`
1150
- `),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=`
1148
+ `)}};import*as wr from"jszip";function cn(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function nr(s){var n;let[e,t]=s.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 ar(s){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=s})}async function gi(s){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",s);let i=await fetch(s);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,s),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await cn(n),r=await ar(a),o=nr(a);return console.log("[ImageUtils] Success resolution:",r==null?void 0:r.width,"x",r==null?void 0:r.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:a,width:(e=r==null?void 0:r.width)!=null?e:0,height:(t=r==null?void 0:r.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function De(s){var e,t;try{let i=await cn(s),n=await ar(i),a=nr(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 dn(s){return cn(s).then(e=>e).catch(()=>null)}function pn(s,e){var t;try{let[i,n]=s.split(","),a=i.match(/data:(.*?);base64/),r=(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:r})}catch{return null}}async function nt(s,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((p,u)=>{let g=new Image;g.onload=()=>p(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=s}),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"),s;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),r=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(p=>({r:r[p.offset],g:r[p.offset+1],b:r[p.offset+2]})),c=0;for(let p=0;p<r.length;p+=4){let u=r[p],g=r[p+1],h=r[p+2],m=!1;for(let f of l)if(Math.sqrt(Math.pow(u-f.r,2)+Math.pow(g-f.g,2)+Math.pow(h-f.b,2))<e){m=!0;break}m&&(r[p+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),s}}function rr(s,e){if(!s||!e)return"1:1";let t=s/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function Le(s){return typeof s=="object"&&s!==null&&!Array.isArray(s)}function te(s){return typeof s=="string"?s:void 0}function sr(s){return s.toLowerCase().endsWith(".png")?s.slice(0,-4):s}function Ss(s){var i,n,a;let e=(i=te(s.id))!=null?i:te(s.name);if(e)return e;let t=(n=te(s.file))!=null?n:te(s.asset);return t?sr((a=t.split("/").pop())!=null?a:t):void 0}function Es(s,e,t){var i,n,a;if(typeof e=="string")return{id:s,file:e,role:t};if(Le(e)){let r=(i=te(e.file))!=null?i:te(e.asset);return r?{id:(n=te(e.id))!=null?n:s,file:r,role:(a=te(e.role))!=null?a:t,dataUrl:te(e.dataUrl),layout:e.layout}:null}return null}function un(s,e){var t,i,n;if(!s)return[];if(Array.isArray(s)){let a=[];for(let r of s){if(typeof r=="string"){let o=sr((t=r.split("/").pop())!=null?t:r);a.push({id:o,file:r,role:e});continue}if(Le(r)){let o=Ss(r),l=(i=te(r.file))!=null?i:te(r.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=te(r.role))!=null?n:e,dataUrl:te(r.dataUrl),layout:r.layout})}}return a}if(Le(s)){let a=[];for(let[r,o]of Object.entries(s)){let l=Es(r,o,e);l&&a.push(l)}return a}return[]}function As(s){var e,t;return(t=(e=te(s.brand_name))!=null?e:te(s.brandName))!=null?t:te(s.name)}function Cs(s){if(Le(s.brand_dna)&&Le(s.brand_dna.colors))return s.brand_dna;if(Le(s.colors)){let e={colors:s.colors};return typeof s.style=="string"&&(e.style=s.style),Le(s.fonts)&&(e.fonts=s.fonts),e}}function Ts(s){var t;let e=new Map;for(let i of s){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 gn(s,e={}){var r,o,l;let t=s.filter(Le),i=(o=(r=t.map(As).find(Boolean))!=null?r:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(Cs).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...un(c.layers,"visual element")),"assets"in c&&a.push(...un(c.assets,"visual element")),Le(c.endgame)&&"assets"in c.endgame&&a.push(...un(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:Ts(a)}}import{GoogleGenAI as Ls}from"@google/genai";async function hi(s,e,t=[],i={}){var n,a,r,o,l,c,d;try{if(!(s!=null&&s.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let v=0;v<t.length;v++){let b=t[v];if(!b.base64||!b.mimeType)throw new Error(`Image ${v+1} is missing required data`);if(b.base64.length<1e3&&console.warn(`Image ${v+1} data appears very small, may be corrupted`),!b.mimeType.startsWith("image/"))throw new Error(`Image ${v+1} has invalid MIME type: ${b.mimeType}`)}let p=new Ls({apiKey:s}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((v,b)=>{g.push({inlineData:{data:v.base64,mimeType:v.mimeType}}),console.log(`[Gemini] Added image ${b+1}: ${v.mimeType}, size: ${Math.round(v.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await p.models.generateContent({model:u,contents:g}),m="",f=(r=(a=(n=h.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:r.parts;if(f)for(let v of f)v.text&&(m+=v.text);if(!m.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${m.length}`),m}catch(p){throw console.error("[Gemini] API error:",p),(o=p.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=p.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=p.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=p.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):p}}import{GoogleGenAI as ks}from"@google/genai";async function at(s,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new ks({apiKey:s}),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 r=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!r.candidates||!r.candidates[0]||!r.candidates[0].content||!r.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let o of r.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 or(s){let e=s.brandAssets.map(a=>{let r=`- ${a.id}: ${a.role}`;return a.layout&&(r+=` [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}]`),r}).join(`
1149
+ `)||"None",t=s.brandDna?`Colors: ${JSON.stringify(s.brandDna.colors)}, Style: ${s.brandDna.style||"not specified"}`:"Not provided",i=s.gameObjects.map(a=>typeof a=="string"?`- id: ${a}`:`- id: ${a.id}${a.category?`, category: ${a.category}`:""}${a.type?`, type: ${a.type}`:""}`).join(`
1150
+ `),n="";if(s.brandConfig){let a=s.brandConfig,r=[];a.splash&&r.push(`SPLASH: title="${a.splash.title||""}", subtitle="${a.splash.subtitle||""}", button="${a.splash.button_label||""}"`),a.endgame&&r.push(`ENDGAME: title="${a.endgame.title||""}", subtitle="${a.endgame.subtitle||""}", cta="${a.endgame.cta_label||""}"`),a.tutorial&&r.push(`TUTORIAL: text="${a.tutorial.label_text||""}", helper="${a.tutorial.helper_text||""}"`),r.length>0&&(n=`
1151
1151
  BRAND CONTENT:
1152
- ${s.join(`
1152
+ ${r.join(`
1153
1153
  `)}
1154
1154
  `)}return`
1155
1155
  You are analyzing a brand's visual design for use in a playable ad game.
1156
1156
 
1157
1157
  GAME CONTEXT:
1158
- ${r.gamePrompt||"Simple game"}
1158
+ ${s.gamePrompt||"Simple game"}
1159
1159
 
1160
1160
  GAME OBJECTS (need assets):
1161
1161
  ${i}
@@ -1209,28 +1209,113 @@ OUTPUT ONLY VALID JSON (no markdown, no explanation):
1209
1209
  }
1210
1210
  ]
1211
1211
  }
1212
- `.trim()}function tr(r){var n,a;let e=(n=r.brandDna)!=null&&n.colors?`Primary: ${r.brandDna.colors.primary}, Secondary: ${r.brandDna.colors.secondary||"N/A"}, Accent: ${r.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((a=r.brandDna)==null?void 0:a.style)||"modern gaming style",i=r.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
1213
- TASK: ${r.prompt}
1212
+ `.trim()}function lr(s){var n,a;let e=(n=s.brandDna)!=null&&n.colors?`Primary: ${s.brandDna.colors.primary}, Secondary: ${s.brandDna.colors.secondary||"N/A"}, Accent: ${s.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((a=s.brandDna)==null?void 0:a.style)||"modern gaming style",i=s.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
1213
+ TASK: ${s.prompt}
1214
1214
 
1215
1215
  BRAND STYLE:
1216
1216
  - Colors: ${e}
1217
1217
  - Style: ${t}
1218
1218
 
1219
1219
  CHANGE_STRENGTH: 8/10
1220
- REFERENCE: ${r.hasReference?"provided (use as style guide for colors and aesthetics)":"none"}
1220
+ REFERENCE: ${s.hasReference?"provided (use as style guide for colors and aesthetics)":"none"}
1221
1221
  ${i}
1222
1222
 
1223
1223
  OUTPUT CONSTRAINTS (MUST FOLLOW):
1224
1224
  - Do NOT add extra text unless specifically requested
1225
- - Preserve aspect ratio${r.aspectRatio?` (target: ${r.aspectRatio})`:""}
1225
+ - Preserve aspect ratio${s.aspectRatio?` (target: ${s.aspectRatio})`:""}
1226
1226
  - Keep padding under 5% of asset size
1227
1227
  - No drop shadows unless explicitly requested
1228
- - No gradients on the background (solid ${r.needsTransparency?"magenta":"colors"} only)
1228
+ - No gradients on the background (solid ${s.needsTransparency?"magenta":"colors"} only)
1229
1229
  - Center the subject in frame
1230
1230
 
1231
1231
  OUTPUT:
1232
- Generate the requested asset matching the brand style.${r.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
1233
- `.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 pi(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 on(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 Re(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 Re(a);s&&(n.dataUrl=s.dataUrl)}}}var ui=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`
1232
+ Generate the requested asset matching the brand style.${s.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
1233
+ `.trim()}function cr(s){return s.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 dr(s,e){return!(s.includes("background")&&(s.includes("_1")||s.includes("splash")||s.includes("endgame")||s.includes("main"))||e==="text"||e==="effects"&&s.includes("particle"))}async function pr(s){var r,o;let e=cr(s.gameObjects),t={gamePrompt:s.gamePrompt,gameObjects:e,brandAssets:s.manifest.assets,brandDna:s.manifest.brand_dna,brandName:s.manifest.brand_name},i=or(t),n=[];if(s.flatDesignDataUrl)try{let l=ur(s.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 hi(s.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(r=l.message)!=null&&r.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 Ps(a,s.gameObjects)}function Ps(s,e){try{let t=s,i=s.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=s.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:s,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:s,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:s,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function hn(s,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 r=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,r.game_object);try{let o=await Ms(s,r);r.output_dataUrl=o,r.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${r.game_object}:`,o),r.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Ms(s,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&s.manifest){let o=s.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=s.assetFiles.get(o.file);if(l){let c=await De(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(s.flatDesignDataUrl){let o=ur(s.flatDesignDataUrl);o&&t.push(o)}let i=dr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:s.manifest.brand_dna,needsTransparency:i},a=lr(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let r=await at(s.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await nt(r)||r}function ur(s){let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function gr(s,e){let t=s.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=[],s.assets=i;for(let n of i){let a=e.get(n.file);if(a){let r=await De(a);r&&(n.dataUrl=r.dataUrl)}}}function hr(s){let e=new Map;if(!s)return e;if(s!=null&&s.layers&&Array.isArray(s.layers))for(let t of s.layers){let i=t.asset||t.id||t.name;i&&t.layout&&e.set(i,{position:t.layout.position||{x:0,y:0},scale:t.layout.scale||1,rotation:t.layout.rotation||0})}if(typeof s=="object"&&!Array.isArray(s)){for(let[t,i]of Object.entries(s))if(i&&typeof i=="object"&&"layout"in i){let n=i.layout;e.set(t,{position:(n==null?void 0:n.position)||{x:0,y:0},scale:(n==null?void 0:n.scale)||1,rotation:(n==null?void 0:n.rotation)||0})}}return e}function mr(s,e){if(!s||e.size===0)return null;if(e.has(s))return e.get(s);let t=s.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return e.get(t);for(let[i,n]of e.entries()){let a=i.toLowerCase(),r=t.toLowerCase();if(a===r||a.includes(r)||r.includes(a))return n}return null}function Is(s){return s.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function fr(){var n,a,r,o,l,c,d;let s=window.getEditableObjectList,e=typeof s=="function"?s():[],t=window.getEditableObjectConfig;if(typeof t!="function")return[];let i=[];for(let p of e)try{let u=t(p);if(!u)continue;(((a=(n=u==null?void 0:u.render)==null?void 0:n.asset)==null?void 0:a.type)==="image"||(o=(r=u==null?void 0:u.render)==null?void 0:r.asset)!=null&&o.path||(l=u==null?void 0:u.render)!=null&&l.asset&&typeof u.render.asset=="string")&&i.push({id:p,name:Is(p),type:((d=(c=u==null?void 0:u.render)==null?void 0:c.asset)==null?void 0:d.type)||"sprite"})}catch(u){console.warn(`[CanvaZip] Failed to check object ${p}:`,u)}return i.sort((p,u)=>p.name.localeCompare(u.name))}import{Assets as mi}from"pixi.js";async function br(s,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 mi.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)ye[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function vr(s,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,r=typeof a=="function"?a():null,o=(t=r==null?void 0:r.slots)==null?void 0:t.find(f=>f.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let p=await mi.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)ye[f]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let m=window.gameObjectManager;if(m)for(let f of h){let v=m.get(f);if(v){let b=((n=v.getDisplayObject)==null?void 0:n.call(v))||v.pixiObject||v;b!=null&&b.texture&&(b.texture=p,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function fi(s,e,t,i){var n,a,r,o,l,c,d,p,u,g,h,m,f,v,b;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let w=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",w);let y=Date.now(),x=`/raw/library/${i}/${t}?t=${y}`;console.log("[LIBRARY] Loading texture from:",x);let I=await mi.load(x);if(!I){console.error("[LIBRARY] Failed to load texture:",x);return}console.log("[LIBRARY] \u2705 Texture loaded"),ye[w]=I,console.log("[LIBRARY] \u2705 Updated AssetTextures."+w);let j=window.CustomAssets;j!=null&&j[w]&&(j[w].texture=I,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+w));let T=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!T),T){let O=Array.from(((n=T.keys)==null?void 0:n.call(T))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",O);let L=T.get(w);if(console.log("[LIBRARY] gameObject for "+w+"?",!!L),L){let A=((a=L.getDisplayObject)==null?void 0:a.call(L))||L.pixiObject||L.pixi||L,k=(r=A==null?void 0:A.constructor)==null?void 0:r.name;if(console.log("[LIBRARY] displayObject:",A),console.log("[LIBRARY] displayObject type:",k),console.log("[LIBRARY] has texture?",!!(A!=null&&A.texture)),A!=null&&A.texture)A.texture=I,console.log("[LIBRARY] \u2705 Applied to display object:",w);else if(k==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:C}=await import("pixi.js"),E=A.parent,S=(l=(o=E==null?void 0:E.getChildIndex)==null?void 0:o.call(E,A))!=null?l:0,M={x:A.x,y:A.y},P={x:(d=(c=A.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=A.anchor)==null?void 0:p.y)!=null?u:.5},R={x:(h=(g=A.scale)==null?void 0:g.x)!=null?h:1,y:(f=(m=A.scale)==null?void 0:m.y)!=null?f:1},D=(v=A.alpha)!=null?v:1,N=(b=A.visible)!=null?b:!0,H=new C(I);H.anchor.set(P.x,P.y),H.position.set(M.x,M.y),H.scale.set(R.x,R.y),H.alpha=D,H.visible=N,E&&(E.removeChild(A),E.addChildAt(H,S),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),L.pixiObject&&(L.pixiObject=H),L.pixi&&(L.pixi=H),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(A!=null&&A.children){let C=A.children.find(E=>E.texture);C?(C.texture=I,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let _=`raw/library/${i}/${t}`;Ve({objectId:w,path:"render.asset.path",value:_}),console.log("[LIBRARY] \u2705 Staged config override for:",w,"path:",_)}catch(w){console.error("[LIBRARY] Error applying slot asset:",w)}}async function yr(s,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,r=Date.now(),o=`/raw/${t}?t=${r}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await mi.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}ye[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let d=window.gameObjectManager;if(d){let p=d.get(a);if(p){let u=((n=p.getDisplayObject)==null?void 0:n.call(p))||p.pixiObject||p;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Ve({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)}}var bi=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
1234
+ <div class="canva-wizard-overlay" data-canva-wizard>
1235
+ <div class="canva-wizard-modal">
1236
+ <div class="canva-wizard-header">
1237
+ <div class="canva-wizard-title">
1238
+ <span class="canva-wizard-icon">\u{1F4E6}</span>
1239
+ <div>
1240
+ <h2>Review Extracted Assets</h2>
1241
+ <p class="canva-wizard-subtitle">Choose how to handle each asset from the Canva ZIP</p>
1242
+ </div>
1243
+ </div>
1244
+ <button class="canva-wizard-close" data-canva-wizard-close title="Cancel">\u2715</button>
1245
+ </div>
1246
+
1247
+ <div class="canva-wizard-progress">
1248
+ <div class="canva-wizard-progress-bar">
1249
+ <div class="canva-wizard-progress-fill" style="width: ${t/e*100}%"></div>
1250
+ </div>
1251
+ <span class="canva-wizard-progress-text">${t} of ${e} assets processed</span>
1252
+ </div>
1253
+
1254
+ <div class="canva-wizard-body">
1255
+ <div class="canva-wizard-gallery" data-canva-gallery>
1256
+ ${this.assets.map((i,n)=>this.renderAssetCard(i,n)).join("")}
1257
+ </div>
1258
+ </div>
1259
+
1260
+ <div class="canva-wizard-footer">
1261
+ <div class="canva-wizard-footer-info">
1262
+ <span class="canva-wizard-hint">\u{1F4A1} All assets will be saved to library</span>
1263
+ </div>
1264
+ <div class="canva-wizard-footer-actions">
1265
+ <button class="inspector-btn" data-canva-wizard-cancel>Cancel</button>
1266
+ <button class="inspector-btn primary" data-canva-wizard-apply-all>Apply All</button>
1267
+ </div>
1268
+ </div>
1269
+ </div>
1270
+ </div>
1271
+ `}renderAssetCard(e,t){let n=e.position&&e.scale?`x: ${e.position.x.toFixed(0)}, y: ${e.position.y.toFixed(0)}, scale: ${e.scale.toFixed(2)}`:"No position data",a=e.action==="add"||e.action==="replace"?"active":"",r=e.action==="replace"?this.renderReplaceDropdown(e,t):"";return`
1272
+ <div class="canva-asset-card ${a}" data-asset-index="${t}">
1273
+ <div class="canva-asset-preview">
1274
+ <img src="${e.dataUrl}" alt="${e.filename}" />
1275
+ </div>
1276
+ <div class="canva-asset-info">
1277
+ <div class="canva-asset-name" title="${e.filename}">${e.filename}</div>
1278
+ <div class="canva-asset-position">${n}</div>
1279
+ </div>
1280
+ <div class="canva-asset-category">
1281
+ <label>Category:</label>
1282
+ <select class="inspector-input inspector-input-sm" data-asset-category="${t}">
1283
+ <option value="environment" ${e.category==="environment"?"selected":""}>Environment</option>
1284
+ <option value="backgrounds" ${e.category==="backgrounds"?"selected":""}>Backgrounds</option>
1285
+ <option value="ui" ${e.category==="ui"?"selected":""}>UI</option>
1286
+ <option value="effects" ${e.category==="effects"?"selected":""}>Effects</option>
1287
+ <option value="products" ${e.category==="products"?"selected":""}>Products</option>
1288
+ <option value="misc" ${e.category==="misc"?"selected":""}>Misc</option>
1289
+ </select>
1290
+ </div>
1291
+ <div class="canva-asset-actions">
1292
+ <button class="inspector-btn inspector-btn-sm ${e.action==="add"?"primary":""}"
1293
+ data-asset-action="${t}" data-action="add"
1294
+ title="Add as new object to scene">
1295
+ \u2795 Add To Scene
1296
+ </button>
1297
+ <button class="inspector-btn inspector-btn-sm ${e.action==="replace"?"primary":""}"
1298
+ data-asset-action="${t}" data-action="replace"
1299
+ title="Replace existing object">
1300
+ \u{1F504} Replace
1301
+ </button>
1302
+ <button class="inspector-btn inspector-btn-sm ${e.action==="skip"?"primary":""}"
1303
+ data-asset-action="${t}" data-action="skip"
1304
+ title="Skip (save to library only)">
1305
+ \u23ED\uFE0F Do Nothing
1306
+ </button>
1307
+ </div>
1308
+ ${r}
1309
+ </div>
1310
+ `}renderReplaceDropdown(e,t){return this.replaceableObjects.length===0?'<div class="canva-asset-replace-hint">No replaceable objects found</div>':`
1311
+ <div class="canva-asset-replace" data-asset-replace="${t}">
1312
+ <label>Replace object:</label>
1313
+ <select class="inspector-input inspector-input-sm" data-asset-target="${t}">
1314
+ <option value="">Select object...</option>
1315
+ ${this.replaceableObjects.map(i=>`<option value="${i.id}" ${e.targetObjectId===i.id?"selected":""}>${i.name}</option>`).join("")}
1316
+ </select>
1317
+ </div>
1318
+ `}initialize(e,t,i,n){this.options=n,this.positionMap=hr(i),this.replaceableObjects=fr(),this.assets=t.map(a=>{let r=mr(a.filename,this.positionMap);return{filename:a.filename,dataUrl:a.dataUrl,category:this.inferCategory(a.filename),position:r==null?void 0:r.position,scale:r==null?void 0:r.scale,rotation:r==null?void 0:r.rotation,action:void 0,targetObjectId:void 0}}),e.innerHTML=this.render(),this.root=e.querySelector("[data-canva-wizard]"),this.attachEventListeners()}attachEventListeners(){var e,t,i;this.root&&((e=this.root.querySelector("[data-canva-wizard-close]"))==null||e.addEventListener("click",()=>{this.close()}),(t=this.root.querySelector("[data-canva-wizard-cancel]"))==null||t.addEventListener("click",()=>{this.close()}),(i=this.root.querySelector("[data-canva-wizard-apply-all]"))==null||i.addEventListener("click",()=>{this.applyAll()}),this.root.querySelectorAll("[data-asset-action]").forEach(n=>{n.addEventListener("click",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-action")||"0"),l=r.getAttribute("data-action");this.handleAction(o,l)})}),this.root.querySelectorAll("[data-asset-category]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-category")||"0"),l=r.value;this.assets[o]&&(this.assets[o].category=l)})}),this.root.querySelectorAll("[data-asset-target]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-target")||"0"),l=r.value;this.assets[o]&&(this.assets[o].targetObjectId=l)})}),this.root.addEventListener("click",n=>{n.target===this.root&&this.close()}))}handleAction(e,t){this.assets[e]&&(this.assets[e].action=t,t==="replace"?this.updateAssetCard(e):(this.assets[e].targetObjectId=void 0,this.updateAssetCard(e)))}updateAssetCard(e){var i,n;if(!this.root)return;let t=this.root.querySelector(`[data-asset-index="${e}"]`);if(t&&this.assets[e]){let a=this.assets[e],r=this.renderAssetCard(a,e);t.outerHTML=r;let o=this.root.querySelector(`[data-asset-index="${e}"]`);o&&(o.querySelectorAll("[data-asset-action]").forEach(l=>{l.addEventListener("click",c=>{let d=c.target,p=parseInt(d.getAttribute("data-asset-action")||"0"),u=d.getAttribute("data-action");this.handleAction(p,u)})}),(i=o.querySelector("[data-asset-category]"))==null||i.addEventListener("change",l=>{let d=l.target.value;this.assets[e]&&(this.assets[e].category=d)}),(n=o.querySelector("[data-asset-target]"))==null||n.addEventListener("change",l=>{let d=l.target.value;this.assets[e]&&(this.assets[e].targetObjectId=d)}))}}async applyAll(){if(this.options){for(let e of this.assets)e.action||(e.action="skip");this.processedCount=0,this.updateProgress();for(let e=0;e<this.assets.length;e++){let t=this.assets[e];try{let i=await this.saveAssetToLibrary(t);t.libraryPath=i,t.action==="add"?await this.addToScene(t):t.action==="replace"&&t.targetObjectId&&await this.replaceObject(t,t.targetObjectId),this.processedCount++,this.updateProgress()}catch(i){console.error(`[CanvaZip] Failed to process ${t.filename}:`,i)}}this.options.onComplete&&this.options.onComplete(this.assets),this.close()}}async saveAssetToLibrary(e){try{let i=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:e.category,filename:e.filename,data:e.dataUrl,overwrite:!0})})).json();if(i.success&&i.path)return console.log(`[CanvaZip] \u2705 Saved ${e.filename} to library: ${i.path}`),i.path;throw new Error(i.error||"Failed to save to library")}catch(t){throw console.error(`[CanvaZip] Failed to save ${e.filename} to library:`,t),t}}async addToScene(e){console.log(`[CanvaZip] Add to scene: ${e.filename}`,{position:e.position,scale:e.scale,category:e.category});let t=window.addObjectToScene;if(typeof t=="function")try{await t({filename:e.filename,libraryPath:e.libraryPath,position:e.position||{x:0,y:0},scale:e.scale||1,category:e.category}),console.log(`[CanvaZip] \u2705 Added ${e.filename} to scene`);return}catch(n){console.error("[CanvaZip] Failed to add object via API:",n)}console.warn(`[CanvaZip] Add To Scene feature requires backend API endpoint. Asset saved to library: ${e.libraryPath}`),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh"));let i=window.refreshAssetLibrary;typeof i=="function"&&i()}async replaceObject(e,t){let i=window.__debugContext;if(!i){console.warn("[CanvaZip] No debug context available for replace");return}try{await fi(i,t,e.filename,e.category),console.log(`[CanvaZip] \u2705 Replaced ${t} with ${e.filename}`)}catch(n){throw console.error(`[CanvaZip] Failed to replace ${t}:`,n),n}}updateProgress(){if(!this.root)return;let e=this.root.querySelector(".canva-wizard-progress-fill"),t=this.root.querySelector(".canva-wizard-progress-text");if(e){let i=this.processedCount/this.assets.length*100;e.style.width=`${i}%`}t&&(t.textContent=`${this.processedCount} of ${this.assets.length} assets processed`)}inferCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"environment"}close(){var e;(e=this.options)!=null&&e.onCancel&&this.options.onCancel(),this.root&&this.root.remove()}};var vi=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`
1234
1319
  <div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
1235
1320
  <div class="scene-panel-header" data-panel-handle>
1236
1321
  <div class="panel-title">
@@ -1346,15 +1431,15 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1346
1431
  </div>
1347
1432
  <div class="panel-resize-handle" data-panel-resize></div>
1348
1433
  </div>
1349
- `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,s,o,l,c,d,p,u,g,m;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 f=h.dataset.visionTab;this.switchTab(f)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let f=h.target.value;this.switchUploadMethod(f)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||f.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||f.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,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||f.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||f.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(m=this.root.querySelector("[data-vision-apply-all]"))==null||m.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let f=h.target;if(!f)return;let b=f.closest("[data-mapping-item]"),v=b==null?void 0:b.dataset.mappingItem;v&&(f.closest("[data-mapping-apply-one]")&&this.applyOne(v),f.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(v),f.closest("[data-mapping-edit-one]")&&this.openEditorForOne(v),f.closest("[data-mapping-generate-one]")&&this.generateOne(v),f.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let f=h.target;if(!f||!this.mappingResult)return;let b=f.closest("[data-mapping-item]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let x=this.mappingResult.mappings.find(y=>y.game_object===v);x&&(f.matches("[data-mapping-action]")&&(x.action=String(f.value||"KEEP"),x.status="Edited",this.renderMappings()),f.matches("[data-mapping-brand-asset]")&&(x.brand_asset=String(f.value||""),x.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let f=h.target;if(!f||!this.mappingResult||!f.matches("[data-mapping-prompt]"))return;let b=f.closest("[data-mapping-item]"),v=b==null?void 0:b.dataset.mappingItem;if(!v)return;let x=this.mappingResult.mappings.find(y=>y.game_object===v);x&&(x.generation_prompt=String(f.value||""),x.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var s,o;let t=await or.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let d=l.toLowerCase();d.endsWith(".json")?i.push({name:l,content:null}):d.startsWith("assets/")&&d.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((s=t.file(l.name))==null?void 0:s.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let a=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),d=new Blob([c],{type:"image/png"}),p=l.name.split("/").pop()||l.name;console.log(`Processing ${p}, uint8array length: ${c.length}, blob size: ${d.size}`);let u;try{u=await this.blobToDataUrl(d)}catch(f){console.warn(`FileReader failed for ${p}, using fallback:`,f),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${p}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(p.replace(".png",""));console.log(`Saving ${p} to category: ${g}`);let h=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:g,filename:p,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${p}:`,h),h.success){console.log(`\u2705 Saved PNG to library: ${p} (${g}) at ${h.path}`);let f=new File([d],p,{type:"image/png"});a.set(p,f)}else console.warn(`\u274C Failed to save ${p}:`,h.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=a;try{this.normalizedManifest=sn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[d,p]of a){let u=await this.fileToDataUrl(p);l.push({id:d.replace(".png",""),filename:d,dataUrl:u,category:this.inferAssetCategory(d.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
1350
- \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}
1351
- `:l.brand_dna||l.colors?n+=`\u2705 Brand: ${s.name}
1352
- `:n+=`\u2705 Loaded: ${s.name}
1353
- `}catch{n+=`\u274C Error in ${s.name}
1354
- `}try{this.normalizedManifest=sn(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+=`
1355
- \u{1F4E6} Normalized manifest: ${s} assets`,n+=`
1356
- \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+=`
1357
- \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 Re(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 d={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},p=await ar(d);this.mappingResult=p.mappingResult,this.analysisRawResponse=p.rawResponse,this.analysisParsedOk=p.parsed,this.analysisParseError=(s=p.parseError)!=null?s:null,this.renderMappings(),p.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(o=this.mappingResult)==null?void 0:o.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${p.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(d){console.error("[BrandVision] Analysis failed:",d),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await on(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?`
1434
+ `}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,r,o,l,c,d,p,u,g,h;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let m="/dashboard";window.location.pathname!==m&&(window.location.href=m)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(m=>{m.addEventListener("click",()=>{let f=m.dataset.visionTab;this.switchTab(f)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",m=>{let f=m.target.value;this.switchUploadMethod(f)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var m,f;(f=(m=this.root)==null?void 0:m.querySelector("[data-vision-manifest-input]"))==null||f.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var m,f;(f=(m=this.root)==null?void 0:m.querySelector("[data-vision-zip-input]"))==null||f.click()}),(r=this.root.querySelector("[data-vision-zip-input]"))==null||r.addEventListener("change",m=>{this.handleZipUpload(m)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",m=>{this.handleManifestUpload(m)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var m,f;(f=(m=this.root)==null?void 0:m.querySelector("[data-vision-assets-input]"))==null||f.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",m=>{this.handleAssetsUpload(m)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var m,f;(f=(m=this.root)==null?void 0:m.querySelector("[data-vision-flat-input]"))==null||f.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",m=>{this.handleFlatDesignUpload(m)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(h=this.root.querySelector("[data-vision-apply-all]"))==null||h.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",m=>{let f=m.target;if(!f)return;let v=f.closest("[data-mapping-item]"),b=v==null?void 0:v.dataset.mappingItem;b&&(f.closest("[data-mapping-apply-one]")&&this.applyOne(b),f.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(b),f.closest("[data-mapping-edit-one]")&&this.openEditorForOne(b),f.closest("[data-mapping-generate-one]")&&this.generateOne(b),f.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",m=>{let f=m.target;if(!f||!this.mappingResult)return;let v=f.closest("[data-mapping-item]"),b=v==null?void 0:v.dataset.mappingItem;if(!b)return;let w=this.mappingResult.mappings.find(y=>y.game_object===b);w&&(f.matches("[data-mapping-action]")&&(w.action=String(f.value||"KEEP"),w.status="Edited",this.renderMappings()),f.matches("[data-mapping-brand-asset]")&&(w.brand_asset=String(f.value||""),w.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",m=>{let f=m.target;if(!f||!this.mappingResult||!f.matches("[data-mapping-prompt]"))return;let v=f.closest("[data-mapping-item]"),b=v==null?void 0:v.dataset.mappingItem;if(!b)return;let w=this.mappingResult.mappings.find(y=>y.game_object===b);w&&(w.generation_prompt=String(f.value||""),w.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 l,c;let t=await wr.loadAsync(e),i=[],n=[];t.forEach((d,p)=>{let u=d.toLowerCase();u.endsWith(".json")?i.push({name:d,content:null}):u.startsWith("assets/")&&u.endsWith(".png")&&n.push({name:d,file:p})});for(let d of i)try{let p=await((l=t.file(d.name))==null?void 0:l.async("text"));p&&(d.content=JSON.parse(p))}catch(p){console.warn(`Failed to parse ${d.name}:`,p)}let a=[];for(let d of n)try{let p=await d.file.async("uint8array"),u=new Blob([p],{type:"image/png"}),g=d.name.split("/").pop()||d.name;console.log(`Processing ${g}, uint8array length: ${p.length}, blob size: ${u.size}`);let h;try{h=await this.blobToDataUrl(u)}catch(m){console.warn(`FileReader failed for ${g}, using fallback:`,m),h=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(p)))}`}if(!h.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${g}:`,h.substring(0,100));continue}a.push({filename:g,dataUrl:h})}catch(p){console.warn(`Failed to extract ${d.name}:`,p)}let r=null;for(let d of i){let p=d.name.toLowerCase();if(p.includes("positionnormalizedpack")||p.includes("positionnormalized")){r=d.content;break}}a.length>0&&await this.showCanvaZipWizard(a,r);let o=new Map;for(let d of a)try{let u=await(await fetch(d.dataUrl)).blob(),g=new File([u],d.filename,{type:"image/png"});o.set(d.filename,g)}catch(p){console.warn(`Failed to convert ${d.filename} to file:`,p)}this.uploadedJsons.clear(),i.forEach(({name:d,content:p})=>{p&&this.uploadedJsons.set(d,p)}),this.assetFiles=o;try{this.normalizedManifest=gn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let d=[];for(let[u,g]of o){let h=await this.fileToDataUrl(g);d.push({id:u.replace(".png",""),filename:u,dataUrl:h,category:this.inferAssetCategory(u.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=d);let p=d.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${p} PNGs
1435
+ \u{1F3F7}\uFE0F Brand: ${((c=this.normalizedManifest)==null?void 0:c.brand_name)||"Imported Brand"}`),this.addAssetsToRegistry(d),this.refreshLibrary()}catch(d){console.error("[BrandVision] Failed to normalize ZIP manifest:",d),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 showCanvaZipWizard(e,t){return new Promise((i,n)=>{let a=document.createElement("div");document.body.appendChild(a),new bi().initialize(a,e,t,{onComplete:o=>{console.log("[BrandVision] Wizard completed, processed assets:",o),a.remove(),i()},onCancel:()=>{console.log("[BrandVision] Wizard cancelled"),a.remove(),i()}})})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let r=a.category||"misc";n[r]||(n[r]=[]),i.libraryAssets[r]||(i.libraryAssets[r]=[]),i.libraryAssets[r].some(l=>l.filename===a.filename)||(i.libraryAssets[r].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 ${r}`))}}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 r of Array.from(i))try{let o=await r.text(),l=JSON.parse(o);this.uploadedJsons.set(r.name,l),l.layers?n+=`\u2705 Layers: ${r.name}
1436
+ `:l.brand_dna||l.colors?n+=`\u2705 Brand: ${r.name}
1437
+ `:n+=`\u2705 Loaded: ${r.name}
1438
+ `}catch{n+=`\u274C Error in ${r.name}
1439
+ `}try{this.normalizedManifest=gn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let r=Array.isArray((a=this.normalizedManifest)==null?void 0:a.assets)?this.normalizedManifest.assets.length:0;n+=`
1440
+ \u{1F4E6} Normalized manifest: ${r} assets`,n+=`
1441
+ \u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:r,brandName:this.normalizedManifest.brand_name})}catch(r){console.error("[BrandVision] Failed to normalize manifest:",r),this.normalizedManifest=null,n+=`
1442
+ \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,r;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await De(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let o=(r=this.root)==null?void 0:r.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,r,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 gr(t,this.assetFiles);let d={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},p=await pr(d);this.mappingResult=p.mappingResult,this.analysisRawResponse=p.rawResponse,this.analysisParsedOk=p.parsed,this.analysisParseError=(r=p.parseError)!=null?r:null,this.renderMappings(),p.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(o=this.mappingResult)==null?void 0:o.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${p.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(d){console.error("[BrandVision] Analysis failed:",d),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await hn(a,this.mappingResult,{onProgress:(r,o,l)=>{this.setStatus("apply",`Generating ${r}/${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(""),r=n?`
1358
1443
  <div class="vision-raw-block">
1359
1444
  <div class="inspector-text-sm" style="white-space: pre-wrap;">
1360
1445
  \u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
@@ -1363,8 +1448,8 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1363
1448
  <textarea class="inspector-input vision-raw-textarea" readonly>${this.analysisRawResponse||""}</textarea>
1364
1449
  </div>
1365
1450
  `:"";e.innerHTML=`
1366
- ${s}
1367
- ${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",d=l.brand_asset||"",p=(b=t==null?void 0:t.assets)==null?void 0:b.find(v=>v.id===d),u=(p==null?void 0:p.dataUrl)||"",g=l.output_dataUrl||"",m=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",h=!!m,f=`
1451
+ ${r}
1452
+ ${this.mappingResult.mappings.map(l=>{var v;let c=i[l.game_object]||"",d=l.brand_asset||"",p=(v=t==null?void 0:t.assets)==null?void 0:v.find(b=>b.id===d),u=(p==null?void 0:p.dataUrl)||"",g=l.output_dataUrl||"",h=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",m=!!h,f=`
1368
1453
  <select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
1369
1454
  <option value="">Select brand asset\u2026</option>
1370
1455
  ${a.replace(`value="${d}"`,`value="${d}" selected`)}
@@ -1405,7 +1490,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1405
1490
  </div>
1406
1491
  <div class="vision-mapping-preview">
1407
1492
  <div class="inspector-text-sm" style="opacity:0.8;">Preview</div>
1408
- ${h?`<img src="${m}">`:'<div class="inspector-text-sm" style="opacity:0.6;">None</div>'}
1493
+ ${m?`<img src="${h}">`:'<div class="inspector-text-sm" style="opacity:0.6;">None</div>'}
1409
1494
  </div>
1410
1495
  </div>
1411
1496
 
@@ -1416,8 +1501,8 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1416
1501
  </div>
1417
1502
  </div>
1418
1503
  `}).join("")}
1419
- `}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let s=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;s&&(await this.stageEngineAssetOverride(n,s),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(s=>s.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(s=>s.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,s;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(s=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:s.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let o={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await on(o,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(o){console.error("[BrandVision] generateOne failed:",o),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-V7DLPL5I.js");i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let s=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(s!=null&&s.success)||!(s!=null&&s.path))return console.error("[BrandVision] Save to library failed:",(s==null?void 0:s.error)||s),null;let o=window.addAssetToRegistry;typeof o=="function"&&o(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(s.path)}catch(a){return console.error("[BrandVision] Save to library error:",a),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let s=n.slots.find(o=>o.slotId===e||o.currentAsset===e);if(s!=null&&s.category)return String(s.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let s=e.toLowerCase(),o=l=>a.find(c=>c.toLowerCase().includes(l));return s.includes("bg")||s.includes("background")?o("background")||a[0]:(s.includes("cta")||s.includes("button")||s.includes("ui")||s.includes("logo"))&&o("ui")||a[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var a;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(a=this.root)==null?void 0:a.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,a=o=>{let l=Math.max(300,n+(o.clientX-i));this.root.style.width=`${l}px`},s=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",s)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",s)})}refresh(){}};function lr(r,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${r}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
1420
- `)}var Ss=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],As=["cta_hint","cta_label_end"],cr=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],Ts=["brand.primary","brand.heading","brand.body","brand.warning"],gi=class{constructor(){this.root=null;this.assetsContainer=null;this.colorsContainer=null;this.fontsContainer=null;this.textsContainer=null;this.audioContainer=null;this.options=null;this.previewModal=null;this.autoApplyTimer=null;this.activePreviewKey=null;this.activePreviewValue=null;this.activePreviewFileInput=null;this.retryTimer=null;this.aiModal=null;this.aiTargetKey=null;this.aiKeyInput=null;this.aiPromptInput=null;this.aiStrengthInput=null;this.aiStrengthValue=null;this.aiModelSelect=null;this.aiModalSubtitle=null;this.aiGalleryToggle=null;this.aiGalleryEl=null;this.aiGalleryGrid=null;this.aiReferenceInput=null;this.aiReferenceName=null;this.aiReferenceFile=null;this.aiRemoveBgToggle=null;this.aiUseOutputToggle=null;this.aiGenerateBtn=null;this.aiApplyBtn=null;this.aiSaveLibraryBtn=null;this.aiCropBtn=null;this.aiDownloadBtn=null;this.aiPreviewImg=null;this.aiStatusEl=null;this.aiOutputDataUrl=null;this.aiBaseDataUrl=null;this.aiBaseValue=null;this.aiOutputKey=null;this.aiContext=null;this.aiBgToleranceInput=null;this.aiBgToleranceValue=null;this.aiRawOutputDataUrl=null;this.aiLoadingEl=null}render(){return`
1504
+ `}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let r=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;r&&(await this.stageEngineAssetOverride(n,r),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(r=>r.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(r=>r.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,r;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(r=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:r.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let o={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await hn(o,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(o){console.error("[BrandVision] generateOne failed:",o),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-V7DLPL5I.js");i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let r=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(r!=null&&r.success)||!(r!=null&&r.path))return console.error("[BrandVision] Save to library failed:",(r==null?void 0:r.error)||r),null;let o=window.addAssetToRegistry;typeof o=="function"&&o(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(r.path)}catch(a){return console.error("[BrandVision] Save to library error:",a),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let r=n.slots.find(o=>o.slotId===e||o.currentAsset===e);if(r!=null&&r.category)return String(r.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let r=e.toLowerCase(),o=l=>a.find(c=>c.toLowerCase().includes(l));return r.includes("bg")||r.includes("background")?o("background")||a[0]:(r.includes("cta")||r.includes("button")||r.includes("ui")||r.includes("logo"))&&o("ui")||a[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var a;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(a=this.root)==null?void 0:a.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,a=o=>{let l=Math.max(300,n+(o.clientX-i));this.root.style.width=`${l}px`},r=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",r)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",r)})}refresh(){}};function xr(s,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${s}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
1505
+ `)}var js=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],_s=["cta_hint","cta_label_end"],Sr=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],Os=["brand.primary","brand.heading","brand.body","brand.warning"],yi=class{constructor(){this.root=null;this.assetsContainer=null;this.colorsContainer=null;this.fontsContainer=null;this.textsContainer=null;this.audioContainer=null;this.options=null;this.previewModal=null;this.autoApplyTimer=null;this.activePreviewKey=null;this.activePreviewValue=null;this.activePreviewFileInput=null;this.retryTimer=null;this.aiModal=null;this.aiTargetKey=null;this.aiKeyInput=null;this.aiPromptInput=null;this.aiStrengthInput=null;this.aiStrengthValue=null;this.aiModelSelect=null;this.aiModalSubtitle=null;this.aiGalleryToggle=null;this.aiGalleryEl=null;this.aiGalleryGrid=null;this.aiReferenceInput=null;this.aiReferenceName=null;this.aiReferenceFile=null;this.aiRemoveBgToggle=null;this.aiUseOutputToggle=null;this.aiGenerateBtn=null;this.aiApplyBtn=null;this.aiSaveLibraryBtn=null;this.aiCropBtn=null;this.aiDownloadBtn=null;this.aiPreviewImg=null;this.aiStatusEl=null;this.aiOutputDataUrl=null;this.aiBaseDataUrl=null;this.aiBaseValue=null;this.aiOutputKey=null;this.aiContext=null;this.aiBgToleranceInput=null;this.aiBgToleranceValue=null;this.aiRawOutputDataUrl=null;this.aiLoadingEl=null}render(){return`
1421
1506
  <div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
1422
1507
  <div class="scene-panel-header" data-panel-handle>
1423
1508
  <div class="panel-title">
@@ -1475,7 +1560,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1475
1560
  </div>
1476
1561
  <div class="panel-resize-handle" data-panel-resize></div>
1477
1562
  </div>
1478
- `}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=`
1563
+ `}initialize(e,t){var n,a,r,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=(r=this.root)==null?void 0:r.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 r=t(a);r&&(r.ui||(r.ui={}),r.ui.renderMode=e?"png":"text",e&&(r.render||(r.render={}),r.render.asset||(r.render.asset={type:"image",path:""}),r.render.asset.type="image"),i(a,r))}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,r,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=(r=e.runtime)==null?void 0:r.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 r=document.createElement("span");r.className="customize-key",r.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=`
1479
1564
  <svg viewBox="0 0 24 24" aria-hidden="true">
1480
1565
  <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" />
1481
1566
  <circle cx="12" cy="12" r="3.2" />
@@ -1485,7 +1570,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1485
1570
  <path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
1486
1571
  <path d="M5 14v4h14v-4h2v6H3v-6h2z" />
1487
1572
  </svg>
1488
- `;let p=document.createElement("input");p.type="file",p.accept="image/*,audio/*,application/json",p.className="customize-file",p.addEventListener("change",()=>{var m;let g=(m=p.files)==null?void 0:m[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>p.click()),l.appendChild(c),l.appendChild(d),l.appendChild(p),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,d;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let s=document.createElement("input");s.type="color",s.value=i,s.dataset.colorKey=t;let 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),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Ts.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 d=parseFloat(l.value);s[c]=isNaN(d)?0:d}else s[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let d=cr.find(p=>p.key===c);d&&this.applyObjectPropertyValue(d.objectId,d.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:s}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await di(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,d,p,u,g,m,h,f;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
1573
+ `;let p=document.createElement("input");p.type="file",p.accept="image/*,audio/*,application/json",p.className="customize-file",p.addEventListener("change",()=>{var h;let g=(h=p.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>p.click()),l.appendChild(c),l.appendChild(d),l.appendChild(p),a.appendChild(r),a.appendChild(o),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",js.forEach(t=>{var l,c,d;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let r=document.createElement("input");r.type="color",r.value=i,r.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=i,o.className="customize-color-text",o.dataset.colorTextKey=t,r.addEventListener("input",()=>{o.value=r.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(r.value=o.value)}),n.appendChild(a),n.appendChild(r),n.appendChild(o),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Os.forEach(t=>{var r,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=(r=e==null?void 0:e[t])!=null?r: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="",_s.forEach(t=>{var r,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=(r=this.readUiValue(e,t))!=null?r:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(o=this.textsContainer)==null||o.appendChild(i)}),Sr.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 r=document.createElement("input");r.type="text",r.value=(o=this.getObjectTextValue(i))!=null?o:"",r.className="customize-input",r.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(r),(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 r=document.createElement("input");r.type=i.includes("volume")?"number":"text",r.min="0",r.max="1",r.step="0.1",r.value=String((o=e==null?void 0:e[i])!=null?o:""),r.className="customize-input",r.dataset.audioKey=i,i.includes("file")&&(r.placeholder="audio file path"),n.appendChild(a),n.appendChild(r),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let r of n){if(a==null)return null;a=a[r]}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("."),r=n;for(let o of a){if(r==null)return null;r=r[o]}return typeof r=="string"?r: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 r={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let d=parseFloat(l.value);r[c]=isNaN(d)?0:d}else r[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let d=Sr.find(p=>p.key===c);d&&this.applyObjectPropertyValue(d.objectId,d.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:r}},{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 gi(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,r;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=(r=i==null?void 0:i.dataUrl)!=null?r: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 r=this.resolveAssetUrls(i);r[0]&&(a.src=r[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 r,o;let i=t,n=i.dataset.assetKey,a=(o=(r=i.value)==null?void 0:r.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,d,p,u,g,h,m,f;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
1489
1574
  <div class="ai-modal-card">
1490
1575
  <div class="ai-modal-header">
1491
1576
  <div>
@@ -1556,7 +1641,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1556
1641
  </div>
1557
1642
  </div>
1558
1643
  </div>
1559
- `;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let s=n.querySelector("[data-ai-ref-button]");s==null||s.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var v,x;let b=(x=(v=this.aiStrengthInput)==null?void 0:v.value)!=null?x:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var v,x;let b=(x=(v=this.aiBgToleranceInput)==null?void 0:v.value)!=null?x:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var v,x,y;let b=(y=(x=(v=this.aiReferenceInput)==null?void 0:v.files)==null?void 0:x[0])!=null?y: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()),(m=this.aiSaveLibraryBtn)==null||m.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(h=this.aiCropBtn)==null||h.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,m,h,f,b,v,x,y,w,I,R,k,j,_,C,A,L;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(m=(g=this.aiModelSelect)==null?void 0:g.value)!=null?m:"gemini-2.5-flash-image",i=(b=(f=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:f.trim())!=null?b:"",n=(x=(v=this.aiRemoveBgToggle)==null?void 0:v.checked)!=null?x:!1,a=n,s=n,o=Number((w=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?w:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((I=l==null?void 0:l.value)==null?void 0:I.trim())||((R=this.aiBaseValue)==null?void 0:R.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let T=null,S=(k=this.getSelectedAssetKey())!=null?k:"unknown",E=(j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((_=this.aiUseOutputToggle)!=null&&_.checked&&this.aiOutputDataUrl){let B=an(this.aiOutputDataUrl,"ai-output.png");if(B){let U=await Re(B);U&&(T={input:{base64:U.base64,mimeType:U.mimeType},dataUrl:U.dataUrl,width:U.width,height:U.height})}}if(T||(T=await this.getImageDataFromAsset(c)),!T){this.setAiStatus("Unable to load the base image.");return}let P=[T.input],M=!1;if(this.aiReferenceFile){let B=await Re(this.aiReferenceFile);B?(P.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 O=lr(i,{includeReference:M,includeMagenta:a,changeLevel:o}),D=(A=(C=this.aiReferenceFile)==null?void 0:C.name)!=null?A:"none";console.info("[AI] Final prompt:",O),console.info("[AI] Image sources:",{assetKey:S,base:E,reference:D});let N=Za(T.width,T.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await Ze(e,O,P,{aspectRatio:N,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,await this.refreshAiOutputFromRaw()}catch(T){console.error("[CustomizePanel] AI Generate Error:",T),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((L=this.aiStatusEl)==null?void 0:L.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,s,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Je(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),s=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&s)console.log("[CustomizePanel] Applying AI output directly to object:",a,s),this.applyObjectPropertyValue(a,s,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,s,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),m=((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&&m){console.log("[CustomizePanel] Applying saved asset to object:",g,m);let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(m)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&v){let x=this.getFilenameFromPath(c.path);await b(g,x,n)}else this.applyObjectPropertyValue(g,m,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{f(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var s;let t=(s=this.aiContext)==null?void 0:s.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let 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=an(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let s=await nn(a);s&&this.setAiOutput(s)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let d=await this.getImageDimensions(n);if(d){let p=await this.showManualCropModal(e,d,n);if(!p)return;a=p}}let s=await nn(a);if(!s){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:s,overwrite:!0})})).json();if(p.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",p.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=p.path,this.handleAssetValueChange(i,t);let m=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(m&&h){let b=window.applyAssetToSlot,v=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(p.path||""));if(typeof b=="function"&&v){let x=this.getFilenameFromPath(p.path);await b(m,x,c)}else this.applyObjectPropertyValue(m,h,p.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&m&&setTimeout(()=>{f(m,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",p.error),alert(`Failed to save uploaded file: ${p.error}`)}catch(d){console.error("[CustomizePanel] \u274C Upload error:",d),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let s=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,s)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1644
+ `;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",v=>{v.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 r=n.querySelector("[data-ai-ref-button]");r==null||r.addEventListener("click",()=>{var v;return(v=this.aiReferenceInput)==null?void 0:v.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var b,w;let v=(w=(b=this.aiStrengthInput)==null?void 0:b.value)!=null?w:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=v)}),(d=this.aiBgToleranceInput)==null||d.addEventListener("input",()=>{var b,w;let v=(w=(b=this.aiBgToleranceInput)==null?void 0:b.value)!=null?w:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=v),this.refreshAiOutputFromRaw()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var b,w,y;let v=(y=(w=(b=this.aiReferenceInput)==null?void 0:b.files)==null?void 0:w[0])!=null?y:null;this.aiReferenceFile=v,this.aiReferenceName&&(this.aiReferenceName.textContent=v?`${v.name} (loaded)`:"Optional"),v&&this.setAiStatus(`Reference attached: ${v.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(m=this.aiCropBtn)==null||m.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,h,m,f,v,b,w,y,x,I,j,T,_,O,L,A,k;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(v=(f=(m=this.aiPromptInput)==null?void 0:m.value)==null?void 0:f.trim())!=null?v:"",n=(w=(b=this.aiRemoveBgToggle)==null?void 0:b.checked)!=null?w:!1,a=n,r=n,o=Number((x=(y=this.aiStrengthInput)==null?void 0:y.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=((I=l==null?void 0:l.value)==null?void 0:I.trim())||((j=this.aiBaseValue)==null?void 0:j.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let C=null,E=(T=this.getSelectedAssetKey())!=null?T:"unknown",S=(_=this.aiUseOutputToggle)!=null&&_.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl){let F=pn(this.aiOutputDataUrl,"ai-output.png");if(F){let G=await De(F);G&&(C={input:{base64:G.base64,mimeType:G.mimeType},dataUrl:G.dataUrl,width:G.width,height:G.height})}}if(C||(C=await this.getImageDataFromAsset(c)),!C){this.setAiStatus("Unable to load the base image.");return}let M=[C.input],P=!1;if(this.aiReferenceFile){let F=await De(this.aiReferenceFile);F?(M.push({base64:F.base64,mimeType:F.mimeType}),P=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let R=xr(i,{includeReference:P,includeMagenta:a,changeLevel:o}),D=(A=(L=this.aiReferenceFile)==null?void 0:L.name)!=null?A:"none";console.info("[AI] Final prompt:",R),console.info("[AI] Image sources:",{assetKey:E,base:S,reference:D});let N=rr(C.width,C.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await at(e,R,M,{aspectRatio:N,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,await this.refreshAiOutputFromRaw()}catch(C){console.error("[CustomizePanel] AI Generate Error:",C),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((k=this.aiStatusEl)==null?void 0:k.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,r,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(r=this.aiBgToleranceInput)==null?void 0:r.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await nt(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||""),r=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&r)console.log("[CustomizePanel] Applying AI output directly to object:",a,r),this.applyObjectPropertyValue(a,r,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,r,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(v){console.warn("[CustomizePanel] Setup-library endpoint not available:",v)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),h=((r=this.aiContext)==null?void 0:r.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((o=m.dataset.assetKey)!=null?o:"",m)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let v=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof v=="function"&&b){let w=this.getFilenameFromPath(c.path);await v(g,w,n)}else this.applyObjectPropertyValue(g,h,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{f(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var r;let t=(r=this.aiContext)==null?void 0:r.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(r=>r.currentAsset===e||r.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=pn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let r=await dn(a);r&&this.setAiOutput(r)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let d=await this.getImageDimensions(n);if(d){let p=await this.showManualCropModal(e,d,n);if(!p)return;a=p}}let r=await dn(a);if(!r){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",p.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(v){console.warn("[CustomizePanel] Setup-library not available:",v)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=p.path,this.handleAssetValueChange(i,t);let h=this.inferObjectIdFromAssetKey(i),m=this.inferPathFromAssetKey(i);if(h&&m){let v=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(m)||/\\.(png|jpg|jpeg)$/i.test(String(p.path||""));if(typeof v=="function"&&b){let w=this.getFilenameFromPath(p.path);await v(h,w,c)}else this.applyObjectPropertyValue(h,m,p.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&h&&setTimeout(()=>{f(h,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",p.error),alert(`Failed to save uploaded file: ${p.error}`)}catch(d){console.error("[CustomizePanel] \u274C Upload error:",d),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let r=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,r)}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=`
1560
1645
  <div class="asset-preview-card">
1561
1646
  <div class="asset-preview-header">
1562
1647
  <div class="asset-preview-title">${e}</div>
@@ -1572,7 +1657,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1572
1657
  <img class="asset-preview-ai-image" alt="AI output preview">
1573
1658
  </div>
1574
1659
  </div>
1575
- `;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"),d=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",p=>{p.target===a&&this.closePreviewModal()}),s)if(n==="image"){let p=document.createElement("img");this.loadWithFallback(p,i),s.appendChild(p)}else if(n==="audio"){let p=document.createElement("audio");p.controls=!0,this.loadWithFallback(p,i),s.appendChild(p)}else if(n==="json"){let p=document.createElement("pre");this.fetchWithFallback(i).then(u=>{p.textContent=u!=null?u:"Unable to load JSON."}),s.appendChild(p)}else{let p=document.createElement("a");p.href=i[0],p.target="_blank",p.rel="noreferrer",p.textContent="Open asset",s.appendChild(p)}document.body.appendChild(a),this.previewModal=a,this.updateAiModalPreview(d,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="function")return;let s=n(e);if(!s)return;let o=JSON.parse(JSON.stringify(s)),l=t.split("."),c=o;for(let d=0;d<l.length-1;d++){let p=l[d];c[p]=c[p]||{},c=c[p]}c[l[l.length-1]]=i,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,d=m=>{let h=m.clientX-s,f=Math.min(c,Math.max(l,o+h));this.root&&(this.root.style.width=`${f}px`)},p=()=>{var h,f;window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p);let m=(f=(h=this.root)==null?void 0:h.getBoundingClientRect().width)!=null?f:0;m>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(m)))};window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,a=URL.createObjectURL(e),s=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 d=Math.min(860,window.innerWidth-60),m=Math.max(220,Math.floor((d-32-16)/2)),h=Math.min(520,window.innerHeight-240),f=m,b=f/n;b>h&&(b=h,f=b*n),c.innerHTML=`
1660
+ `;let r=a.querySelector(".asset-preview-body"),o=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),d=a.querySelector("[data-asset-ai-preview]");if(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",p=>{p.target===a&&this.closePreviewModal()}),r)if(n==="image"){let p=document.createElement("img");this.loadWithFallback(p,i),r.appendChild(p)}else if(n==="audio"){let p=document.createElement("audio");p.controls=!0,this.loadWithFallback(p,i),r.appendChild(p)}else if(n==="json"){let p=document.createElement("pre");this.fetchWithFallback(i).then(u=>{p.textContent=u!=null?u:"Unable to load JSON."}),r.appendChild(p)}else{let p=document.createElement("a");p.href=i[0],p.target="_blank",p.rel="noreferrer",p.textContent="Open asset",r.appendChild(p)}document.body.appendChild(a),this.previewModal=a,this.updateAiModalPreview(d,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="function")return;let r=n(e);if(!r)return;let o=JSON.parse(JSON.stringify(r)),l=t.split("."),c=o;for(let d=0;d<l.length-1;d++){let p=l[d];c[p]=c[p]||{},c=c[p]}c[l[l.length-1]]=i,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 r=a.clientX,o=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,d=h=>{let m=h.clientX-r,f=Math.min(c,Math.max(l,o+m));this.root&&(this.root.style.width=`${f}px`)},p=()=>{var m,f;window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p);let h=(f=(m=this.root)==null?void 0:m.getBoundingClientRect().width)!=null?f:0;h>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(h)))};window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,a=URL.createObjectURL(e),r=await this.loadImage(a);try{URL.revokeObjectURL(a)}catch{}if(!(r!=null&&r.naturalWidth)||!(r!=null&&r.naturalHeight))return null;let o=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let d=Math.min(860,window.innerWidth-60),h=Math.max(220,Math.floor((d-32-16)/2)),m=Math.min(520,window.innerHeight-240),f=h,v=f/n;v>m&&(v=m,f=v*n),c.innerHTML=`
1576
1661
  <div class="asset-crop-card" style="width:${d}px;">
1577
1662
  <div class="asset-crop-header">
1578
1663
  <div>
@@ -1584,11 +1669,11 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1584
1669
  <div class="asset-crop-body">
1585
1670
  <div class="asset-crop-column">
1586
1671
  <div class="asset-crop-label">Crop</div>
1587
- <canvas class="asset-crop-canvas" width="${Math.round(f)}" height="${Math.round(b)}"></canvas>
1672
+ <canvas class="asset-crop-canvas" width="${Math.round(f)}" height="${Math.round(v)}"></canvas>
1588
1673
  </div>
1589
1674
  <div class="asset-crop-column">
1590
1675
  <div class="asset-crop-label">Compare</div>
1591
- <canvas class="asset-crop-preview" width="${Math.round(f)}" height="${Math.round(b)}"></canvas>
1676
+ <canvas class="asset-crop-preview" width="${Math.round(f)}" height="${Math.round(v)}"></canvas>
1592
1677
  </div>
1593
1678
  </div>
1594
1679
  <div class="asset-crop-controls">
@@ -1602,7 +1687,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1602
1687
  <button class="asset-crop-apply" type="button">Apply Crop</button>
1603
1688
  </div>
1604
1689
  </div>
1605
- `;let v=c.querySelector(".asset-crop-canvas"),x=c.querySelector(".asset-crop-preview"),y=c.querySelector(".asset-crop-zoom"),w=c.querySelector(".asset-crop-zoom-value"),I=c.querySelector(".asset-crop-close"),R=c.querySelector(".asset-crop-cancel"),k=c.querySelector(".asset-crop-apply"),j=c.querySelector(".asset-crop-reset");if(!v||!x||!y||!w){l(null);return}let _=v.getContext("2d"),C=x.getContext("2d");if(!_||!C){l(null);return}let A=s.naturalWidth,L=s.naturalHeight,T=Math.max(v.width/A,v.height/L),S=1,E=0,P=0,M=!1,O=0,D=0,N=0,H=0,B=()=>{let $=T*S,Z=Math.max(0,(A*$-v.width)/2),le=Math.max(0,(L*$-v.height)/2);E=Math.min(Z,Math.max(-Z,E)),P=Math.min(le,Math.max(-le,P))},U=()=>{let $=T*S;_.clearRect(0,0,v.width,v.height);let Z=v.width/2-A*$/2+E,le=v.height/2-L*$/2+P;if(_.drawImage(s,Z,le,A*$,L*$),C.clearRect(0,0,x.width,x.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let G=Math.max(x.width/o.naturalWidth,x.height/o.naturalHeight),ee=x.width/2-o.naturalWidth*G/2,K=x.height/2-o.naturalHeight*G/2;C.drawImage(o,ee,K,o.naturalWidth*G,o.naturalHeight*G)}else C.fillStyle="rgba(255, 255, 255, 0.04)",C.fillRect(0,0,x.width,x.height),C.strokeStyle="rgba(255, 255, 255, 0.08)",C.strokeRect(4,4,x.width-8,x.height-8);let ge=x.width/v.width*(T*S),ce=E*(x.width/v.width),be=P*(x.height/v.height),Se=x.width/2-A*ge/2+ce,Ae=x.height/2-L*ge/2+be;C.save(),C.globalAlpha=.7,C.drawImage(s,Se,Ae,A*ge,L*ge),C.restore()},W=()=>{E=0,P=0,B(),U()};y.addEventListener("input",()=>{S=Number(y.value),w.textContent=`${S.toFixed(2)}\xD7`,B(),U()}),v.addEventListener("pointerdown",$=>{M=!0,O=$.clientX,D=$.clientY,N=E,H=P,v.setPointerCapture($.pointerId)}),v.addEventListener("pointermove",$=>{M&&(E=N+($.clientX-O),P=H+($.clientY-D),B(),U())}),v.addEventListener("pointerup",$=>{M=!1,v.releasePointerCapture($.pointerId)}),v.addEventListener("pointerleave",()=>{M=!1});let Q=()=>{c.remove()},ie=()=>{Q(),l(null)},oe=async()=>{let $=document.createElement("canvas");$.width=t.width,$.height=t.height;let Z=$.getContext("2d");if(!Z){Q(),l(null);return}let le=S,ce=Math.max($.width/A,$.height/L)*le,be=$.width/v.width,Se=E*be,Ae=P*be,G=$.width/2-A*ce/2+Se,ee=$.height/2-L*ce/2+Ae;Z.drawImage(s,G,ee,A*ce,L*ce);let K=await new Promise(ae=>{$.toBlob(Ie=>ae(Ie),e.type||"image/png")});if(Q(),!K){l(null);return}l(new File([K],e.name,{type:K.type}))};I==null||I.addEventListener("click",ie),R==null||R.addEventListener("click",ie),j==null||j.addEventListener("click",W),k==null||k.addEventListener("click",()=>{oe()}),c.addEventListener("click",$=>{$.target===c&&ie()}),document.body.appendChild(c),W()})}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 hi=class{constructor(){this.root=null;this.options=null}render(){return`
1690
+ `;let b=c.querySelector(".asset-crop-canvas"),w=c.querySelector(".asset-crop-preview"),y=c.querySelector(".asset-crop-zoom"),x=c.querySelector(".asset-crop-zoom-value"),I=c.querySelector(".asset-crop-close"),j=c.querySelector(".asset-crop-cancel"),T=c.querySelector(".asset-crop-apply"),_=c.querySelector(".asset-crop-reset");if(!b||!w||!y||!x){l(null);return}let O=b.getContext("2d"),L=w.getContext("2d");if(!O||!L){l(null);return}let A=r.naturalWidth,k=r.naturalHeight,C=Math.max(b.width/A,b.height/k),E=1,S=0,M=0,P=!1,R=0,D=0,N=0,H=0,F=()=>{let $=C*E,Z=Math.max(0,(A*$-b.width)/2),le=Math.max(0,(k*$-b.height)/2);S=Math.min(Z,Math.max(-Z,S)),M=Math.min(le,Math.max(-le,M))},G=()=>{let $=C*E;O.clearRect(0,0,b.width,b.height);let Z=b.width/2-A*$/2+S,le=b.height/2-k*$/2+M;if(O.drawImage(r,Z,le,A*$,k*$),L.clearRect(0,0,w.width,w.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let q=Math.max(w.width/o.naturalWidth,w.height/o.naturalHeight),ee=w.width/2-o.naturalWidth*q/2,K=w.height/2-o.naturalHeight*q/2;L.drawImage(o,ee,K,o.naturalWidth*q,o.naturalHeight*q)}else L.fillStyle="rgba(255, 255, 255, 0.04)",L.fillRect(0,0,w.width,w.height),L.strokeStyle="rgba(255, 255, 255, 0.08)",L.strokeRect(4,4,w.width-8,w.height-8);let ge=w.width/b.width*(C*E),ce=S*(w.width/b.width),be=M*(w.height/b.height),Ce=w.width/2-A*ge/2+ce,Te=w.height/2-k*ge/2+be;L.save(),L.globalAlpha=.7,L.drawImage(r,Ce,Te,A*ge,k*ge),L.restore()},Y=()=>{S=0,M=0,F(),G()};y.addEventListener("input",()=>{E=Number(y.value),x.textContent=`${E.toFixed(2)}\xD7`,F(),G()}),b.addEventListener("pointerdown",$=>{P=!0,R=$.clientX,D=$.clientY,N=S,H=M,b.setPointerCapture($.pointerId)}),b.addEventListener("pointermove",$=>{P&&(S=N+($.clientX-R),M=H+($.clientY-D),F(),G())}),b.addEventListener("pointerup",$=>{P=!1,b.releasePointerCapture($.pointerId)}),b.addEventListener("pointerleave",()=>{P=!1});let Q=()=>{c.remove()},ie=()=>{Q(),l(null)},oe=async()=>{let $=document.createElement("canvas");$.width=t.width,$.height=t.height;let Z=$.getContext("2d");if(!Z){Q(),l(null);return}let le=E,ce=Math.max($.width/A,$.height/k)*le,be=$.width/b.width,Ce=S*be,Te=M*be,q=$.width/2-A*ce/2+Ce,ee=$.height/2-k*ce/2+Te;Z.drawImage(r,q,ee,A*ce,k*ce);let K=await new Promise(ae=>{$.toBlob(_e=>ae(_e),e.type||"image/png")});if(Q(),!K){l(null);return}l(new File([K],e.name,{type:K.type}))};I==null||I.addEventListener("click",ie),j==null||j.addEventListener("click",ie),_==null||_.addEventListener("click",Y),T==null||T.addEventListener("click",()=>{oe()}),c.addEventListener("click",$=>{$.target===c&&ie()}),document.body.appendChild(c),Y()})}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 wi=class{constructor(){this.root=null;this.options=null}render(){return`
1606
1691
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
1607
1692
  <div class="scene-panel-header" data-panel-handle>
1608
1693
  <div class="panel-title">
@@ -1668,10 +1753,10 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1668
1753
  </div>
1669
1754
  </div>
1670
1755
  </div>
1671
- `}initialize(e,t){var v,x,y,w,I,R,k,j,_,C,A,L,T,S,E,P;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var O;let M=window.getEditableEngineConfig;if(typeof M=="function"){let D=M();return(O=D==null?void 0:D.loading)!=null?O:{}}return{}})(),a=(v=this.root)==null?void 0:v.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{type:a.value}),this.updateFieldVisibility(a.value)}));let s=(x=this.root)==null?void 0:x.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{background_color:s.value})}));let o=(y=this.root)==null?void 0:y.querySelector("#loading-overlay-alpha"),l=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((I=n.overlay_alpha)!=null?I:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var O,D;let M=Number(o.value);l&&(l.textContent=M.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{overlay_alpha:M})}));let c=(R=this.root)==null?void 0:R.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{text:c.value})}));let d=(k=this.root)==null?void 0:k.querySelector("#loading-text-scale"),p=(j=this.root)==null?void 0:j.querySelector("#loading-text-scale-value");d&&(d.value=String((_=n.text_scale)!=null?_:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var O,D;let M=Number(d.value);p&&(p.textContent=M.toFixed(2)),(D=(O=this.options)==null?void 0:O.onUpdateLoading)==null||D.call(O,{text_scale:M})}));let u=(C=this.root)==null?void 0:C.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{enabled:u.checked})}));let g=(A=this.root)==null?void 0:A.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{blur_enabled:g.checked})}));let m=(L=this.root)==null?void 0:L.querySelector("#loading-blur-strength"),h=(T=this.root)==null?void 0:T.querySelector("#loading-blur-strength-value");m&&(m.value=String((S=n.blur_strength)!=null?S:8),h&&(h.textContent=m.value),m.addEventListener("input",()=>{var M,O;h&&(h.textContent=m.value),(O=(M=this.options)==null?void 0:M.onUpdateLoading)==null||O.call(M,{blur_strength:Number(m.value)})}));let f=(E=this.root)==null?void 0:E.querySelector("#loading-show-btn"),b=(P=this.root)==null?void 0:P.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onShowLoadingScreen)==null||O.call(M)}),b==null||b.addEventListener("click",()=>{var M,O;(O=(M=this.options)==null?void 0:M.onHideLoadingScreen)==null||O.call(M)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};import{Assets as mi}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 mi.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)ye[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let m=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;m!=null&&m.texture&&(m.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(f=>f.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let p=await mi.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),m=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of m)ye[f]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let h=window.gameObjectManager;if(h)for(let f of m){let b=h.get(f);if(b){let v=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;v!=null&&v.texture&&(v.texture=p,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function ur(r,e,t,i){var n,a,s,o,l,c,d,p,u,g,m,h,f,b,v;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let x=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",x);let y=Date.now(),w=`/raw/library/${i}/${t}?t=${y}`;console.log("[LIBRARY] Loading texture from:",w);let I=await mi.load(w);if(!I){console.error("[LIBRARY] Failed to load texture:",w);return}console.log("[LIBRARY] \u2705 Texture loaded"),ye[x]=I,console.log("[LIBRARY] \u2705 Updated AssetTextures."+x);let R=window.CustomAssets;R!=null&&R[x]&&(R[x].texture=I,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+x));let k=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!k),k){let _=Array.from(((n=k.keys)==null?void 0:n.call(k))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",_);let C=k.get(x);if(console.log("[LIBRARY] gameObject for "+x+"?",!!C),C){let A=((a=C.getDisplayObject)==null?void 0:a.call(C))||C.pixiObject||C.pixi||C,L=(s=A==null?void 0:A.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",A),console.log("[LIBRARY] displayObject type:",L),console.log("[LIBRARY] has texture?",!!(A!=null&&A.texture)),A!=null&&A.texture)A.texture=I,console.log("[LIBRARY] \u2705 Applied to display object:",x);else if(L==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:T}=await import("pixi.js"),S=A.parent,E=(l=(o=S==null?void 0:S.getChildIndex)==null?void 0:o.call(S,A))!=null?l:0,P={x:A.x,y:A.y},M={x:(d=(c=A.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=A.anchor)==null?void 0:p.y)!=null?u:.5},O={x:(m=(g=A.scale)==null?void 0:g.x)!=null?m:1,y:(f=(h=A.scale)==null?void 0:h.y)!=null?f:1},D=(b=A.alpha)!=null?b:1,N=(v=A.visible)!=null?v:!0,H=new T(I);H.anchor.set(M.x,M.y),H.position.set(P.x,P.y),H.scale.set(O.x,O.y),H.alpha=D,H.visible=N,S&&(S.removeChild(A),S.addChildAt(H,E),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(A!=null&&A.children){let T=A.children.find(S=>S.texture);T?(T.texture=I,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let j=`raw/library/${i}/${t}`;gt({objectId:x,path:"render.asset.path",value:j}),console.log("[LIBRARY] \u2705 Staged config override for:",x,"path:",j)}catch(x){console.error("[LIBRARY] Error applying slot asset:",x)}}async function gr(r,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,s=Date.now(),o=`/raw/${t}?t=${s}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await mi.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}ye[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let d=window.gameObjectManager;if(d){let p=d.get(a);if(p){let u=((n=p.getDisplayObject)==null?void 0:n.call(p))||p.pixiObject||p;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",a))}}gt({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}import{Graphics as vr,Point as Cs}from"pixi.js";import{Point as hr}from"pixi.js";var ze=()=>window.debugConfig||{},mr=()=>window.resolveAnchorVec2||(r=>({x:.5,y:.5})),fr=()=>window.resolveScreenAnchorPoint||(()=>new hr),br=()=>window.resolveScreenRatioPoint||(()=>new hr);function yr(r){fi(r)&&(r.objectDebugRaf||(r.objectDebugRaf=window.requestAnimationFrame(()=>bi(r))))}function xr(r){r.objectDebugRaf&&(window.cancelAnimationFrame(r.objectDebugRaf),r.objectDebugRaf=null),vt(r)}function fi(r){return r.isDebugOpen}function bi(r){var a,s,o;if(!fi(r)){r.objectDebugRaf=null;return}r.objectDebugRaf=window.requestAnimationFrame(()=>bi(r));let e=ln(r);if(!e){bt(r,null),vt(r);return}let t=cn(r,e);if(!t){bt(r,null),vt(r);return}let i=new Cs;(a=t.getGlobalPosition)==null||a.call(t,i);let n=dn(r,t);bt(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?hn(r,t):fn(r),r.highlightAnchor&&n?mn(r,n):bn(r)}function ln(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 cn(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 yt(r){let e=r.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function dn(r,e){var s,o;let t=yt(r);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=pn(r);if(!n)return null;if(i.position_ratio!=null)return br()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return fr()(n.width,n.height,a)}function pn(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 un(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 gn(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 hn(r,e){var n;let t=un(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 mn(r,e){let t=gn(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 bn(r){r.objectAnchorGfx&&r.objectAnchorGfx.clear()}function vt(r){r.objectBoundsGfx&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectAnchorGfx&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null)}function bt(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 vn(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 yi(r){let e=ze();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function Sr(r){window.location.reload()}function xi(r){let e=JSON.stringify(ze(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function Ar(r,e){var t,i,n;if(!(!r.configViewer||!r.container))try{let a=window.getEditableObjectConfig,s=typeof a=="function"?a(e):null;if(!s){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-3JDCJ3GB.js"),p=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!p)return;let u=await l(p.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),vi(r,u),(i=r.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),vi(r,s),(n=r.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function vi(r,e){var p,u,g,m,h,f,b,v,x,y;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=vn(e)?(p=e.transform)==null?void 0:p.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((m=l==null?void 0:l.y)!=null?m:0)),n&&(n.value=String((f=(h=e.transform)==null?void 0:h.scale)!=null?f:1));let c=(y=(x=(b=e.transform)==null?void 0:b.anchor)!=null?x:(v=e.render)==null?void 0:v.anchor)!=null?y:{x:.5,y:.5},d=mr()(c);a&&(a.value=String(d.x)),s&&(s.value=String(d.y))}function Tr(r){var l,c,d,p,u,g,m,h,f,b;let e=r.selectedObjectId;if(!e||!r.container)return;let t=(c=(l=r.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=r.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=r.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(h=(m=r.container.querySelector("#config-anchor-x"))==null?void 0:m.value)!=null?h:"0.5",s=(b=(f=r.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?b:"0.5",o=`${e}:
1756
+ `}initialize(e,t){var b,w,y,x,I,j,T,_,O,L,A,k,C,E,S,M;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var R;let P=window.getEditableEngineConfig;if(typeof P=="function"){let D=P();return(R=D==null?void 0:D.loading)!=null?R:{}}return{}})(),a=(b=this.root)==null?void 0:b.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{type:a.value}),this.updateFieldVisibility(a.value)}));let r=(w=this.root)==null?void 0:w.querySelector("#loading-background-color");r&&(r.value=n.background_color||"#160a17",r.addEventListener("input",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{background_color:r.value})}));let o=(y=this.root)==null?void 0:y.querySelector("#loading-overlay-alpha"),l=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((I=n.overlay_alpha)!=null?I:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var R,D;let P=Number(o.value);l&&(l.textContent=P.toFixed(2)),(D=(R=this.options)==null?void 0:R.onUpdateLoading)==null||D.call(R,{overlay_alpha:P})}));let c=(j=this.root)==null?void 0:j.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{text:c.value})}));let d=(T=this.root)==null?void 0:T.querySelector("#loading-text-scale"),p=(_=this.root)==null?void 0:_.querySelector("#loading-text-scale-value");d&&(d.value=String((O=n.text_scale)!=null?O:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var R,D;let P=Number(d.value);p&&(p.textContent=P.toFixed(2)),(D=(R=this.options)==null?void 0:R.onUpdateLoading)==null||D.call(R,{text_scale:P})}));let u=(L=this.root)==null?void 0:L.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{enabled:u.checked})}));let g=(A=this.root)==null?void 0:A.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{blur_enabled:g.checked})}));let h=(k=this.root)==null?void 0:k.querySelector("#loading-blur-strength"),m=(C=this.root)==null?void 0:C.querySelector("#loading-blur-strength-value");h&&(h.value=String((E=n.blur_strength)!=null?E:8),m&&(m.textContent=h.value),h.addEventListener("input",()=>{var P,R;m&&(m.textContent=h.value),(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{blur_strength:Number(h.value)})}));let f=(S=this.root)==null?void 0:S.querySelector("#loading-show-btn"),v=(M=this.root)==null?void 0:M.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onShowLoadingScreen)==null||R.call(P)}),v==null||v.addEventListener("click",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onHideLoadingScreen)==null||R.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{Graphics as Lr,Point as Rs}from"pixi.js";import{Point as Er}from"pixi.js";var $e=()=>window.debugConfig||{},Ar=()=>window.resolveAnchorVec2||(s=>({x:.5,y:.5})),Cr=()=>window.resolveScreenAnchorPoint||(()=>new Er),Tr=()=>window.resolveScreenRatioPoint||(()=>new Er);function kr(s){xi(s)&&(s.objectDebugRaf||(s.objectDebugRaf=window.requestAnimationFrame(()=>Si(s))))}function Pr(s){s.objectDebugRaf&&(window.cancelAnimationFrame(s.objectDebugRaf),s.objectDebugRaf=null),Et(s)}function xi(s){return s.isDebugOpen}function Si(s){var a,r,o;if(!xi(s)){s.objectDebugRaf=null;return}s.objectDebugRaf=window.requestAnimationFrame(()=>Si(s));let e=mn(s);if(!e){St(s,null),Et(s);return}let t=fn(s,e);if(!t){St(s,null),Et(s);return}let i=new Rs;(a=t.getGlobalPosition)==null||a.call(t,i);let n=bn(s,t);St(s,{instanceId:e,worldX:i.x,worldY:i.y,configX:(r=n==null?void 0:n.x)!=null?r:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),s.highlightObject?xn(s,t):En(s),s.highlightAnchor&&n?Sn(s,n):An(s)}function mn(s){var n;let e=s.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 fn(s,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 At(s){let e=s.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function bn(s,e){var r,o;let t=At(s);if(!t)return null;let i=(r=t.transform)!=null?r:{},n=vn(s);if(!n)return null;if(i.position_ratio!=null)return Tr()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return Cr()(n.width,n.height,a)}function vn(s){var a;let e=(a=s.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 yn(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectBoundsGfx&&s.objectBoundsGfx.parent!==e.stage&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectBoundsGfx||(s.objectBoundsGfx=new Lr,s.objectBoundsGfx.zIndex=999999,e.stage.addChild(s.objectBoundsGfx)),s.objectBoundsGfx):null}function wn(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectAnchorGfx&&s.objectAnchorGfx.parent!==e.stage&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null),s.objectAnchorGfx||(s.objectAnchorGfx=new Lr,s.objectAnchorGfx.zIndex=1e6,e.stage.addChild(s.objectAnchorGfx)),s.objectAnchorGfx):null}function xn(s,e){var n;let t=yn(s);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 Sn(s,e){let t=wn(s);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 En(s){s.objectBoundsGfx&&s.objectBoundsGfx.clear()}function An(s){s.objectAnchorGfx&&s.objectAnchorGfx.clear()}function Et(s){s.objectBoundsGfx&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectAnchorGfx&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null)}function St(s,e){s.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function Mr(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function Ir(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;for(let o of i)a[o]=(r=a[o])!=null?r:{},a=a[o];a[n]=t}function Cn(s){var i,n,a,r,o;if(!s)return!1;if((i=s.transform)!=null&&i.offset)return!0;let e=((a=(n=s.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(r=s.identity)==null?void 0:r.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Ai(s){let e=$e();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 jr(s){window.location.reload()}function Ci(s){let e=JSON.stringify($e(),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 _r(s,e){var t,i,n;if(!(!s.configViewer||!s.container))try{let a=window.getEditableObjectConfig,r=typeof a=="function"?a(e):null;if(!r){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await import("./config-3JDCJ3GB.js"),p=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!p)return;let u=await l(p.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),Ei(s,u),(i=s.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,r),Ei(s,r),(n=s.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function Ei(s,e){var p,u,g,h,m,f,v,b,w,y;if(!s.container)return;let t=s.container.querySelector("#config-pos-x"),i=s.container.querySelector("#config-pos-y"),n=s.container.querySelector("#config-scale"),a=s.container.querySelector("#config-anchor-x"),r=s.container.querySelector("#config-anchor-y"),l=Cn(e)?(p=e.transform)==null?void 0:p.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((h=l==null?void 0:l.y)!=null?h:0)),n&&(n.value=String((f=(m=e.transform)==null?void 0:m.scale)!=null?f:1));let c=(y=(w=(v=e.transform)==null?void 0:v.anchor)!=null?w:(b=e.render)==null?void 0:b.anchor)!=null?y:{x:.5,y:.5},d=Ar()(c);a&&(a.value=String(d.x)),r&&(r.value=String(d.y))}function Or(s){var l,c,d,p,u,g,h,m,f,v;let e=s.selectedObjectId;if(!e||!s.container)return;let t=(c=(l=s.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=s.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=s.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(m=(h=s.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?m:"0.5",r=(v=(f=s.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?v:"0.5",o=`${e}:
1672
1757
  position: (${t}, ${i})
1673
1758
  scale: ${n}
1674
- 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 yn(r,e){var p,u,g,m,h,f,b,v,x,y,w;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!r.container)return;let t=r.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=r.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((m=(g=r.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?m:0),a=Number((f=(h=r.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?f:1),s=Number((v=(b=r.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?v:.5),o=Number((y=(x=r.container.querySelector("#config-anchor-y"))==null?void 0:x.value)!=null?y:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:s,anchorY:o});let{applyConfigOverride:l}=await import("./ConfigOverride-V7DLPL5I.js");l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:s,y:o}},{silent:e==null?void 0:e.silent});let c=yt(r);vn(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let d=window.applyEditableObjectConfig;if(typeof d=="function"){let I=(w=window.getEditableObjectConfig)==null?void 0:w.call(window,t);I?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,I)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Cr(r,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-V7DLPL5I.js");Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),m=c;for(let h=0;h<g.length-1;h++){let f=g[h];m[f]=(u=m[f])!=null?u:{},m=m[f]}m[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function Lr(r){r.selectedObjectId&&(r.objectAutoApplyTimer&&window.clearTimeout(r.objectAutoApplyTimer),r.objectAutoApplyTimer=window.setTimeout(()=>{r.objectAutoApplyTimer=null,yn(r,{silent:!0})},150))}var Ls=3e3;function xt(r,e,t){let i=t!=null?t:r.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,s=0,o=0,l=0,c=0,d=0,p=g=>{if(!n)return;let m=i.getBoundingClientRect();r.style.left=`${g.clientX-m.left-c}px`,r.style.top=`${g.clientY-m.top-d}px`},u=()=>{n&&(n=!1,r.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let m=g.target;if(m!=null&&m.closest("button, input, select, textarea"))return;g.preventDefault();let h=r.getBoundingClientRect(),f=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:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-h.left,d=g.clientY-h.top,console.log("[DRAG] offset:",{x:c,y:d});let b=h.left-f.left,v=h.top-f.top;console.log("[DRAG] targetPosition:",{left:b,top:v}),r.style.left=`${b}px`,r.style.top=`${v}px`,r.style.right="auto",r.style.bottom="auto",r.style.zIndex=String(++Ls),n=!0,r.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function kr(r,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,s=0,o=0,l=0,c=!1,d=u=>{var v;if(!c)return;let g=u.clientX-o,m=u.clientY-l,h=Math.max(i,a+g),f=Math.max(n,s+m);r.style.width=`${h}px`,(v=r.closest(".preview-shell"))!=null&&v.classList.contains("layout-fixed")||(r.style.height=`${f}px`),t==null||t(h,f)},p=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=r.getBoundingClientRect();a=g.width,s=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function xn(r,e){var h,f,b,v;let t=(b=(f=(h=r.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?f:r.debugOverlay)!=null?b:e.offsetParent;if(!t||(v=r.container)!=null&&v.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,s=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>s&&(e.style.width=`${s}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),p),m=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(m)}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(xn(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 wi(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"),xn(r,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function wn(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",xn(r,e),Qe(r))}function Mr(r){var n,a,s;if(!r.container)return;let e=r.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=r.toggleDebug)==null||o.call(r)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=r.toggleDebug)==null?void 0:o.call(r,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>yi(r)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>xi(r)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;r.activeTab=l,En(r),Qe(r)})}),An(r,e),Sn(r,e)}function En(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 Sn(r,e){me(r,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),me(r,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),me(r,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),me(r,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),me(r,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),me(r,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),me(r,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),me(r,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),me(r,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=ze();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),s=ze();s.layout&&(s.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Pr(r){if(!r.container||!r.debugOverlay)return;let e=r.container.querySelector("#debug-workbench"),t=r.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),xt(e,t,r.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{Qe(r),wn(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"),xt(i,n,r.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{wn(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&&xt(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&&xt(l,c,r.debugOverlay),wi(r)}function An(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 me(r,e,t,i,n){let a=e.querySelector(`#${t}`),s=e.querySelector(n);if(!a||!s)return;let o=wr(ze(),i);typeof o=="number"&&(a.value=String(o),s.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);s.textContent=String(l),Er(ze(),i,l)})}var Ei=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{await fetch("/api/sync-screens",{method:"POST"})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=Ve(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let p=d.objectId||"Engine";a[p]||(a[p]=[]),a[p].push(d)}let s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1759
+ anchor: (${a}, ${r})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(b=>console.error("[DEBUG] Failed to copy config values:",b))}async function Tn(s,e){var p,u,g,h,m,f,v,b,w,y,x;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!s.container)return;let t=s.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=s.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((h=(g=s.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?h:0),a=Number((f=(m=s.container.querySelector("#config-scale"))==null?void 0:m.value)!=null?f:1),r=Number((b=(v=s.container.querySelector("#config-anchor-x"))==null?void 0:v.value)!=null?b:.5),o=Number((y=(w=s.container.querySelector("#config-anchor-y"))==null?void 0:w.value)!=null?y:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:r,anchorY:o});let{applyConfigOverride:l}=await import("./ConfigOverride-V7DLPL5I.js");l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:r,y:o}},{silent:e==null?void 0:e.silent});let c=At(s);Cn(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let d=window.applyEditableObjectConfig;if(typeof d=="function"){let I=(x=window.getEditableObjectConfig)==null?void 0:x.call(window,t);I?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,I)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Rr(s,e,t){let{applyConfigOverride:i}=await import("./ConfigOverride-V7DLPL5I.js");Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let m=0;m<g.length-1;m++){let f=g[m];h[f]=(u=h[f])!=null?u:{},h=h[f]}h[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),r=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;r&&(o!=null&&o.refresh)&&o.refresh()}function zr(s){s.selectedObjectId&&(s.objectAutoApplyTimer&&window.clearTimeout(s.objectAutoApplyTimer),s.objectAutoApplyTimer=window.setTimeout(()=>{s.objectAutoApplyTimer=null,Tn(s,{silent:!0})},150))}var zs=3e3;function Ye(s,e,t){let i=t!=null?t:s.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,r=0,o=0,l=0,c=0,d=0,p=g=>{if(!n)return;let h=i.getBoundingClientRect();s.style.left=`${g.clientX-h.left-c}px`,s.style.top=`${g.clientY-h.top-d}px`},u=()=>{n&&(n=!1,s.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let m=s.getBoundingClientRect(),f=i.getBoundingClientRect();console.log("[DRAG] Panel:",s.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] containerRect:",{left:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-m.left,d=g.clientY-m.top,console.log("[DRAG] offset:",{x:c,y:d});let v=m.left-f.left,b=m.top-f.top;console.log("[DRAG] targetPosition:",{left:v,top:b}),s.style.left=`${v}px`,s.style.top=`${b}px`,s.style.right="auto",s.style.bottom="auto",s.style.zIndex=String(++zs),n=!0,s.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function Ti(s,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,r=0,o=0,l=0,c=!1,d=u=>{var b;if(!c)return;let g=u.clientX-o,h=u.clientY-l,m=Math.max(i,a+g),f=Math.max(n,r+h);s.style.width=`${m}px`,(b=s.closest(".preview-shell"))!=null&&b.classList.contains("layout-fixed")||(s.style.height=`${f}px`),t==null||t(m,f)},p=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=s.getBoundingClientRect();a=g.width,r=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function Ln(s,e){var m,f,v,b;let t=(v=(f=(m=s.container)==null?void 0:m.querySelector("#debug-overlay"))!=null?f:s.debugOverlay)!=null?v:e.offsetParent;if(!t||(b=s.container)!=null&&b.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,r=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>r&&(e.style.width=`${r}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),p),h=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function rt(s){var i,n;if(!s.container)return;let e=s.container.querySelector("#debug-workbench");if(!e)return;if(Ln(s,e),(i=s.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),r={activeTab:s.activeTab};if(a)try{r={...JSON.parse(a),activeTab:s.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(r));return}let t={activeTab:s.activeTab,width:e.style.width,height:(n=s.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 Li(s){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(s.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=s.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let r=(a=s.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!r?i.style.height=t.height:r&&(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"),Ln(s,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function kn(s,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",Ln(s,e),rt(s))}function Dr(s){var n,a,r;if(!s.container)return;let e=s.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=s.toggleDebug)==null||o.call(s)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=s.toggleDebug)==null?void 0:o.call(s,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>Ai(s)),(r=e.querySelector("#debug-export"))==null||r.addEventListener("click",()=>Ci(s)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;s.activeTab=l,Pn(s),rt(s)})}),In(s,e),Mn(s,e)}function Pn(s){if(!s.container)return;let e=s.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===s.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===s.activeTab)})}function Mn(s,e){me(s,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),me(s,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),me(s,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),me(s,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),me(s,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),me(s,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),me(s,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),me(s,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),me(s,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=$e();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),r=$e();r.layout&&(r.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function $r(s){if(!s.container||!s.debugOverlay)return;let e=s.container.querySelector("#debug-workbench"),t=s.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"),Ye(e,t,s.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{rt(s),kn(s,e)},10)}));let i=s.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"),Ye(i,n,s.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{kn(s,i)},10)})),i&&a&&Ti(i,a);let r=s.container.querySelector('[data-panel="scene-tools-corner"]'),o=r==null?void 0:r.querySelector("[data-panel-handle]");r&&o&&Ye(r,o,s.debugOverlay);let l=s.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ye(l,c,s.debugOverlay),Li(s)}function In(s,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 me(s,e,t,i,n){let a=e.querySelector(`#${t}`),r=e.querySelector(n);if(!a||!r)return;let o=Mr($e(),i);typeof o=="number"&&(a.value=String(o),r.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);r.textContent=String(l),Ir($e(),i,l)})}var ki=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{await fetch("/api/sync-screens",{method:"POST"})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=Ze(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let p=d.objectId||"Engine";a[p]||(a[p]=[]),a[p].push(d)}let r=localStorage.getItem("handler_last_applied"),o=r?new Date(parseInt(r)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1675
1760
  <div class="config-persistence-panel">
1676
1761
  <!-- Status Footer (Always Visible) -->
1677
1762
  <div class="persistence-status-footer">
@@ -1835,17 +1920,17 @@ This will delete generated config JSON files in configs/objects that are not ref
1835
1920
 
1836
1921
  It will NOT touch library/base configs.
1837
1922
 
1838
- Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),m=await g.json().catch(()=>({}));if(!g.ok||(m==null?void 0:m.success)===!1)throw new Error((m==null?void 0:m.error)||"Prune failed");await this.forceResyncAfterApply();let h=Array.isArray(m.deletedFiles)?m.deletedFiles.length:0,f=Array.isArray(m.removedAssetSlots)?m.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${h} configs, ${f} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var m;if(t.getAttribute("disabled")!==null)return;if(!Ve().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
1923
+ Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let m=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,f=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${m} configs, ${f} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!Ze().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
1839
1924
 
1840
1925
  This will:
1841
1926
  \u2022 Create a new version snapshot
1842
1927
  \u2022 Include all current changes
1843
1928
  \u2022 Clear staged overrides after save
1844
- \u2022 Set the new version as active`))try{let h=localStorage.getItem("handler_last_version_name")||"",b=((m=prompt("Version name (e.g. v1.2.0, test_2024):",h))!=null?m:"").trim();if(!b){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",b),t.textContent="\u23F3 Creating version...",t.setAttribute("disabled","true"),await ha(b),Fe(),await this.forceResyncAfterApply(),this.showSuccessNotification("Version created and set as active"),await this.loadVersionsList(),this.refreshPanel()}catch(h){console.error("[ConfigPersistence] Create version failed:",h),alert(`\u274C Failed to create version: ${h.message}`),t.textContent="\u{1F4DD} SAVE AS NEW VERSION",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-current-btn");i==null||i.addEventListener("click",async()=>{if(i.getAttribute("disabled")!==null)return;let u=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
1929
+ \u2022 Set the new version as active`))try{let m=localStorage.getItem("handler_last_version_name")||"",v=((h=prompt("Version name (e.g. v1.2.0, test_2024):",m))!=null?h:"").trim();if(!v){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",v),t.textContent="\u23F3 Creating version...",t.setAttribute("disabled","true"),await xa(v),We(),await this.forceResyncAfterApply(),this.showSuccessNotification("Version created and set as active"),await this.loadVersionsList(),this.refreshPanel()}catch(m){console.error("[ConfigPersistence] Create version failed:",m),alert(`\u274C Failed to create version: ${m.message}`),t.textContent="\u{1F4DD} SAVE AS NEW VERSION",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-current-btn");i==null||i.addEventListener("click",async()=>{if(i.getAttribute("disabled")!==null)return;let u=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
1845
1930
 
1846
1931
  This will write all staged changes to ${u}.
1847
1932
 
1848
- After applying, staged overrides will be cleared.`))try{i.textContent="\u23F3 Applying...",i.setAttribute("disabled","true");let m=Ht(),h={};for(let[v,x]of Object.entries(m.objects)){let y=x,w=v;/^(json\.|ui\.|effects\.|engine\.)/.test(w)||(w=`json.${v}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=w),h[`objects/${w}.json`]=y}m.engine&&(m.engine.runtime&&(h["engine/engine.runtime.json"]=m.engine.runtime),m.engine.assets&&(h["engine/engine.assets.json"]=m.engine.assets),m.engine.splash&&(h["engine/engine.splash.json"]=m.engine.splash),m.engine.loading&&(h["engine/engine.loading.json"]=m.engine.loading),m.engine.start&&(h["engine/engine.start.json"]=m.engine.start),m.engine.tutorial&&(h["engine/engine.tutorial.json"]=m.engine.tutorial),m.engine.endgame&&(h["engine/engine.endgame.json"]=m.engine.endgame),!m.engine.runtime&&!m.engine.assets&&(h["engine/engine.json"]=m.engine));for(let[v,x]of Object.entries(m.scenes)){let y=v.startsWith("scene.")?v:`scene.${v}`;h[`scenes/${y}.json`]=x}let f=this.currentVersion?"/api/apply-current":"/api/apply-direct",b=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{},hadCacheAtApply:!0})});if(!b.ok){let v=await b.json();throw new Error(v.error||"Apply to current source failed")}Fe(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(m){console.error("[ConfigPersistence] Apply current failed:",m),alert(`\u274C Apply to current source failed: ${m.message}`),i.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",i.removeAttribute("disabled")}});let n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1933
+ After applying, staged overrides will be cleared.`))try{i.textContent="\u23F3 Applying...",i.setAttribute("disabled","true");let h=Bt(),m={};for(let[b,w]of Object.entries(h.objects)){let y=w,x=b;/^(json\.|ui\.|effects\.|engine\.)/.test(x)||(x=`json.${b}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=x),m[`objects/${x}.json`]=y}h.engine&&(h.engine.runtime&&(m["engine/engine.runtime.json"]=h.engine.runtime),h.engine.assets&&(m["engine/engine.assets.json"]=h.engine.assets),h.engine.splash&&(m["engine/engine.splash.json"]=h.engine.splash),h.engine.loading&&(m["engine/engine.loading.json"]=h.engine.loading),h.engine.start&&(m["engine/engine.start.json"]=h.engine.start),h.engine.tutorial&&(m["engine/engine.tutorial.json"]=h.engine.tutorial),h.engine.endgame&&(m["engine/engine.endgame.json"]=h.engine.endgame),!h.engine.runtime&&!h.engine.assets&&(m["engine/engine.json"]=h.engine));for(let[b,w]of Object.entries(h.scenes)){let y=b.startsWith("scene.")?b:`scene.${b}`;m[`scenes/${y}.json`]=w}let f=this.currentVersion?"/api/apply-current":"/api/apply-direct",v=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:m,assets:{},hadCacheAtApply:!0})});if(!v.ok){let b=await v.json();throw new Error(b.error||"Apply to current source failed")}We(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(h){console.error("[ConfigPersistence] Apply current failed:",h),alert(`\u274C Apply to current source failed: ${h.message}`),i.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",i.removeAttribute("disabled")}});let n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1849
1934
 
1850
1935
  This will DIRECTLY MODIFY base configuration files.
1851
1936
 
@@ -1855,25 +1940,25 @@ This is ONLY for active development.
1855
1940
 
1856
1941
  Make sure your project is under Git version control.
1857
1942
 
1858
- Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Ht(),m={};for(let[f,b]of Object.entries(g.objects)){let v=b,x=f;/^(json\.|ui\.|effects\.|engine\.)/.test(x)||(x=`json.${f}`),v&&typeof v=="object"&&(v.identity||(v.identity={}),v.identity.id=x),m[`objects/${x}.json`]=v}g.engine&&(g.engine.runtime&&(m["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(m["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(m["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(m["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(m["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(m["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(m["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(m["engine/engine.json"]=g.engine));for(let[f,b]of Object.entries(g.scenes)){let v=f.startsWith("scene.")?f:`scene.${f}`;m[`scenes/${v}.json`]=b}let h=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:m,assets:{}})});if(!h.ok){let f=await h.json();throw new Error(f.error||"Apply to base failed")}Fe(),this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async u=>{let m=u.target.value;await this.switchVersion(m)}),this.container.querySelectorAll(".item-remove").forEach(u=>{u.addEventListener("click",()=>{let g=u.dataset.removePath,m=u.dataset.removeId;pa(m||void 0,g)})});let o=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(Fe(),Vi(),this.refreshPanel())};o==null||o.addEventListener("click",c),l==null||l.addEventListener("click",c);let d=this.container.querySelector("#reset-to-applied-btn");d==null||d.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&Vi()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await ma()})}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=`
1943
+ Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Bt(),h={};for(let[f,v]of Object.entries(g.objects)){let b=v,w=f;/^(json\.|ui\.|effects\.|engine\.)/.test(w)||(w=`json.${f}`),b&&typeof b=="object"&&(b.identity||(b.identity={}),b.identity.id=w),h[`objects/${w}.json`]=b}g.engine&&(g.engine.runtime&&(h["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(h["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(h["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(h["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(h["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(h["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(h["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(h["engine/engine.json"]=g.engine));for(let[f,v]of Object.entries(g.scenes)){let b=f.startsWith("scene.")?f:`scene.${f}`;h[`scenes/${b}.json`]=v}let m=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{}})});if(!m.ok){let f=await m.json();throw new Error(f.error||"Apply to base failed")}We(),this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async u=>{let h=u.target.value;await this.switchVersion(h)}),this.container.querySelectorAll(".item-remove").forEach(u=>{u.addEventListener("click",()=>{let g=u.dataset.removePath,h=u.dataset.removeId;va(h||void 0,g)})});let o=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(We(),Qi(),this.refreshPanel())};o==null||o.addEventListener("click",c),l==null||l.addEventListener("click",c);let d=this.container.querySelector("#reset-to-applied-btn");d==null||d.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&Qi()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await Sa()})}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=`
1859
1944
  <div class="notify-icon">\u2705</div>
1860
1945
  <div class="notify-content">
1861
1946
  <strong>${i}</strong>
1862
1947
  <span>Project files updated.</span>
1863
1948
  </div>
1864
- `,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=Ve();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
1949
+ `,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,r;let t=Ze();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
1865
1950
 
1866
1951
  You have ${t.overrideCount} staged changes that will be discarded.
1867
1952
 
1868
1953
  Options:
1869
1954
  OK = Discard staged overrides and switch
1870
- Cancel = Stay on current version`)){let l=(n=this.container)==null?void 0:n.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}}else if(!confirm(`Switch to version "${e||"original"}"?`)){let l=(a=this.container)==null?void 0:a.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}try{let o=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!o.ok){let l=await o.json();throw new Error(l.error||"Failed to switch version")}Fe(),localStorage.removeItem("handler_config_overrides"),localStorage.setItem("handler_preview_override_mode","false"),window.location.reload()}catch(o){alert(`\u274C Failed to switch version: ${o.message}`);let l=(s=this.container)==null?void 0:s.querySelector("#version-selector");l&&(l.value=this.currentVersion||"")}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
1955
+ Cancel = Stay on current version`)){let l=(n=this.container)==null?void 0:n.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}}else if(!confirm(`Switch to version "${e||"original"}"?`)){let l=(a=this.container)==null?void 0:a.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}try{let o=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!o.ok){let l=await o.json();throw new Error(l.error||"Failed to switch version")}We(),localStorage.removeItem("handler_config_overrides"),localStorage.setItem("handler_preview_override_mode","false"),window.location.reload()}catch(o){alert(`\u274C Failed to switch version: ${o.message}`);let l=(r=this.container)==null?void 0:r.querySelector("#version-selector");l&&(l.value=this.currentVersion||"")}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
1871
1956
 
1872
1957
  This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snapshot.
1873
1958
 
1874
1959
  This cannot be undone unless you have git commits or backups.
1875
1960
 
1876
- Are you absolutely sure?`))try{let t=Ht(),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 Si=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 Yt;this.sceneToolsPanel=new Wt;this.nudgePanel=new Kt;this.inspectorPanel=new ci;this.libraryPanel=new ft;this.libraryPanelDocked=new ft;this.brandVisionPanel=new ui;this.customizeSettingsPanel=new gi;this.configPersistencePanel=new Ei;this.loadingScreenPanel=new hi}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 bi(this)}getSelectedInstanceId(){return ln(this)}getDisplayObjectById(e){return cn(this,e)}getSelectedObjectConfig(){return yt(this)}getConfigAnchorWorldPoint(e){return dn(this,e)}getScreenSize(){return pn(this)}ensureBoundsGfx(){return un(this)}ensureAnchorGfx(){return gn(this)}drawBounds(e){return hn(this,e)}drawAnchor(e){return mn(this,e)}clearBounds(){return fn(this)}clearAnchor(){return bn(this)}clearObjectVisuals(){return vt(this)}updateObjectInfo(e){return bt(this,e)}resetDebugConfig(){return yi(this)}applyDebugConfig(){return Sr(this)}exportDebugConfig(){return xi(this)}loadObjectConfig(e){return Ar(this,e)}fillConfigViewer(e){return vi(this,e)}copyConfigValues(){return Tr(this)}applyObjectConfig(e){return yn(this,e)}applyCustomizeSettings(e,t){return Cr(this,e,t)}scheduleObjectAutoApply(){return Lr(this)}setupDebugEventListeners(){return Mr(this)}setupDebugInputListeners(e){return Sn(this,e)}setupPanelLayout(){return Pr(this)}setupCollapsiblePanels(e){return An(this,e)}setupRangeInput(e,t,i,n){return me(this,e,t,i,n)}updateWorkbenchTabs(){return En(this)}saveWorkbenchState(){return Qe(this)}loadWorkbenchState(){return wi(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,m,h,f,b,v;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((m=l==null?void 0:l.x)!=null?m:0)+a,d=((h=l==null?void 0:l.y)!=null?h:0)+s,{applyConfigOverride:p}=await import("./ConfigOverride-V7DLPL5I.js");p({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:d}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let x=window.__editableConfig,y=(v=(b=(f=x==null?void 0:x.objects)==null?void 0:f.get)==null?void 0:b.call(f,this.selectedObjectId))!=null?v:o;await u(this.selectedObjectId,y)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var p,u,g,m,h;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let o=(u=(p=s.transform)==null?void 0:p.scale)!=null?u:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await import("./ConfigOverride-V7DLPL5I.js");c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let f=window.__editableConfig,b=(h=(m=(g=f==null?void 0:f.objects)==null?void 0:g.get)==null?void 0:m.call(g,this.selectedObjectId))!=null?h:s;await d(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let a=window;typeof a.__previewShowLoading=="function"?a.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let a=window;typeof a.__previewHideLoading=="function"?a.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:a=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({loading:a}),typeof s.__previewUpdateLoading=="function"?s.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,s,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,s,o,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var s,o;((s=a.detail)==null?void 0:s.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,s,o)=>this.applySlotAsset(a,s,o),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var s;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((s=o==null?void 0:o.engine)==null?void 0:s.splash)||null}return null},window.addAssetToRegistry=(a,s)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(d=>d.filename===s))){let d=s.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:s,displayName:d}),console.log(`[DEBUG] Added ${s} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,s)=>{this.libraryPanel.highlightSlot(a,s)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
1961
+ Are you absolutely sure?`))try{let t=Bt(),i={};for(let[a,r]of Object.entries(t.objects)){let o=r,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,r]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=r}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")}We(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Pi=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new Xt;this.sceneToolsPanel=new Jt;this.nudgePanel=new Zt;this.inspectorPanel=new ui;this.libraryPanel=new xt;this.libraryPanelDocked=new xt;this.brandVisionPanel=new vi;this.customizeSettingsPanel=new yi;this.configPersistencePanel=new ki;this.loadingScreenPanel=new wi}applyAssetChange(e,t){return br(this,e,t)}resetAsset(e){return vr(this,e)}applySlotAsset(e,t,i){return fi(this,e,t,i)}resetSlotAsset(e,t,i){return yr(this,e,t,i)}startObjectVisuals(){return kr(this)}stopObjectVisuals(){return Pr(this)}shouldRunObjectVisuals(){return xi(this)}updateObjectVisuals(){return Si(this)}getSelectedInstanceId(){return mn(this)}getDisplayObjectById(e){return fn(this,e)}getSelectedObjectConfig(){return At(this)}getConfigAnchorWorldPoint(e){return bn(this,e)}getScreenSize(){return vn(this)}ensureBoundsGfx(){return yn(this)}ensureAnchorGfx(){return wn(this)}drawBounds(e){return xn(this,e)}drawAnchor(e){return Sn(this,e)}clearBounds(){return En(this)}clearAnchor(){return An(this)}clearObjectVisuals(){return Et(this)}updateObjectInfo(e){return St(this,e)}resetDebugConfig(){return Ai(this)}applyDebugConfig(){return jr(this)}exportDebugConfig(){return Ci(this)}loadObjectConfig(e){return _r(this,e)}fillConfigViewer(e){return Ei(this,e)}copyConfigValues(){return Or(this)}applyObjectConfig(e){return Tn(this,e)}applyCustomizeSettings(e,t){return Rr(this,e,t)}scheduleObjectAutoApply(){return zr(this)}setupDebugEventListeners(){return Dr(this)}setupDebugInputListeners(e){return Mn(this,e)}setupPanelLayout(){return $r(this)}setupCollapsiblePanels(e){return In(this,e)}setupRangeInput(e,t,i,n){return me(this,e,t,i,n)}updateWorkbenchTabs(){return Pn(this)}saveWorkbenchState(){return rt(this)}loadWorkbenchState(){return Li(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 r=JSON.parse(a);r.activeTab&&(this.activeTab=r.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,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,r,o)=>{console.log("[Inspector] Property changed:",a,r,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,r)=>this.applyCustomizeSettings(a,r)}),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,r)=>this.nudgeSelectedObject(a,r),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,r)=>{var g,h,m,f,v,b;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((h=l==null?void 0:l.x)!=null?h:0)+a,d=((m=l==null?void 0:l.y)!=null?m:0)+r,{applyConfigOverride:p}=await import("./ConfigOverride-V7DLPL5I.js");p({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:d}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let w=window.__editableConfig,y=(b=(v=(f=w==null?void 0:w.objects)==null?void 0:f.get)==null?void 0:v.call(f,this.selectedObjectId))!=null?b:o;await u(this.selectedObjectId,y)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var p,u,g,h,m;if(!this.selectedObjectId)return;let r=this.getSelectedObjectConfig();if(!r)return;let o=(u=(p=r.transform)==null?void 0:p.scale)!=null?u:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await import("./ConfigOverride-V7DLPL5I.js");c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let f=window.__editableConfig,v=(m=(h=(g=f==null?void 0:f.objects)==null?void 0:g.get)==null?void 0:h.call(g,this.selectedObjectId))!=null?m:r;await d(this.selectedObjectId,v)}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 r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({loading:a}),typeof r.__previewUpdateLoading=="function"?r.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,r,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,r,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 r,o;((r=a.detail)==null?void 0:r.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,r,o)=>this.applySlotAsset(a,r,o),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var r;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((r=o==null?void 0:o.engine)==null?void 0:r.splash)||null}return null},window.addAssetToRegistry=(a,r)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(d=>d.filename===r))){let d=r.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:r,displayName:d}),console.log(`[DEBUG] Added ${r} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,r)=>{this.libraryPanel.highlightSlot(a,r)}}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`
1877
1962
  <div class="debug-overlay hidden" id="debug-overlay">
1878
1963
  <div class="debug-workbench" id="debug-workbench">
1879
1964
  <div class="workbench-header" id="workbench-handle">
@@ -1920,7 +2005,7 @@ Are you absolutely sure?`))try{let t=Ht(),i={};for(let[a,s]of Object.entries(t.o
1920
2005
  ${this.sceneToolsPanel.render()}
1921
2006
  ${this.nudgePanel.render()}
1922
2007
  </div>
1923
- `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}async nudgeSelectedObject(e,t){var o,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let p=this.container.querySelector("#config-pos-x"),u=this.container.querySelector("#config-pos-y");if(p&&u){let g=Number((o=p.value)!=null?o:0),m=Number((l=u.value)!=null?l:0),h=g+e*n,f=m+t*n;p.value=String(h),u.value=String(f),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let s=new Oe;for(let p of i){let u=a(p);if(!u)continue;let g=((d=u.transform)==null?void 0:d.position)||[0,0],m=Array.isArray(g)?g[0]:g.x||0,h=Array.isArray(g)?g[1]:g.y||0,f=m+e*n,b=h+t*n;await s.updateProperty(p,"transform.position",[f,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function ks(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function Ms(r){var n;let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function Ps(r){return`
2008
+ `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var o,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let p=this.container.querySelector("#config-pos-x"),u=this.container.querySelector("#config-pos-y");if(p&&u){let g=Number((o=p.value)!=null?o:0),h=Number((l=u.value)!=null?l:0),m=g+e*n,f=h+t*n;p.value=String(m),u.value=String(f),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=new ze;for(let p of i){let u=a(p);if(!u)continue;let g=((d=u.transform)==null?void 0:d.position)||[0,0],h=Array.isArray(g)?g[0]:g.x||0,m=Array.isArray(g)?g[1]:g.y||0,f=h+e*n,v=m+t*n;await r.updateProperty(p,"transform.position",[f,v])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function Ds(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function $s(s){var n;let[e,t]=s.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 Hs(s){return`
1924
2009
  Analyze these screenshots of a brand or game and extract its "Brand DNA".
1925
2010
 
1926
2011
  Provide a concise summary (2-3 sentences) covering:
@@ -1934,12 +2019,12 @@ FORMAT:
1934
2019
  Summary: [Your summary here]
1935
2020
  Palette: [#RRGGBB, #RRGGBB, ...]
1936
2021
 
1937
- ${r?`
2022
+ ${s?`
1938
2023
  ADDITIONAL RULES/NOTES:
1939
- ${r}`:""}
1940
- `.trim()}function Ir(){let r=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let s=await ks(a),o=Ms(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=Ps(n),o=r.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await pi(i,s,o,{model:a}),c=e,d=[],p=l.split(`
1941
- `);for(let u of p)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let g=u.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(m=>{d.includes(m.toUpperCase())||d.push(m.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
1942
- Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var 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}}},Tn=()=>et.getKey("gemini"),Cn=(r,e)=>et.setKey("gemini",r,e),Is=()=>et.hasKey("gemini");window.ApiKeyStorage=et;window.getGeminiApiKey=Tn;window.setGeminiApiKey=Cn;window.hasGeminiApiKey=Is;var kn=class{constructor(){this.modal=null;this.options=null;this.analyzer=Ir();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=`
2024
+ ${s}`:""}
2025
+ `.trim()}function Hr(){let s=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let r=await Ds(a),o=$s(r),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:o.base64,mimeType:o.mimeType,dataUrl:r};s.push(l),n.push(l)}return n},getSources(){return s.slice()},async analyze(i,n,a){if(s.length===0)throw new Error("No screenshots to analyze.");let r=Hs(n),o=s.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await hi(i,r,o,{model:a}),c=e,d=[],p=l.split(`
2026
+ `);for(let u of p)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let g=u.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(h=>{d.includes(h.toUpperCase())||d.push(h.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
2027
+ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Ke="handler_api_key_";var st=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${Ke}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Ke}${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=`${Ke}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Ke}${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(Ke)){let n=i.substring(Ke.length),a=localStorage.getItem(i);if(a){let r=JSON.parse(a);e.push({service:n,label:r.label,created:r.created,lastUsed:r.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(Ke)&&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}}},jn=()=>st.getKey("gemini"),_n=(s,e)=>st.setKey("gemini",s,e),Ns=()=>st.hasKey("gemini");window.ApiKeyStorage=st;window.getGeminiApiKey=jn;window.setGeminiApiKey=_n;window.hasGeminiApiKey=Ns;var Rn=class{constructor(){this.modal=null;this.options=null;this.analyzer=Hr();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=`
1943
2028
  <div class="ai-modal-card">
1944
2029
  <div class="ai-modal-header">
1945
2030
  <div class="ai-modal-actions">
@@ -2018,14 +2103,14 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0
2018
2103
  <button class="ai-btn primary" data-action="apply" disabled>Apply</button>
2019
2104
  </div>
2020
2105
  </div>
2021
- `,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}
2106
+ `,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 r=a.closest(".ai-gallery-item"),o=parseInt(r.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}
2022
2107
 
2023
- 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 di(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)=>`
2108
+ 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 r=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await gi(this.options.currentValue);c&&(r=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let o=await at(a,this.currentPrompt,r,{aspectRatio:"1:1"}),l=await nt(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)=>`
2024
2109
  <div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
2025
2110
  <img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
2026
2111
  <div class="ai-gallery-label">#${i+1}</div>
2027
2112
  </div>
2028
- `).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=Tn();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}},Ln=null;window.__openAiEditor=function(r,e,t,i){Ln||(Ln=new kn),Ln.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 d=0;d<l.length-1;d++)c[l[d]]||(c[l[d]]={}),c=c[l[d]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var Mn=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
2113
+ `).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=jn();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return _n(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}},On=null;window.__openAiEditor=function(s,e,t,i){On||(On=new Rn),On.open({objectId:s,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(s,i.path,n);else{let r=window.getEditableObjectConfig,o=r==null?void 0:r(s);if(o){let l=i.path.split("."),c=o;for(let d=0;d<l.length-1;d++)c[l[d]]||(c[l[d]]={}),c=c[l[d]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};var zn=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=`
2029
2114
  <div class="asset-preview-card">
2030
2115
  <div class="asset-preview-header">
2031
2116
  <div class="asset-preview-title">${n}</div>
@@ -2052,7 +2137,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2052
2137
  <source src="${n}" type="audio/wav">
2053
2138
  Your browser does not support the audio element.
2054
2139
  </audio>
2055
- `;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(r){new Mn().open(r)};var Pn=class{constructor(){this.modal=null;this.canvas=null;this.ctx=null;this.image=null;this.options=null;this.cropX=0;this.cropY=0;this.cropWidth=100;this.cropHeight=100;this.scale=1;this.panX=0;this.panY=0;this.isDragging=!1;this.dragStartX=0;this.dragStartY=0;this.lastPanX=0;this.lastPanY=0}open(e){this.options=e,this.createModal(),this.loadImage(),document.body.appendChild(this.modal)}createModal(){let e=document.createElement("div");e.className="asset-crop-modal",e.innerHTML=`
2140
+ `;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&import("./AssetEditorModal-N52QSFSY.js").then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(s){new zn().open(s)};var Dn=class{constructor(){this.modal=null;this.canvas=null;this.ctx=null;this.image=null;this.options=null;this.cropX=0;this.cropY=0;this.cropWidth=100;this.cropHeight=100;this.scale=1;this.panX=0;this.panY=0;this.isDragging=!1;this.dragStartX=0;this.dragStartY=0;this.lastPanX=0;this.lastPanY=0}open(e){this.options=e,this.createModal(),this.loadImage(),document.body.appendChild(this.modal)}createModal(){let e=document.createElement("div");e.className="asset-crop-modal",e.innerHTML=`
2056
2141
  <div class="asset-crop-card">
2057
2142
  <div class="asset-crop-header">
2058
2143
  <div>
@@ -2103,7 +2188,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2103
2188
  <button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
2104
2189
  </div>
2105
2190
  </div>
2106
- `,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,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(r){new Pn().open(r)};var In=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[Xe("playable-portrait"),Xe("iphone-14"),Xe("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.hasUnsavedChanges=!1;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=Xe(e.defaultDevice||Qi.id),this.debugPanel=new Si,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.setupUnsavedChangesIndicator(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}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=Xe(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 d=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:d})},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,d=Math.max(200,Math.min(600,a+c));e.style.width=`${d}px`;let p=this.container.querySelector(".preview-main");if(p){let g=i==="left"?`${d}px`:p.style.gridTemplateColumns.split(" ")[0]||"300px",m=i==="right"?`${d}px`:p.style.gridTemplateColumns.split(" ")[2]||"350px";p.style.gridTemplateColumns=`${g} 1fr ${m}`}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=`
2191
+ `,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,r=Math.min(n,a),o=this.cropWidth*r,l=this.cropHeight*r,c=(i-o)/2,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(s){new Dn().open(s)};import{Application as uo,Container as Tt,Graphics as ot,Point as Se,Rectangle as go,Text as ho,TextStyle as mo}from"pixi.js";import{Sprite as Fs,Container as Nr}from"pixi.js";var Bs=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",$n=Bs;if(typeof window!="undefined")try{let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);e!=null&&e.buildMode&&($n=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${$n}`))}}catch{}function Us(s){var t,i,n,a,r;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(s);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(s))return{x:(t=s[0])!=null?t:.5,y:(i=s[1])!=null?i:.5};if(s&&typeof s=="object"&&"x"in s&&"y"in s)return{x:(n=s.x)!=null?n:.5,y:(a=s.y)!=null?a:.5};if(typeof s=="string"){let o=s.trim().toLowerCase();return(r=e[o])!=null?r:{x:.5,y:.5}}return null}var we=class{static async create(e,t,i){var l,c,d,p,u,g,h;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 m=new Nr;return this.applyTransform(m,t==null?void 0:t.transform,t),m}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let r=await Ki.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=r==null?void 0:r.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",r,"for object:",e),o=new Fs(r),console.log("[ObjectFactory] Created object:",o,"type:",(p=o==null?void 0:o.constructor)==null?void 0:p.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=r==null?void 0:r.constructor)==null?void 0:u.name,r),r&&(((g=r.constructor)==null?void 0:g.name)==="Container"||r instanceof Nr)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let m=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],f=!1;for(let v of m)try{let b=await fetch(v);if(b.ok){o=await b.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",v,"type:",(h=o==null?void 0:o.constructor)==null?void 0:h.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=r)}else o=r;else o=r,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,r,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((r=t.position.x)!=null?r: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=Us(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};import{Graphics as Gs,Point as qs}from"pixi.js";var ke={width:400,height:600,designWidth:400,scaleFactor:1},Ii={scale:1,position:1},ji=[];function Vs(s,e,t,i,n,a,r){ji.push({element:s,originalScale:a,positionHelper:e,heightPercent:n}),e(s,t,i,n,a,r,!1)}function Ws(){ji.forEach(({element:s,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*ke.scaleFactor;t(s,ke.width,ke.height,i,n,!0,!1)})}function Ys(){ji.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function Hn(s,e){console.log(`[SCREEN] updateScreenState called: ${s}x${e}`),ke.width=s,ke.height=e,ke.scaleFactor=Math.min(s/ke.designWidth,1.15),Ii.scale=ke.scaleFactor,Ii.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Ii.scale.toFixed(3)}`),Ws()}var B={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 Ks(s,e,t){let i=B[s];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${s}.${e} = ${t}`))}function Xs(){return B}var Js={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 Mi(s,e){return typeof s=="number"&&Number.isFinite(s)?s:e}function He(s,e={x:.5,y:.5}){var t;if(Array.isArray(s))return{x:Mi(s[0],e.x),y:Mi(s[1],e.y)};if(s&&typeof s=="object"){let i=s;return{x:Mi(i.x,e.x),y:Mi(i.y,e.y)}}if(typeof s=="string"){let i=s.trim().toLowerCase();return(t=Js[i])!=null?t:e}return e}function Ne(s,e,t,i={}){var g,h,m,f,v,b;let n=He(t),a=(g=i.inset)!=null?g:{},r=(h=i.padding)!=null?h:{x:0,y:0},o=((m=a.left)!=null?m:0)+r.x,l=((f=a.right)!=null?f:0)+r.x,c=((v=a.top)!=null?v:0)+r.y,d=((b=a.bottom)!=null?b:0)+r.y,p=Math.max(0,s-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function Fe(s,e,t,i={}){var m,f,v,b,w,y;let n=(m=i.inset)!=null?m:{},a=(f=i.padding)!=null?f:{x:0,y:0},r=((v=n.left)!=null?v:0)+a.x,o=((b=n.right)!=null?b:0)+a.x,l=((w=n.top)!=null?w:0)+a.y,c=((y=n.bottom)!=null?y:0)+a.y,d=Math.max(0,s-r-o),p=Math.max(0,e-l-c),u=He(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:r+d*g,y:l+p*h}}function Nn(s,e,t,i={}){var d,p,u;if(!s)return;let n=i.positionRatio?Fe(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):Ne(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(d=i.offset)!=null?d:{x:0,y:0},r=n.x+a.x,o=n.y+a.y;s.anchor&&i.renderAnchor&&s.anchor.set(i.renderAnchor.x,i.renderAnchor.y),fe(s,r,o);let l=(p=i.scale)!=null?p:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&xe(s,l*c)}if(typeof window!="undefined"){let s=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==s||n!==e)&&(s=i,e=n,Hn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),Hn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Ks,window.getDebugConfig=Xs,window.copyConfig=lo,window.applyConfig=Ct,window.applyConfigForRatio=co,window.positionAtBottom=Fr,window.positionAtTop=eo,window.positionAtCenter=to,window.positionAtLeft=io,window.positionAtRight=no,window.positionAtBottomLeft=ao,window.positionAtBottomRight=ro,window.positionAtTopLeft=so,window.positionAtTopRight=oo,window.applyPositionContract=Qs,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 _i(s,e,t=0){return s*e+t}function Oi(s,e,t=0){return s*(1-e)+t}function Ri(s,e,t=0){return s*e+t}function zi(s,e,t=0){return s*(1-e)+t}function ue(s,e=0){return s/2+e}function Zs(s,e){return s*e}function Qs(s,e,t,i){var r,o,l,c,d,p,u,g,h,m,f,v,b,w,y,x,I,j,T,_;let n=0,a=0;switch(i.type){case"top":n=ue(e,(o=(r=i.offset)==null?void 0:r.x)!=null?o:0),a=_i(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ue(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=Oi(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Ri(e,i.percent,(m=(h=i.offset)==null?void 0:h.x)!=null?m:0),a=ue(t,(v=(f=i.offset)==null?void 0:f.y)!=null?v:0);break;case"right":n=zi(e,i.percent,(w=(b=i.offset)==null?void 0:b.x)!=null?w:0),a=ue(t,(x=(y=i.offset)==null?void 0:y.y)!=null?x:0);break;case"center":n=ue(e,(j=(I=i.offset)==null?void 0:I.x)!=null?j:0),a=ue(t,(_=(T=i.offset)==null?void 0:T.y)!=null?_:0);break}s.position?s.position.set(n,a):(s.x=n,s.y=a),i.scale!==void 0&&i.scale!==1&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(i.scale,i.scale):(s.scale.x=i.scale,s.scale.y=i.scale))}function Fr(s,e,t,i=.2,n=1,a=!0,r=!1){let o=Zs(t,i),l=Oi(t,i/2);fe(s,ue(e),l);let c=a?n*ke.scaleFactor:n;xe(s,c),r&&!ji.find(d=>d.element===s)&&Vs(s,Fr,e,t,i,n,a)}function eo(s,e,t,i=.1,n=1){fe(s,ue(e),_i(t,i)),xe(s,n)}function to(s,e,t,i=0,n=0,a=1){fe(s,ue(e,i),ue(t,n)),xe(s,a)}function io(s,e,t,i=.1,n=1){fe(s,Ri(e,i),ue(t)),xe(s,n)}function no(s,e,t,i=.1,n=1){fe(s,zi(e,i),ue(t)),xe(s,n)}function ao(s,e,t,i=.05,n=.05,a=1){fe(s,Ri(e,n),Oi(t,i)),xe(s,a)}function ro(s,e,t,i=.05,n=.05,a=1){fe(s,zi(e,n),Oi(t,i)),xe(s,a)}function so(s,e,t,i=.05,n=.05,a=1){fe(s,Ri(e,n),_i(t,i)),xe(s,a)}function oo(s,e,t,i=.05,n=.05,a=1){fe(s,zi(e,n),_i(t,i)),xe(s,a)}function fe(s,e,t){s&&s.position?typeof s.position.set=="function"?s.position.set(e,t):(s.position.x=e,s.position.y=t):s&&(s.x=e,s.y=t)}function xe(s,e){e!==1&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(e,e):s.scale.x!==void 0&&s.scale.y!==void 0&&(s.scale.x=e,s.scale.y=e))}var Xe={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 lo(s){return s&&Xe[s]?JSON.parse(JSON.stringify(Xe[s])):JSON.parse(JSON.stringify(B))}function Ct(s){Object.keys(s).forEach(e=>{let t=e;B[t]&&s[t]&&Object.assign(B[t],s[t])}),console.log("Config applied:",s)}function co(s,e){let t=s/e;t>1.6?(Ct(Xe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Ct(Xe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Ct(Xe.square),console.log("Applied SQUARE config for ratio:",t)):(Ct(Xe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let s=window;s.configPresets=Xe,s.resolveAnchorVec2=s.resolveAnchorVec2||He,s.resolveScreenAnchorPoint=s.resolveScreenAnchorPoint||Ne,s.resolveScreenRatioPoint=s.resolveScreenRatioPoint||Fe}var se=null;function po(s,e,t,i,n,a={}){var M,P,R,D,N,H,F,G,Y,Q,ie,oe,$,Z,le,ge,ce,be,Ce,Te,q,ee,K,ae,_e,Ge,da,pa,ua,ga,ha,ma,fa,ba;let r=(M=a.enableDebugLogs)!=null?M:!1;r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== STARTING LAYOUT CALCULATION ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Screen dimensions:",{width:i.width,height:i.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Time:",t),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Options:",a));let{mainContainer:o,label:l,background:c,backgroundTexture:d,app:p}=s;if(!p||!p.renderer){r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] App renderer dimensions:",{width:p.renderer.width,height:p.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:p.screen.width,height:p.screen.height}));let u=i.width,g=i.height;r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:u,baseHeight:g});let h=u*B.layout.screen_scale_x,m=g*B.layout.screen_scale_y,f=u/2,v=e.engine.runtime||{},b=v.layout||{};r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:B.layout.screen_scale_x,screen_scale_y:B.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:h,height:m,midX:f}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",v),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",b));let w=b.design_width_portrait||400,y=h/w;y=Math.min(y,1.15);let x=y*((P=B.engine.scale)!=null?P:1),I=(R=a.skipMainContainerTransform)!=null?R:!1;!I&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(x):(o.scale.x=x,o.scale.y=x));let j=(D=b.main_container_anchor)!=null?D:"center",T=(N=b.main_container_position_ratio)!=null?N:{x:.5,y:.5},_=(H=b.main_container_offset)!=null?H:{x:0,y:0},O=b.main_container_position_ratio?Fe(u,g,T):Ne(u,g,j),L=O.x+_.x+B.layout.position_offset.x,A=O.y+_.y+B.layout.position_offset.y;if(!I&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(L,A):(o.position.x=L,o.position.y=A)),n&&(o!=null&&o.toLocal))for(let[re,ne]of e.objects.entries()){let V=ne==null?void 0:ne.transform;if(!V||((F=V.position_mode)!=null?F:"static")!=="static")continue;let U=(G=n.get)==null?void 0:G.call(n,re),ve=((Y=U==null?void 0:U.getDisplayObject)==null?void 0:Y.call(U))||(U==null?void 0:U.pixiObject)||U;if(!ve||ve.parent!==o)continue;let $t=V.position_ratio!=null?Fe(u,g,V.position_ratio):Ne(u,g,(Q=V.anchor)!=null?Q:"center"),Ht=o.toLocal(new qs($t.x,$t.y)),Nt=(ie=V.position)!=null?ie:{x:0,y:0},qe=Ht.x+Nt.x,Yi=Ht.y+Nt.y;typeof(U==null?void 0:U.setPosition)=="function"?U.setPosition(qe,Yi):(fe(ve,qe,Yi),(oe=U==null?void 0:U.transform)!=null&&oe.position&&(U.transform.position.x=qe,U.transform.position.y=Yi))}let k=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,E=((k==null?void 0:k.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(B.layout.debug_rect_visible&&E){(!se||se.parent!==p.stage)&&(se==null||se.destroy(),se=new Gs,se.zIndex=9999,p.stage.addChild(se)),se.clear();let re=B.layout.debug_rect_scale_x,ne=B.layout.debug_rect_scale_y,V=(u-4)*re,Oe=(g-4)*ne,U=(u-V)/2,ve=(g-Oe)/2;r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:u,baseHeight:g,rectW:V,rectH:Oe,offsetX:U,offsetY:ve}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+U,y:2+ve,width:V,height:Oe})),se.rect(2+U,2+ve,V,Oe).stroke({width:B.layout.debug_rect_thickness,color:B.layout.debug_rect_color})}else se&&(se.destroy(),se=null);let S=(($=s.label)==null?void 0:$.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&S){let re=(le=(Z=S==null?void 0:S.transform)==null?void 0:Z.anchor)!=null?le:"center",ne=(ge=S==null?void 0:S.transform)==null?void 0:ge.position_ratio,V=((ce=S==null?void 0:S.transform)==null?void 0:ce.offset)||{x:0,y:0};Nn(l,u,g,{anchor:re,positionRatio:ne,offset:{x:V.x*x,y:V.y*x},renderAnchor:He(re)})}if(l&&l.alpha>0){let re=1+Math.sin(t*B.engine.label_pulse_speed)*B.engine.label_pulse_intensity,ne=(Ce=(be=S==null?void 0:S.transform)==null?void 0:be.scale)!=null?Ce:1,V=re*x*ne;l.scale&&(typeof l.scale.set=="function"?l.scale.set(V):(l.scale.x=V,l.scale.y=V))}if(r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING ====="),c){r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(Te=c.constructor)==null?void 0:Te.name)),c.alpha=((ee=(q=v.background)==null?void 0:q.alpha)!=null?ee:.98)*B.engine.background_alpha,r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let re=e.objects.get("background_1");r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",re);let ne=(re==null?void 0:re.transform)||{};r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ne);let V=ne.offset||{x:0,y:0},Oe=((ae=(K=v.background)==null?void 0:K.offset_y)!=null?ae:0)+B.engine.background_offset_y,U=(_e=ne.anchor)!=null?_e:"center",ve=ne.position_ratio;if(r&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:V,bgRuntimeOffsetY:Oe,bgScreenAnchor:U,bgPositionRatio:ve,baseWidth:u,baseHeight:g,finalScale:x}),Nn(c,u,g,{anchor:U,positionRatio:ve,offset:{x:V.x*x,y:V.y*x+Oe},renderAnchor:He(U)}),r&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(Ge=c.scale)==null?void 0:Ge.x,scaleY:(da=c.scale)==null?void 0:da.y,anchorX:(pa=c.anchor)==null?void 0:pa.x,anchorY:(ua=c.anchor)==null?void 0:ua.y,pivotX:(ga=c.pivot)==null?void 0:ga.x,pivotY:(ha=c.pivot)==null?void 0:ha.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:d==null?void 0:d.width,textureHeight:d==null?void 0:d.height})),d){let $t=Math.max(h/d.width,m/d.height),Ht=(fa=(ma=v.background)==null?void 0:ma.scale_multiplier)!=null?fa:1.05,Nt=(ba=ne.scale)!=null?ba:1,qe=$t*Ht*B.engine.background_scale*Nt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(qe):(c.scale.x=qe,c.scale.y=qe))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-h/2,-m/2,h,m).fill({color:1444375}))}}var Di=class{constructor(e){this.app=null;this.camera=new Tt;this.mainContainer=new Tt;this.gizmoLayer=new Tt;this.screenFrame=new ot;this.objectMap=new Map;this.selectedId=null;this.dragMode=null;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotationDeg=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.gizmoOutline=new ot;this.moveHandle=new ot;this.scaleHandle=new ot;this.rotateHandle=new ot;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.updateLayout({width:t,height:i}),this.updateGizmos(),this.syncFromConfig())};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.objectId,n=t.objectIds;if(i){this.syncFromConfig([i]);return}if(Array.isArray(n)&&n.length>0){this.syncFromConfig(n);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onDragMove=e=>{if(!this.dragMode||!this.selectedId||!this.app)return;let t=this.objectMap.get(this.selectedId);if(!t)return;let i=this.getPointerInCamera(e.clientX,e.clientY);if(!(!i||!this.dragStartPointer||!this.dragStartPos)){if(this.dragMode==="move"){let n=i.x-this.dragStartPointer.x,a=i.y-this.dragStartPointer.y,r=this.dragStartPos.x+n,o=this.dragStartPos.y+a;t.displayObject.position.set(r,o),this.updateLiveConfigPosition(r,o)}else if(this.dragMode==="scale"){let n=new Se(this.dragStartPos.x,this.dragStartPos.y),a=Math.max(1,this.distance(i,n)),r=Math.max(.05,this.dragStartScale*(a/this.dragStartDistance));t.displayObject.scale.set(r),this.updateLiveConfigScale(r)}else if(this.dragMode==="rotate"){let n=new Se(this.dragStartPos.x,this.dragStartPos.y),r=Math.atan2(i.y-n.y,i.x-n.x)-this.dragStartAngle,o=this.dragStartRotationDeg+r*180/Math.PI;t.displayObject.rotation=o*Math.PI/180,this.updateLiveConfigRotation(o)}this.updateGizmos(),this.queueLiveApply(this.selectedId)}};this.onDragEnd=()=>{var i,n,a,r,o,l,c;if(!this.dragMode||!this.selectedId)return;let e=this.selectedId,t=this.getEditableObjectConfig(e);if(t){let d=(i=t.transform)!=null?i:{};if(t.transform||(t.transform=d),this.dragMode==="move"&&this.dragStartValue){let p=d.position,u=Array.isArray(p)?[Number((n=p[0])!=null?n:0),Number((a=p[1])!=null?a:0)]:{x:Number((r=p==null?void 0:p.x)!=null?r:0),y:Number((o=p==null?void 0:p.y)!=null?o:0)};this.applyFinalOverride(e,"transform.position",u,this.dragStartValue)}else this.dragMode==="scale"?this.applyFinalOverride(e,"transform.scale",(l=d.scale)!=null?l:1,this.dragStartValue):this.dragMode==="rotate"&&this.applyFinalOverride(e,"transform.rotation",(c=d.rotation)!=null?c:0,this.dragStartValue);this.queueLiveApply(e)}window.dispatchEvent(new CustomEvent("inspector:refresh")),this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd)};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i));this.cameraScale=n,this.camera.scale.set(n),this.hasUserCamera=!0,this.updateGizmos()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(!this.isPanning||!this.panStart||!this.panStartCamera)return;let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i)};this.onPanEnd=()=>{this.isPanning=!1,this.panStart=null,this.panStartCamera=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new uo,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.screenFrame),this.camera.addChild(this.mainContainer),this.camera.addChild(this.gizmoLayer),this.screenFrame.zIndex=-1,this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.refresh(),this.isVisible||this.app.ticker.stop())}destroy(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("preview:select",this.handlePreviewSelect),this.app&&(this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,this.app&&(e?(this.app.ticker.start(),this.refresh()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("preview:select",this.handlePreviewSelect),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.moveHandle.eventMode="static",this.moveHandle.cursor="move",this.scaleHandle.eventMode="static",this.scaleHandle.cursor="nwse-resize",this.rotateHandle.eventMode="static",this.rotateHandle.cursor="crosshair",this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t))}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos())}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let r=this.getEditableObjectConfig(a);if(!r){this.removeObject(a);continue}await this.upsertObject(a,r)}this.updateGizmos()}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e);if(!n||n.assetKey!==i){n&&this.removeObject(e);let r=await this.createDisplayObject(e,t);if(!r)return;this.mainContainer.addChild(r),this.objectMap.set(e,{id:e,displayObject:r,assetKey:i}),this.attachObjectInteraction(r,e)}let a=this.objectMap.get(e);a&&(this.applyVisualConfig(a.displayObject,t),this.updateObjectTransform(a.displayObject,t))}async createDisplayObject(e,t){var i,n,a,r,o,l,c,d,p,u,g,h,m,f,v,b,w,y,x,I;if((i=t==null?void 0:t.render)!=null&&i.asset)try{if(((a=(n=t==null?void 0:t.render)==null?void 0:n.asset)==null?void 0:a.type)!=="json"){let T=await we.create(e,t,this.app);if(T instanceof Tt)return T}}catch(j){console.warn("[SceneEditor] ObjectFactory failed for",e,j)}if((r=t==null?void 0:t.ui)!=null&&r.text||((o=t==null?void 0:t.ui)==null?void 0:o.kind)==="text"){let j=(p=(d=(l=t==null?void 0:t.ui)==null?void 0:l.color)!=null?d:(c=t==null?void 0:t.render)==null?void 0:c.tint)!=null?p:"#ffffff",T=new mo({fontFamily:"Arial, sans-serif",fontSize:(g=(u=t==null?void 0:t.ui)==null?void 0:u.fontSize)!=null?g:16,fill:j,align:(m=(h=t==null?void 0:t.ui)==null?void 0:h.align)!=null?m:"center",letterSpacing:(v=(f=t==null?void 0:t.ui)==null?void 0:f.letterSpacing)!=null?v:0});return new ho({text:(w=(b=t==null?void 0:t.ui)==null?void 0:b.text)!=null?w:"",style:T})}if((y=t==null?void 0:t.effects)!=null&&y.width||(x=t==null?void 0:t.effects)!=null&&x.height){let j=new ot,T=typeof t.effects.width=="number"?t.effects.width:100,_=typeof t.effects.height=="number"?t.effects.height:100,O=(I=t.effects.fill_color)!=null?I:"#ffffff",L=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,A=Number.parseInt(String(O).replace("#",""),16);return j.rect(0,0,T,_).fill({color:Number.isFinite(A)?A:16777215,alpha:L}),j}return new Tt}attachObjectInteraction(e,t){if(e){if(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function"){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=i)}e.on("pointerdown",i=>{var a,r,o;((o=(r=(a=i==null?void 0:i.data)==null?void 0:a.originalEvent)==null?void 0:r.button)!=null?o:0)===0&&(this.setSelected(t),this.startDrag("move",i))})}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}applyVisualConfig(e,t){var r,o,l,c,d,p,u;if(!e)return;let i=(r=t==null?void 0:t.render)!=null?r:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n=(d=(c=(o=t==null?void 0:t.render)==null?void 0:o.anchor)!=null?c:(l=t==null?void 0:t.transform)==null?void 0:l.anchor)!=null?d:"center",a=He(n,{x:.5,y:.5});if((p=e.anchor)!=null&&p.set)e.anchor.set(a.x,a.y);else if(e.pivot){let g=(u=e.getLocalBounds)==null?void 0:u.call(e);g&&e.pivot.set(g.width*a.x,g.height*a.y)}}updateObjectTransform(e,t){var l;if(!e)return;let i=(l=t==null?void 0:t.transform)!=null?l:{},n=this.getAnchorLocalPoint(i),a=this.getPositionOffset(i);n&&e.position.set(n.x+a.x,n.y+a.y);let r=typeof i.scale=="number"?i.scale:void 0;typeof r=="number"&&e.scale&&e.scale.set(r);let o=typeof i.rotation=="number"?i.rotation:0;typeof e.rotation=="number"&&(e.rotation=o*Math.PI/180)}getAnchorLocalPoint(e){var a;let t=this.getScreen();if(!(t!=null&&t.width)||!(t!=null&&t.height))return null;let i=(e==null?void 0:e.position_ratio)!=null?Fe(t.width,t.height,e.position_ratio):Ne(t.width,t.height,(a=e==null?void 0:e.anchor)!=null?a:"center"),n=new Se;return this.mainContainer.toLocal(new Se(i.x,i.y),void 0,n),n}getPositionOffset(e){var l,c,d,p,u,g,h,m;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset,n=Array.isArray(t)?Number((l=t[0])!=null?l:0):Number((c=t==null?void 0:t.x)!=null?c:0),a=Array.isArray(t)?Number((d=t[1])!=null?d:0):Number((p=t==null?void 0:t.y)!=null?p:0),r=Array.isArray(i)?Number((u=i[0])!=null?u:0):Number((g=i==null?void 0:i.x)!=null?g:0),o=Array.isArray(i)?Number((h=i[1])!=null?h:0):Number((m=i==null?void 0:i.y)!=null?m:0);return{x:n+r,y:a+o}}updateLayout(e){var m,f,v,b,w,y,x,I;let t=e!=null?e:this.getScreen();if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let n=(((f=(m=this.getEditableConfig())==null?void 0:m.engine)==null?void 0:f.runtime)||{}).layout||{},a=t.width*((v=B.layout.screen_scale_x)!=null?v:1),r=n.design_width_portrait||400,o=a/r;o=Math.min(o,1.15);let l=o*((b=B.engine.scale)!=null?b:1);this.mainContainer.scale.set(l);let c=(w=n.main_container_anchor)!=null?w:"center",d=(y=n.main_container_position_ratio)!=null?y:{x:.5,y:.5},p=(x=n.main_container_offset)!=null?x:{x:0,y:0},u=n.main_container_position_ratio?Fe(t.width,t.height,d):Ne(t.width,t.height,c),g=u.x+p.x+B.layout.position_offset.x,h=u.y+p.y+B.layout.position_offset.y;this.mainContainer.position.set(g,h),this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),(I=this.app)!=null&&I.stage&&(this.app.stage.hitArea=new go(0,0,t.width,t.height)),this.hasUserCamera||this.centerCamera()}centerCamera(){if(!this.app)return;let e=this.getScreen(),t=this.app.renderer.width,i=this.app.renderer.height;this.cameraScale=1,this.camera.scale.set(this.cameraScale),this.camera.position.set((t-e.width)/2,(i-e.height)/2)}updateGizmos(){var d,p;if(!this.selectedId||!this.isVisible){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(p=(d=e.displayObject).getBounds)==null?void 0:p.call(d);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new Se(t.x,t.y)),n=this.camera.toLocal(new Se(t.x+t.width,t.y+t.height)),a=n.x-i.x,r=n.y-i.y,o=i.x+a/2,l=i.y+r/2;this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,r),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9});let c=10;this.moveHandle.clear(),this.moveHandle.circle(0,0,c/2),this.moveHandle.fill({color:16752394,alpha:.9}),this.moveHandle.position.set(o,l),this.scaleHandle.clear(),this.scaleHandle.rect(-c/2,-c/2,c,c),this.scaleHandle.fill({color:3900150,alpha:.9}),this.scaleHandle.position.set(n.x,n.y),this.rotateHandle.clear(),this.rotateHandle.circle(0,0,c/2),this.rotateHandle.fill({color:1096065,alpha:.9}),this.rotateHandle.position.set(o,i.y-20)}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}setSelected(e,t={}){if(this.selectedId!==e&&(this.selectedId=e,this.updateGizmos(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var d,p,u,g,h;if(!this.selectedId||!e||!this.app||((u=(p=(d=t==null?void 0:t.data)==null?void 0:d.originalEvent)==null?void 0:p.button)!=null?u:0)!==0)return;let n=this.objectMap.get(this.selectedId);if(!n)return;let a=this.camera.toLocal(t.data.global),r=n.displayObject;this.dragMode=e,this.dragStartPointer=a.clone(),this.dragStartPos=new Se(r.position.x,r.position.y),this.dragStartScale=typeof((g=r.scale)==null?void 0:g.x)=="number"?r.scale.x:1;let o=this.getEditableObjectConfig(this.selectedId),l=(h=o==null?void 0:o.transform)!=null?h:{};this.dragStartRotationDeg=typeof l.rotation=="number"?l.rotation:0,this.dragAnchorLocal=this.getAnchorLocalPoint(l),this.dragStartValue=this.getDragStartValue(e,l);let c=new Se(r.position.x,r.position.y);this.dragStartAngle=Math.atan2(a.y-c.y,a.x-c.x),this.dragStartDistance=Math.max(1,this.distance(a,c)),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPosition(e,t){var p,u,g,h,m,f;if(!this.selectedId||!this.dragAnchorLocal)return;let i=e-this.dragAnchorLocal.x,n=t-this.dragAnchorLocal.y,a=this.getEditableObjectConfig(this.selectedId);if(!a)return;let r=(p=a.transform)!=null?p:{};a.transform||(a.transform=r);let o=(u=r.offset)!=null?u:{x:0,y:0},l=Array.isArray(o)?Number((g=o[0])!=null?g:0):Number((h=o==null?void 0:o.x)!=null?h:0),c=Array.isArray(o)?Number((m=o[1])!=null?m:0):Number((f=o==null?void 0:o.y)!=null?f:0),d=this.buildPositionValue(r,{x:i-l,y:n-c});this.setNestedValue(r,"position",d)}updateLiveConfigScale(e){var n;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(n=t.transform)!=null?n:{};t.transform||(t.transform=i),i.scale=e}updateLiveConfigRotation(e){var n;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(n=t.transform)!=null?n:{};t.transform||(t.transform=i),i.rotation=e}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),Ve({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&n(t,i)}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let r=0;r<n.length-1;r+=1){let o=n[r];(!a[o]||typeof a[o]!="object")&&(a[o]={}),a=a[o]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position;return Array.isArray(i)?[t.x,t.y]:{x:t.x,y:t.y}}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerInCamera(e,t){if(!this.app)return null;let i=this.app.canvas.getBoundingClientRect(),n=(e-i.left)*(this.app.renderer.width/i.width),a=(t-i.top)*(this.app.renderer.height/i.height),r=new Se;return this.camera.toLocal(new Se(n,a),void 0,r),r}};var Fn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[it("playable-portrait"),it("iphone-14"),it("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.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=it(e.defaultDevice||on.id),this.debugPanel=new Pi,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let t=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=t===null?!0:t==="true"}catch{}this.sceneEditor=new Di({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=it(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(),this.updateSceneVisibility(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let d=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:d})},r=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",r),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",r),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,r=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,d=Math.max(200,Math.min(600,a+c));e.style.width=`${d}px`;let p=this.container.querySelector(".preview-main");if(p){let g=i==="left"?`${d}px`:p.style.gridTemplateColumns.split(" ")[0]||"300px",h=i==="right"?`${d}px`:p.style.gridTemplateColumns.split(" ")[2]||"350px";p.style.gridTemplateColumns=`${g} 1fr ${h}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&Ye(this.scenePane,e,i!=null?i:this.previewContainer),t&&Ti(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let r=a.clientX,o=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=p=>{let u=p.clientX-r,g=Math.max(240,Math.min(l,o+u));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
2107
2192
  <div class="preview-toolbar">
2108
2193
  <div class="preview-toolbar-left">
2109
2194
  <span class="preview-logo">PREVIEWER</span>
@@ -2112,7 +2197,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2112
2197
  <div class="preview-toolbar-center">
2113
2198
  <div class="device-selector-wrapper">
2114
2199
  <select class="device-dropdown" id="device-select">
2115
- ${Wa.map(i=>`
2200
+ ${tr.map(i=>`
2116
2201
  <optgroup label="${i.label}">
2117
2202
  ${i.devices.map(n=>`
2118
2203
  <option value="${n.id}" ${n.id===this.currentPreset.id?"selected":""}>
@@ -2181,6 +2266,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2181
2266
  Save <span class="preview-save-shortcut" id="preview-save-shortcut-text"></span>
2182
2267
  </button>
2183
2268
  <button class="preview-btn" id="refresh-btn">Restart</button>
2269
+ <button class="preview-btn scene-toggle" id="scene-toggle" aria-pressed="true">Scene View</button>
2184
2270
  <button class="preview-btn debug-toggle" id="debug-toggle">
2185
2271
  Scene Edit Panel <span class="debug-toggle-badge" id="debug-badge"></span>
2186
2272
  </button>
@@ -2191,42 +2277,61 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2191
2277
  </div>
2192
2278
 
2193
2279
  <div class="preview-main">
2194
-
2195
2280
  <div class="preview-container">
2196
- <div class="preview-stage" data-preview-stage="single">
2197
- <div class="frame-dragger">
2198
- <div class="frame-wrapper">
2199
- <div class="device-frame">
2200
- <div class="game-container"></div>
2281
+ <div class="preview-split" data-preview-split>
2282
+ <div class="scene-editor-pane" data-scene-pane>
2283
+ <div class="scene-editor-header">
2284
+ <div class="scene-editor-title">Scene View</div>
2285
+ <div class="scene-editor-actions">
2286
+ <button class="debug-btn debug-btn-sm" type="button" id="scene-hide-btn">Hide</button>
2287
+ </div>
2288
+ <div class="scene-editor-drag-handle" data-scene-drag-handle title="Drag Scene View">
2289
+ \u22EE\u22EE
2201
2290
  </div>
2202
2291
  </div>
2203
- </div>
2204
- </div>
2205
-
2206
- <div class="preview-stage hidden" data-preview-stage="compare">
2207
- <div class="compare-grid" data-compare-grid>
2208
- ${this.comparePresets.map(i=>`
2209
- <div class="compare-viewport" data-viewport="${i.id}">
2210
- <div class="compare-header">
2211
- <div class="compare-title">
2212
- <span class="compare-title-text">${i.label}</span>
2213
- <span class="compare-meta">${i.ratio} | ${i.width}x${i.height}</span>
2292
+ <div class="scene-editor-body">
2293
+ <div class="scene-editor-root" id="scene-editor-root"></div>
2294
+ </div>
2295
+ <div class="scene-editor-resize-handle" data-scene-resize></div>
2296
+ </div>
2297
+ <div class="scene-splitter" data-scene-splitter></div>
2298
+ <div class="game-view-pane" data-game-pane>
2299
+ <div class="preview-stage" data-preview-stage="single">
2300
+ <div class="frame-dragger">
2301
+ <div class="frame-wrapper">
2302
+ <div class="device-frame">
2303
+ <div class="game-container"></div>
2214
2304
  </div>
2215
- <button class="compare-focus" data-compare-focus type="button">Focus</button>
2216
2305
  </div>
2217
- <div class="compare-body">
2218
- <div class="compare-slot" data-compare-slot></div>
2219
- <div class="compare-ghost" data-compare-ghost>
2220
- <div class="frame-wrapper" data-compare-wrapper>
2221
- <div class="device-frame" data-compare-frame>
2222
- <canvas class="snapshot-canvas" data-compare-snapshot></canvas>
2306
+ </div>
2307
+ </div>
2308
+
2309
+ <div class="preview-stage hidden" data-preview-stage="compare">
2310
+ <div class="compare-grid" data-compare-grid>
2311
+ ${this.comparePresets.map(i=>`
2312
+ <div class="compare-viewport" data-viewport="${i.id}">
2313
+ <div class="compare-header">
2314
+ <div class="compare-title">
2315
+ <span class="compare-title-text">${i.label}</span>
2316
+ <span class="compare-meta">${i.ratio} | ${i.width}x${i.height}</span>
2317
+ </div>
2318
+ <button class="compare-focus" data-compare-focus type="button">Focus</button>
2319
+ </div>
2320
+ <div class="compare-body">
2321
+ <div class="compare-slot" data-compare-slot></div>
2322
+ <div class="compare-ghost" data-compare-ghost>
2323
+ <div class="frame-wrapper" data-compare-wrapper>
2324
+ <div class="device-frame" data-compare-frame>
2325
+ <canvas class="snapshot-canvas" data-compare-snapshot></canvas>
2326
+ </div>
2327
+ </div>
2223
2328
  </div>
2329
+ <div class="compare-overlay" data-compare-overlay>Click to focus</div>
2224
2330
  </div>
2225
2331
  </div>
2226
- <div class="compare-overlay" data-compare-overlay>Click to focus</div>
2227
- </div>
2332
+ `).join("")}
2228
2333
  </div>
2229
- `).join("")}
2334
+ </div>
2230
2335
  </div>
2231
2336
  </div>
2232
2337
  </div>
@@ -2273,7 +2378,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2273
2378
  </div>
2274
2379
 
2275
2380
  </div>
2276
- `,this.setupEventListeners(e),e}setupEventListeners(e){var g,m,h,f,b,v,x,y;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",w=>{if(this.viewMode==="compare")return;let I=w.target.value;this.setDevice(I)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",w=>{let I=w.target.value;this.setTheme(I)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(w=>{w.addEventListener("click",()=>{let I=w.dataset.viewToggle;I&&this.setViewMode(I)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(w=>{w.addEventListener("click",()=>{let I=w.dataset.layoutToggle;I&&this.setLayoutMode(I)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(m=e.querySelector("#zoom-in-btn"))==null||m.addEventListener("click",()=>this.adjustUserZoom(.1)),(h=e.querySelector("#zoom-out-btn"))==null||h.addEventListener("click",()=>this.adjustUserZoom(-.1)),(f=e.querySelector("#refresh-btn"))==null||f.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(w=>{w.addEventListener("click",()=>{let I=w.dataset.dockTab;if(!I)return;l.forEach(k=>k.classList.remove("active")),w.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(k=>{let j=k.dataset.dockPanel;k.classList.toggle("active",j===I)})})}),(b=e.querySelector("#console-clear"))==null||b.addEventListener("click",()=>this.clearConsole()),(v=e.querySelector("#corner-zoom-in-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(.1)),(x=e.querySelector("#corner-zoom-out-btn"))==null||x.addEventListener("click",()=>this.adjustUserZoom(-.1)),(y=e.querySelector("#corner-grab-btn"))==null||y.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),d=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&d&&this.makeSidebarResizable(c,d,"left");let p=e.querySelector(".debug-workbench"),u=p==null?void 0:p.querySelector("#workbench-resize-v");p&&u&&this.makeSidebarResizable(p,u,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let s=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(s,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),ua();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),ga();return}})}setupUnsavedChangesIndicator(){let e=this.container.querySelector("#preview-save-shortcut-text");e&&(e.textContent=`(${this.getShortcutKey()} + S)`),window.addEventListener("config:changed",()=>{this.updateUnsavedChangesIndicator()}),this.updateUnsavedChangesIndicator();let t=this.container.querySelector("#preview-save-btn");t==null||t.addEventListener("click",()=>{let i=document.querySelector("#apply-current-btn");i&&i.getAttribute("disabled")===null&&i.click()})}updateUnsavedChangesIndicator(){let t=Ve().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.container.querySelector("#preview-unsaved-star"),n=this.container.querySelector("#preview-save-btn");i&&(i.style.display=t?"inline-block":"none"),n&&(n.style.display=t?"inline-flex":"none")}}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(s=>typeof s=="object"?this.safeStringify(s):String(s)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let s=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=s>0?`${s}!`:"0",a.classList.toggle("has-errors",s>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(p=>p.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),s=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!a||!s||!o||!l||(t.addEventListener("click",p=>{let u=p.target;if(u!=null&&u.closest("[data-compare-focus]")){p.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:s,wrapper:o,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,s;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(s=(a=this.options).onDeviceChange)==null||s.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,s=n/e.preset.height,o=Math.max(.01,Math.min(a,s));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,s=t.canvas.height,o=Math.min(a/i.width,s/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,p=(s-c)/2;n.clearRect(0,0,a,s),n.drawImage(i,d,p,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function jr(r={}){let e=new In(r);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}import{Sprite as js,Container as _r}from"pixi.js";var _s=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",jn=_s;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&&(jn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${jn}`))}}catch{}function Os(r){var t,i,n,a,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(r);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(r))return{x:(t=r[0])!=null?t:.5,y:(i=r[1])!=null?i:.5};if(r&&typeof r=="object"&&"x"in r&&"y"in r)return{x:(n=r.x)!=null?n:.5,y:(a=r.y)!=null?a:.5};if(typeof r=="string"){let o=r.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var De=class{static async create(e,t,i){var l,c,d,p,u,g,m;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${jn}`);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 _r;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: ${(d=s==null?void 0:s.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new js(s),console.log("[ObjectFactory] Created object:",o,"type:",(p=o==null?void 0:o.constructor)==null?void 0:p.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=s==null?void 0:s.constructor)==null?void 0:u.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof _r)){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}`],f=!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:",(m=o==null?void 0:o.constructor)==null?void 0:m.name),f=!0;break}}catch{continue}f||(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=Os(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};function _n(r){try{if(r&&typeof r.keys=="function")return Array.from(r.keys())}catch{}return[]}function Or(r){var e;return r?((e=r.getDisplayObject)==null?void 0:e.call(r))||r.pixiObject||r:null}function Rs(r,e){if(!r||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);r.eventMode=i?"static":"none",r.interactive=i,i&&(r.cursor=t.draggable?"move":"pointer")}function Rr(r,e){var l,c,d;if(!r||!e)return;let t=e.transform||{};Rs(r,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),s=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=r.position)!=null&&l.set?r.position.set(a,s):(typeof r.x=="number"&&(r.x=a),typeof r.y=="number"&&(r.y=s)),typeof t.scale=="number"&&((c=r.scale)!=null&&c.set?r.scale.set(t.scale):r.scale&&(r.scale.x=t.scale,r.scale.y=t.scale));let o=t.anchor;if(o&&((d=r.anchor)!=null&&d.set)){let p=null;typeof window!="undefined"&&window.resolveAnchorVec2?p=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?p=o:Array.isArray(o)&&o.length===2&&(p={x:o[0],y:o[1]}),p&&typeof p.x=="number"&&typeof p.y=="number"&&r.anchor.set(p.x,p.y)}}function zr(r){if(typeof window=="undefined")return;let e=r==null?void 0:r.objects,t=_n(e),i=a=>{try{let s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===s):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>zr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(_n((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return _n((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var d,p,u,g,m;let s=(g=(u=(p=(d=window.__editableConfig)==null?void 0:d.objects)==null?void 0:p.get)==null?void 0:u.call(p,a))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return s;let l=window.__HANDLER_SCREEN_INDEX,c=(m=l==null?void 0:l.instanceToScreen)==null?void 0:m[a];return c&&c===o?s:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let s={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return a}}function zs(){if(typeof window=="undefined")return;let r=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,s,o;let n=r(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),d=Date.now(),p=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),u=await l.load(p);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let m=window.gameObjectManager,h=(s=m==null?void 0:m.get)==null?void 0:s.call(m,t);if(h){let f=((o=h.getDisplayObject)==null?void 0:o.call(h))||h.pixiObject||h.pixi||h;if(f!=null&&f.texture)f.texture=u;else if(f!=null&&f.children){let b=f.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=Gi();Array.isArray(i)&&i.length&&(window.__editableConfig=t,$t(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Gi();Array.isArray(i)&&i.length&&(window.__editableConfig=t,$t(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&&$t(n,{silent:!0,persist:!0,emitEvent:!0})}}function On(r){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=r;t&&(t.onObjectRebuildRequired=async(a,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let p=window.gameApp,u=await De.create(a,s,p);c&&(d!==void 0&&d!==-1?c.addChildAt(u,d):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(zs(),window.applyEditableObjectConfig=(a,s)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(a,s),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let p=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!p),p&&(console.log("[LIVE-EDIT] gameObject type:",(c=p.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof p.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof p.onConfigUpdate=="function")),p&&typeof p.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),p.updateConfig(s);else if(p&&typeof p.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),p.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=Or(p);Rr(u,s)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,s){var d,p;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(a,s),console.log("[BRIDGE] \u2705 Updated config"));let l=(p=t==null?void 0:t.get)==null?void 0:p.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(s);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=Or(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";$n(Va);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},Hn,Et,Hr,it,zn,Dn;function Nd(r){Hn=r.initGame,Et=r.CustomAssets,Hr=r.updateScreenState,it=r.globalResponsiveMultipliers,zn=r.layout,Dn=r.clearResponsiveElements}var Ai="web_embed",wt="https://example.com",Dr={profile_id:Ai},$e=null,xe=null,Rn={width:0,height:0},Hs=!0,Bd=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let r=await $s();Dr={...r.ids||{},profile_id:Ai},wt=r.destination_url||((d=(c=r.export_profiles)==null?void 0:c[Ai])==null?void 0:d.destination_url)||wt,Ce.init({ids:Dr,profile:Ai,destinationUrl:wt});let e=Ce.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),xe=jr({onDeviceChange:m=>{console.log(`[PREVIEW] Device switched to ${m.width}x${m.height}, restarting game...`),$r()},onRefresh:$r});let g=xe.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",m=>{var x,y,w,I,R,k,j,_,C,A,L;let h=window.gameApp,f=window.gameObjectManager,{width:b,height:v}=m.detail;if(Rn.width=b,Rn.height=v,Hr(b,v),!(!h||!h.renderer)){f&&o(h,f);try{h.renderer.resize(b,v);let T=h.view;T&&(T.style.width="100%",T.style.height="100%",T.style.display="block")}catch(T){console.warn("[SCREEN] Error resizing renderer:",T);return}if(t&&f&&zn)try{let T=(x=window.__mainContainer)!=null?x:h.stage,S=(j=(k=(I=window.__tutorialLabel)!=null?I:(w=(y=f.get("label_1"))==null?void 0:y.getDisplayObject)==null?void 0:w.call(y))!=null?k:(R=f.get("label_1"))==null?void 0:R.pixiObject)!=null?j:f.get("label_1"),E=f.get("background_1"),P=(L=(A=(C=window.__background)!=null?C:(_=E==null?void 0:E.getDisplayObject)==null?void 0:_.call(E))!=null?A:E==null?void 0:E.pixiObject)!=null?L:E;if(T){let M=T===h.stage;zn({mainContainer:T,label:S,background:P,backgroundTexture:(P==null?void 0:P.texture)||null,app:h},t,0,Rn,f,{skipMainContainerTransform:M})}}catch(T){console.warn("[SCREEN] Error in layout:",T)}}})}let t=await Nt("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=qi(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(p=t.engine.runtime)==null?void 0:p.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Nt("scene.main"));let i=await Hn(e,t,wt,xe);$e=i.app;let n=i.gameObjectManager;window.gameApp=$e,window.gameObjectManager=n;try{window.__liveEditBridge=On({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Et})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}xe&&xe.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(it.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o($e,n);async function s(){try{let g=async v=>{let x=v.startsWith("/")?v:`/${v}`,y=await fetch(x,{cache:"no-cache"});if(!y.ok)return null;let w=await y.text();try{return JSON.parse(w)}catch{return null}},m=await g("configs/flow/app.flow.json");if(!m||typeof m!="object")return;let h=m.screens;if(!h||typeof h!="object")return;let f={},b={};for(let[v,x]of Object.entries(h)){let y=x==null?void 0:x.source;if(typeof y!="string")continue;let w=await g(y),I=w==null?void 0:w.elements;if(!Array.isArray(I))continue;let R=I.map(k=>k==null?void 0:k.instance_id).filter(k=>typeof k=="string");f[v]=R;for(let k of R)b[k]||(b[k]=v)}window.__HANDLER_APP_FLOW=m,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,m){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 f=function(b,v=0){if(!b||!b.children)return;let x=" ".repeat(v);b.children.forEach((y,w)=>{if(y&&y.zIndex===9999){console.log(`${x}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(y&&y.scale){let I=y.scale.x||1,R=y.scale.y||1;y.__originalScale||(y.__originalScale={x:I,y:R},console.log(`${x}[RESPONSIVE] Stored original scale for child[${w}]: ${I.toFixed(3)}, ${R.toFixed(3)}`));let k=y.__originalScale.x*it.scale,j=y.__originalScale.y*it.scale;typeof y.scale.set=="function"?y.scale.set(k,j):(y.scale.x=k,y.scale.y=j),console.log(`${x}[RESPONSIVE] Child[${w}] scale: ${I.toFixed(3)}\u2192${y.scale.x.toFixed(3)} (type: ${y.constructor.name})`),f(y,v+1)}else y&&console.log(`${x}[RESPONSIVE] Child[${w}] has no scale (type: ${y.constructor.name})`)})};var h=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){it.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let m=window.gameApp,h=window.gameObjectManager;m&&h?(o(m,h),m.renderer&&(m.renderer.render(m.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!m}) 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(xe){xe.notifyGameDestroyed();try{Dn&&Dn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=xe.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),$e){try{$e.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}$e=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof Et.resetScene=="function"&&Et.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Nt("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=qi(o)),Hn(a,o,wt).then(l=>{$e=l.app,window.gameApp=$e,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=On({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Et})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}xe&&xe.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Ce.start()}catch{}})})},100)},1e3)}};var Le={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Ns=1.25,Bs={fontFamily:"Inter, system-ui, sans-serif"};var Nn=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=`
2381
+ `,this.setupEventListeners(e),e}setupEventListeners(e){var m,f,v,b,w,y,x,I;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",j=>{if(this.viewMode==="compare")return;let T=j.target.value;this.setDevice(T)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",j=>{let T=j.target.value;this.setTheme(T)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(j=>{j.addEventListener("click",()=>{let T=j.dataset.viewToggle;T&&this.setViewMode(T)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(j=>{j.addEventListener("click",()=>{let T=j.dataset.layoutToggle;T&&this.setLayoutMode(T)})});let r=e.querySelector("#scene-toggle");r==null||r.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let o=e.querySelector("#scene-hide-btn");o==null||o.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())}),(m=e.querySelector("#rotate-btn"))==null||m.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(v=e.querySelector("#zoom-out-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(-.1)),(b=e.querySelector("#refresh-btn"))==null||b.addEventListener("click",()=>this.refresh());let l=e.querySelector("#bottom-dock"),c=e.querySelector("#bottom-dock-resize");l&&c&&this.makeBottomDockResizable(l,c);let d=Array.from(e.querySelectorAll(".bottom-dock-tab"));d.forEach(j=>{j.addEventListener("click",()=>{let T=j.dataset.dockTab;if(!T)return;d.forEach(O=>O.classList.remove("active")),j.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(O=>{let L=O.dataset.dockPanel;O.classList.toggle("active",L===T)})})}),(w=e.querySelector("#console-clear"))==null||w.addEventListener("click",()=>this.clearConsole()),(y=e.querySelector("#corner-zoom-in-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(.1)),(x=e.querySelector("#corner-zoom-out-btn"))==null||x.addEventListener("click",()=>this.adjustUserZoom(-.1)),(I=e.querySelector("#corner-grab-btn"))==null||I.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let p=e.querySelector(".scene-panel.scene-objects"),u=p==null?void 0:p.querySelector("[data-panel-resize-v]");p&&u&&this.makeSidebarResizable(p,u,"left");let g=e.querySelector(".debug-workbench"),h=g==null?void 0:g.querySelector("#workbench-resize-v");g&&h&&this.makeSidebarResizable(g,h,"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 r=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(r,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.gameViewPane||this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),ya();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),wa();return}})}setupUnsavedChangesIndicator(){let e=this.container.querySelector("#preview-save-shortcut-text");e&&(e.textContent=`(${this.getShortcutKey()} + S)`),window.addEventListener("config:changed",()=>{this.updateUnsavedChangesIndicator()}),this.updateUnsavedChangesIndicator();let t=this.container.querySelector("#preview-save-btn");t==null||t.addEventListener("click",()=>{let i=document.querySelector("#apply-current-btn");i&&i.getAttribute("disabled")===null&&i.click()})}updateUnsavedChangesIndicator(){let t=Ze().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.container.querySelector("#preview-unsaved-star"),n=this.container.querySelector("#preview-save-btn");i&&(i.style.display=t?"inline-block":"none"),n&&(n.style.display=t?"inline-flex":"none")}}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(r=>typeof r=="object"?this.safeStringify(r):String(r)).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 r=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=r>0?`${r}!`:"0",a.classList.toggle("has-errors",r>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(p=>p.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),r=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!a||!r||!o||!l||(t.addEventListener("click",p=>{let u=p.target;if(u!=null&&u.closest("[data-compare-focus]")){p.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:r,wrapper:o,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,r;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}),(r=(a=this.options).onDeviceChange)==null||r.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,r=n/e.preset.height,o=Math.max(.01,Math.min(a,r));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,r=t.canvas.height,o=Math.min(a/i.width,r/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,p=(r-c)/2;n.clearRect(0,0,a,r),n.drawImage(i,d,p,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.clientHeight-40}}let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function Br(s={}){let e=new Fn(s);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}function Bn(s){try{if(s&&typeof s.keys=="function")return Array.from(s.keys())}catch{}return[]}function Ur(s){var e;return s?((e=s.getDisplayObject)==null?void 0:e.call(s))||s.pixiObject||s:null}function fo(s,e){if(!s||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);s.eventMode=i?"static":"none",s.interactive=i,i&&(s.cursor=t.draggable?"move":"pointer")}function Gr(s,e){var l,c,d;if(!s||!e)return;let t=e.transform||{};fo(s,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),r=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=s.position)!=null&&l.set?s.position.set(a,r):(typeof s.x=="number"&&(s.x=a),typeof s.y=="number"&&(s.y=r)),typeof t.scale=="number"&&((c=s.scale)!=null&&c.set?s.scale.set(t.scale):s.scale&&(s.scale.x=t.scale,s.scale.y=t.scale));let o=t.anchor;if(o&&((d=s.anchor)!=null&&d.set)){let p=null;typeof window!="undefined"&&window.resolveAnchorVec2?p=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?p=o:Array.isArray(o)&&o.length===2&&(p={x:o[0],y:o[1]}),p&&typeof p.x=="number"&&typeof p.y=="number"&&s.anchor.set(p.x,p.y)}}function qr(s){if(typeof window=="undefined")return;let e=s==null?void 0:s.objects,t=Bn(e),i=a=>{try{let r=window.__HANDLER_ACTIVE_SCREEN;if(!r||r==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===r):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>qr(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Bn((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Bn((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var d,p,u,g,h;let r=(g=(u=(p=(d=window.__editableConfig)==null?void 0:d.objects)==null?void 0:p.get)==null?void 0:u.call(p,a))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let l=window.__HANDLER_SCREEN_INDEX,c=(h=l==null?void 0:l.instanceToScreen)==null?void 0:h[a];return c&&c===o?r: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 r={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(r.assets||{})),r}return a}}function bo(){if(typeof window=="undefined")return;let s=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,r,o;let n=s(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),import("./AssetTextures-67BIZDFD.js")]),d=Date.now(),p=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),u=await l.load(p);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let h=window.gameObjectManager,m=(r=h==null?void 0:h.get)==null?void 0:r.call(h,t);if(m){let f=((o=m.getDisplayObject)==null?void 0:o.call(m))||m.pixiObject||m.pixi||m;if(f!=null&&f.texture)f.texture=u;else if(f!=null&&f.children){let v=f.children.find(b=>b==null?void 0:b.texture);v!=null&&v.texture&&(v.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Ji();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ft(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Ji();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ft(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,r]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:r});if(t.assets)for(let[a,r]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:r}),typeof r=="string"&&e(a,r);if(t.splash)for(let[a,r]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:r});if(t.loading)for(let[a,r]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:r});if(t.start)for(let[a,r]of Object.entries(t.start))n.push({path:`start.${a}`,value:r});n.length&&Ft(n,{silent:!0,persist:!0,emitEvent:!0})}}function Un(s){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=s;t&&(t.onObjectRebuildRequired=async(a,r)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let p=window.gameApp,u=await we.create(a,r,p);c&&(d!==void 0&&d!==-1?c.addChildAt(u,d):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(bo(),window.applyEditableObjectConfig=(a,r)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(a,r),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let p=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!p),p&&(console.log("[LIVE-EDIT] gameObject type:",(c=p.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof p.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof p.onConfigUpdate=="function")),p&&typeof p.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),p.updateConfig(r);else if(p&&typeof p.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),p.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=Ur(p);Gr(u,r)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,r){var d,p;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(a,r),console.log("[BRIDGE] \u2705 Updated config"));let l=(p=t==null?void 0:t.get)==null?void 0:p.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(r);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=Ur(l);Gr(u,r)}let c=[a];i==null||i(a,r,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,qr(a))}};return n.rebuildIndexes(),n}import vo from"lottie-web";Wn(Qa);typeof window!="undefined"&&!window.lottie&&(window.lottie=vo);var lt=null,yo=async()=>{if(!lt){let s=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(s==null?void 0:s["handler.config"])||(s==null?void 0:s["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);lt=JSON.parse(i)}else lt=JSON.parse(e);return lt}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}lt=await(await fetch("./handler.config.json")).json()}return lt},Yn,kt,Yr,ct,qn,Vn;function hp(s){Yn=s.initGame,kt=s.CustomAssets,Yr=s.updateScreenState,ct=s.globalResponsiveMultipliers,qn=s.layout,Vn=s.clearResponsiveElements}var $i="web_embed",Lt="https://example.com",Vr={profile_id:$i},Be=null,Ee=null,Gn={width:0,height:0},wo=!0,mp=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let s=await yo();Vr={...s.ids||{},profile_id:$i},Lt=s.destination_url||((d=(c=s.export_profiles)==null?void 0:c[$i])==null?void 0:d.destination_url)||Lt,Pe.init({ids:Vr,profile:$i,destinationUrl:Lt});let e=Pe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),Ee=Br({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),Wr()},onRefresh:Wr});let g=Ee.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var w,y,x,I,j,T,_,O,L,A,k;let m=window.gameApp,f=window.gameObjectManager,{width:v,height:b}=h.detail;if(Gn.width=v,Gn.height=b,Yr(v,b),!(!m||!m.renderer)){f&&o(m,f);try{m.renderer.resize(v,b);let C=m.view;C&&(C.style.width="100%",C.style.height="100%",C.style.display="block")}catch(C){console.warn("[SCREEN] Error resizing renderer:",C);return}if(t&&f&&qn)try{let C=(w=window.__mainContainer)!=null?w:m.stage,E=(_=(T=(I=window.__tutorialLabel)!=null?I:(x=(y=f.get("label_1"))==null?void 0:y.getDisplayObject)==null?void 0:x.call(y))!=null?T:(j=f.get("label_1"))==null?void 0:j.pixiObject)!=null?_:f.get("label_1"),S=f.get("background_1"),M=(k=(A=(L=window.__background)!=null?L:(O=S==null?void 0:S.getDisplayObject)==null?void 0:O.call(S))!=null?A:S==null?void 0:S.pixiObject)!=null?k:S;if(C){let P=C===m.stage;qn({mainContainer:C,label:E,background:M,backgroundTexture:(M==null?void 0:M.texture)||null,app:m},t,0,Gn,f,{skipMainContainerTransform:P})}}catch(C){console.warn("[SCREEN] Error in layout:",C)}}})}let t=await Ut("scene.main");window.__editableConfig=t,r(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Zi(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(p=t.engine.runtime)==null?void 0:p.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Ut("scene.main"));let i=await Yn(e,t,Lt,Ee);Be=i.app;let n=i.gameObjectManager;window.gameApp=Be,window.gameObjectManager=n;try{window.__liveEditBridge=Un({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:kt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}Ee&&Ee.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(ct.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(Be,n);async function r(){try{let g=async b=>{let w=b.startsWith("/")?b:`/${b}`,y=await fetch(w,{cache:"no-cache"});if(!y.ok)return null;let x=await y.text();try{return JSON.parse(x)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let m=h.screens;if(!m||typeof m!="object")return;let f={},v={};for(let[b,w]of Object.entries(m)){let y=w==null?void 0:w.source;if(typeof y!="string")continue;let x=await g(y),I=x==null?void 0:x.elements;if(!Array.isArray(I))continue;let j=I.map(T=>T==null?void 0:T.instance_id).filter(T=>typeof T=="string");f[b]=j;for(let T of j)v[T]||(v[T]=b)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:v},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,h){if(wo){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${ct.scale.toFixed(3)}`),g.stage){let f=function(v,b=0){if(!v||!v.children)return;let w=" ".repeat(b);v.children.forEach((y,x)=>{if(y&&y.zIndex===9999){console.log(`${w}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(y&&y.scale){let I=y.scale.x||1,j=y.scale.y||1;y.__originalScale||(y.__originalScale={x:I,y:j},console.log(`${w}[RESPONSIVE] Stored original scale for child[${x}]: ${I.toFixed(3)}, ${j.toFixed(3)}`));let T=y.__originalScale.x*ct.scale,_=y.__originalScale.y*ct.scale;typeof y.scale.set=="function"?y.scale.set(T,_):(y.scale.x=T,y.scale.y=_),console.log(`${w}[RESPONSIVE] Child[${x}] scale: ${I.toFixed(3)}\u2192${y.scale.x.toFixed(3)} (type: ${y.constructor.name})`),f(y,b+1)}else y&&console.log(`${w}[RESPONSIVE] Child[${x}] has no scale (type: ${y.constructor.name})`)})};var m=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){ct.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,m=window.gameObjectManager;h&&m?(o(h,m),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!m}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Pe.start()},Wr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let s=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(s){let a=((t=s.getDisplayObject)==null?void 0:t.call(s))||s;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(Ee){Ee.notifyGameDestroyed();try{Vn&&Vn()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=Ee.getGameContainer(),r=window.gameObjectManager;if(r&&typeof r.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),r.clear()),Be){try{Be.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}Be=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof kt.resetScene=="function"&&kt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Ut("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Zi(o)),Yn(a,o,Lt).then(l=>{Be=l.app,window.gameApp=Be,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Un({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:kt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}Ee&&Ee.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Pe.start()}catch{}})})},100)},1e3)}};var Me={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},xo=1.25,So={fontFamily:"Inter, system-ui, sans-serif"};var Kn=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=`
2277
2382
  position: fixed;
2278
2383
  inset: 0;
2279
2384
  display: flex;
@@ -2282,7 +2387,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2282
2387
  z-index: 50;
2283
2388
  user-select: none;
2284
2389
  overflow: hidden;
2285
- background-color: ${Le.background};
2390
+ background-color: ${Me.background};
2286
2391
  `;let t=document.createElement("div");t.style.cssText=`
2287
2392
  position: relative;
2288
2393
  width: 288px;
@@ -2308,17 +2413,17 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2308
2413
  justify-content: space-between;
2309
2414
  align-items: flex-end;
2310
2415
  margin-bottom: 8px;
2311
- `;let s=document.createElement("span");s.style.cssText=`
2416
+ `;let r=document.createElement("span");r.style.cssText=`
2312
2417
  font-size: 12px;
2313
2418
  font-weight: 900;
2314
2419
  letter-spacing: 0.15em;
2315
- color: ${Le.ink};
2316
- `,s.innerHTML='LOADING<span class="loading-dots" style="animation: pulse 1.5s infinite;">..</span>',this.progressText=document.createElement("span"),this.progressText.style.cssText=`
2420
+ color: ${Me.ink};
2421
+ `,r.innerHTML='LOADING<span class="loading-dots" style="animation: pulse 1.5s infinite;">..</span>',this.progressText=document.createElement("span"),this.progressText.style.cssText=`
2317
2422
  font-size: 10px;
2318
2423
  font-family: monospace;
2319
2424
  font-weight: bold;
2320
- color: ${Le.primaryAccent};
2321
- `,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,a.appendChild(s),a.appendChild(this.progressText);let o=document.createElement("div");o.style.cssText=`
2425
+ color: ${Me.primaryAccent};
2426
+ `,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,a.appendChild(r),a.appendChild(this.progressText);let o=document.createElement("div");o.style.cssText=`
2322
2427
  height: 4px;
2323
2428
  width: 100%;
2324
2429
  background-color: #E0DDD8;
@@ -2332,7 +2437,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2332
2437
  border-radius: 9999px;
2333
2438
  position: relative;
2334
2439
  width: ${this.currentProgress}%;
2335
- background-color: ${Le.primaryAccent};
2440
+ background-color: ${Me.primaryAccent};
2336
2441
  `;let l=document.createElement("div");l.style.cssText=`
2337
2442
  position: absolute;
2338
2443
  inset: 0;
@@ -2361,7 +2466,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2361
2466
  left: 50%;
2362
2467
  transform: translateX(-50%);
2363
2468
  overflow: visible;
2364
- `,"HANDLER".split("").forEach((u,g)=>{let m=document.createElement("div");m.textContent=u,m.style.cssText=`
2469
+ `,"HANDLER".split("").forEach((u,g)=>{let h=document.createElement("div");h.textContent=u,h.style.cssText=`
2365
2470
  position: absolute;
2366
2471
  width: 28px;
2367
2472
  height: 40px;
@@ -2371,12 +2476,12 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2371
2476
  font-size: 24px;
2372
2477
  letter-spacing: -0.05em;
2373
2478
  animation: handlerMove 2.5s linear infinite;
2374
- color: ${Le.ink};
2479
+ color: ${Me.ink};
2375
2480
  display: flex;
2376
2481
  align-items: center;
2377
2482
  justify-content: center;
2378
2483
  animation-delay: ${[1.05,.875,.7,.525,.35,.175,0][g]}s;
2379
- `,d.appendChild(m)}),t.appendChild(n),t.appendChild(d),this.authSeq=document.createElement("div"),this.authSeq.style.cssText=`
2484
+ `,d.appendChild(h)}),t.appendChild(n),t.appendChild(d),this.authSeq=document.createElement("div"),this.authSeq.style.cssText=`
2380
2485
  position: absolute;
2381
2486
  bottom: 48px;
2382
2487
  font-size: 8px;
@@ -2384,7 +2489,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2384
2489
  letter-spacing: 0.3em;
2385
2490
  opacity: 0.2;
2386
2491
  text-transform: uppercase;
2387
- color: ${Le.ink};
2492
+ color: ${Me.ink};
2388
2493
  `,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`,e.appendChild(t),e.appendChild(this.authSeq),this.injectStyles(),e}injectStyles(){if(document.getElementById("handler-loading-screen-styles"))return;let e=document.createElement("style");e.id="handler-loading-screen-styles",e.textContent=`
2389
2494
  /* Box Loading Styles */
2390
2495
  .boxLoading {
@@ -2415,7 +2520,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2415
2520
  content: '';
2416
2521
  width: 50px;
2417
2522
  height: 50px;
2418
- background: ${Le.primaryAccent};
2523
+ background: ${Me.primaryAccent};
2419
2524
  animation: animate 0.5s linear infinite;
2420
2525
  position: absolute;
2421
2526
  top: 0;
@@ -2472,7 +2577,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2472
2577
  0%, 100% { opacity: 1; }
2473
2578
  50% { opacity: 0.3; }
2474
2579
  }
2475
- `,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 Bn=Ca.version,Fs=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"]);Ta();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",qn={},At,Fn=!1,St=!1,Ct=!1,Kr=!1,Kn=1,Ci=0,Mi=!1,ke=!1,at="",st=Math.floor(window.innerWidth),ot=Math.floor(window.innerHeight),Vn=st>ot,Me=!1,Tt=!1,Nr=!1,Br=!1,Un=!1,Li=null,Ge=null,Yn=!1,Wn=!1,Ti=new Map;function Xr(){if(!Ge)return null;let r=Date.now()-Ge;return!Number.isFinite(r)||r<0?null:r}function Gn(r){if(Yn)return;let e=Xr();e!==null&&(Yn=!0,z("session_time",{duration_ms:e,reason:r}))}function Fr(){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 ki(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:At,payload:e}}function z(r,e){let t=ki(r),i=Jr(t,e);Wi(i,!!qn.analytics),Ft(t,i),t!==r&&Ft(r,i)}function Lt(){Li&&(Li(st,ot),Li=null)}function lt(r){Kn=r,z("volume",r)}function ct(r){r&&(Kr=!0),!Ct&&(Ct=!0,z("pause"),lt(0))}function kt(r){!r&&Kr||Ct&&(Ct=!1,z("resume"),lt(Kn))}function He(r,e){st=Math.floor(r||window.innerWidth),ot=Math.floor(e||window.innerHeight),Vn=st>ot,z("resize",{width:st,height:ot})}function Us(){if($a())try{let r=mraid.getMaxSize();He(r.width,r.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?kt():ct()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();He(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)}),Mi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Me=!0,z("boot"),z("view"),z("ready"),ke=!0,Lt();else{let t=()=>{Me=!0,z("boot"),z("view"),z("ready"),ke=!0,Lt()};mraid.addEventListener("ready",t)}}catch(r){console.warn("MRAID hook skipped",r)}}function Gs(){if(Ha())try{let r=dapi.getScreenSize();He(r.width,r.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?kt():ct()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();He(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)),Mi=!0,dapi.isViewable())Me=!0,z("boot"),z("view"),z("ready"),ke=!0,Lt();else{let t=()=>{Me=!0,z("boot"),z("view"),z("ready"),ke=!0,Lt()};dapi.addEventListener("ready",t)}}catch(r){console.warn("DAPI hook skipped",r)}}function Ur(){let r=()=>{Me||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Me=!0,z("boot"),z("view"),z("ready"),ke=!0,Lt(),Tt&&(Tt=!1,we.start()))};window.addEventListener("resize",()=>He()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(kt(),r()):ct()}),document.readyState==="complete"||document.readyState==="interactive"?r():window.addEventListener("load",r),Mi=!0}function qs(){let r=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Nr=!0),!(Nr&&e instanceof MouseEvent)&&(Ci+=1,Wn||(Wn=!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,d,p,u,g,m;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(Ke())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(Na())(o=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||o.call(s);else if(Ga())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ua())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(h){console.warn("Smadex redirect failed",h)}else if(Ba()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(r||at||""):r&&window.open(r)}else We()?(u=window.install)==null||u.call(window):Fa()?(g=window.openAppStore)==null||g.call(window):Ki()?(m=parent==null?void 0:parent.postMessage)==null||m.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;de("view",()=>e(t.mraid_viewable)),de("start",()=>e(t.game_viewable)),de("engagement",()=>e(t.engagement));let i=()=>e(t.complete);de("complete",i),Bt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),de("cta_click",()=>e(t.click))}else if(r==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;de("view",()=>e(t.Ad_Load_Start)),de("start",()=>e(t.Ad_Viewable)),de("engagement",()=>e(t.First_Engagement)),de("complete",()=>e(t.Gameplay_Complete)),de("cta_click",()=>e(t.DSP_Click)),de("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Ys(){if(!Ke())return;let r=window.TJ_API;r&&r.setPlayableAPI&&r.setPlayableAPI({skipAd:()=>{try{we.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(){We()&&(window.mintGameStart=()=>{kt(!0),He()},window.mintGameClose=()=>{ct(!0)})}function Ks(){if(!Xi())return;let r=window.NUC;!r||!r.trigger||(we.on("cta_click",()=>{var e,t;return(t=(e=r.trigger).convert)==null?void 0:t.call(e,at)}),we.on("complete",()=>{var e,t;return(t=(e=r.trigger).tryAgain)==null?void 0:t.call(e)}))}var we={init(r={},e){var t;if(Wr=r.profile||"web_embed",qn=r.consent||{},nt={...Vr,...r.ids||{}},rt=r.rootEl||rt,At=void 0,va((t=r.telemetry)!=null&&t.endpoint?r.telemetry:null),Ge=null,Yn=!1,Wn=!1,Ti.clear(),at=r.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Li=e),z("init"),document.body.oncontextmenu=()=>!1,Fr(),Js(rt),qa(),Us(),Gs(),!Mi){if(document.readyState==="complete")Ur();else if(!Br){Br=!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${Bn} `,"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;"),Me&&!ke&&(z("boot"),z("view"),z("ready"),Tt&&(Tt=!1,we.start()),ke=!0),ke=Me},getRoot(){return Fr()},get version(){return Bn},get maxWidth(){return st},get maxHeight(){return ot},get isLandscape(){return Vn},get isReady(){return ke},get isStarted(){return Fn},get isPaused(){return Ct},get isFinished(){return St},get volume(){return Kn},get interactions(){return Ci},on(r,e){Bt(ki(r),e)},off(r,e){Yi(ki(r),e)},start(){var r,e;if(!Fn){if(!Me){Tt=!0;return}if(Fn=!0,Ge||(Ge=Date.now()),z("start"),He(),We())ct(),(r=window.gameReady)==null||r.call(window);else if(Ke()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Vn?"landscape":"portrait",buildID:Bn})}}},finish(){var r,e;St||(St=!0,z("complete"),Gn("complete"),We()?(r=window.gameEnd)==null||r.call(window):Ki()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ke()&&qr())},install(r){if(!St){St=!0,Ke()?(qr(),setTimeout(()=>we.install(r),300)):(z("complete"),setTimeout(()=>we.install(r),0));return}Un||(Un=!0,setTimeout(()=>Un=!1,500),z("cta_click"),z("conversion"),Gn("cta"),Gr(r||at))},emit(r,e){let t=ki(r);if(!Fs.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);Wi(i,!!qn.analytics),Ft(t,i)},gameStart(){we.start()},gameEnd(){we.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"){Gn(r)},setAttribution(r){At=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 At={...At||{},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&&Ti.set(r,Date.now())},timerEnd(r,e="custom",t){if(!r)return;let i=Ti.get(r);if(!i)return;Ti.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(We())(r=window.gameRetry)==null||r.call(window);else if(Xi()){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(){kt(!0)},resize(r,e){He(r,e)}},Ce=we;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=`
2580
+ `,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 Xn=_a.version,Eo=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"]);ja();var ts={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"},is=Math.random().toString(36).slice(2),ut=null,dt={...ts},ns="web_embed",ea={},Mt,Jn=!1,Pt=!1,jt=!1,as=!1,aa=1,Ni=0,Ui=!1,Ie=!1,pt="",gt=Math.floor(window.innerWidth),ht=Math.floor(window.innerHeight),ta=gt>ht,je=!1,It=!1,Kr=!1,Xr=!1,Zn=!1,Fi=null,Je=null,ia=!1,na=!1,Hi=new Map;function rs(){if(!Je)return null;let s=Date.now()-Je;return!Number.isFinite(s)||s<0?null:s}function Qn(s){if(ia)return;let e=rs();e!==null&&(ia=!0,z("session_time",{duration_ms:e,reason:s}))}function Jr(){if(ut)return ut;let s=document.createElement("div");return s.id="handler-root",s.setAttribute("data-handler-root","true"),document.body.appendChild(s),ut=s,s}function Bi(s){switch(s){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return s}}function ss(s,e){return{event_name:s,ts:Date.now(),session_id:is,deployment_id:dt.deployment_id,variant_id:dt.variant_id,export_profile_id:dt.profile_id,instance_id:dt.instance_id||"default",env:ns==="mraid"?"mraid":"web",attribution:Mt,payload:e}}function z(s,e){let t=Bi(s),i=ss(t,e);tn(i,!!ea.analytics),qt(t,i),t!==s&&qt(s,i)}function _t(){Fi&&(Fi(gt,ht),Fi=null)}function mt(s){aa=s,z("volume",s)}function ft(s){s&&(as=!0),!jt&&(jt=!0,z("pause"),mt(0))}function Ot(s){!s&&as||jt&&(jt=!1,z("resume"),mt(aa))}function Ue(s,e){gt=Math.floor(s||window.innerWidth),ht=Math.floor(e||window.innerHeight),ta=gt>ht,z("resize",{width:gt,height:ht})}function Ao(){if(qa())try{let s=mraid.getMaxSize();Ue(s.width,s.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Ot():ft()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Ue(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();mt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&mt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Ui=!0,mraid.isViewable()&&mraid.getState()!=="hidden")je=!0,z("boot"),z("view"),z("ready"),Ie=!0,_t();else{let t=()=>{je=!0,z("boot"),z("view"),z("ready"),Ie=!0,_t()};mraid.addEventListener("ready",t)}}catch(s){console.warn("MRAID hook skipped",s)}}function Co(){if(Va())try{let s=dapi.getScreenSize();Ue(s.width,s.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Ot():ft()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Ue(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(mt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>mt(t?1:0)),Ui=!0,dapi.isViewable())je=!0,z("boot"),z("view"),z("ready"),Ie=!0,_t();else{let t=()=>{je=!0,z("boot"),z("view"),z("ready"),Ie=!0,_t()};dapi.addEventListener("ready",t)}}catch(s){console.warn("DAPI hook skipped",s)}}function Zr(){let s=()=>{je||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(je=!0,z("boot"),z("view"),z("ready"),Ie=!0,_t(),It&&(It=!1,Ae.start()))};window.addEventListener("resize",()=>Ue()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Ot(),s()):ft()}),document.readyState==="complete"||document.readyState==="interactive"?s():window.addEventListener("load",s),Ui=!0}function To(){let s=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Kr=!0),!(Kr&&e instanceof MouseEvent)&&(Ni+=1,na||(na=!0,z("first_interaction",{count:Ni})),z("interaction",Ni))};document.addEventListener("mousedown",s),document.addEventListener("touchstart",s)}function Qr(s){var i,n,a,r,o,l,c,d,p,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(s||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(tt())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(Wa())(o=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||o.call(r);else if(Ja())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Xa())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(m){console.warn("Smadex redirect failed",m)}else if(Ya()){let m=window.ExitApi;m&&typeof m.exit=="function"?m.exit(s||pt||""):s&&window.open(s)}else et()?(u=window.install)==null||u.call(window):Ka()?(g=window.openAppStore)==null||g.call(window):nn()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):s&&window.open(s)}function Lo(){let s=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(s==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;de("view",()=>e(t.mraid_viewable)),de("start",()=>e(t.game_viewable)),de("engagement",()=>e(t.engagement));let i=()=>e(t.complete);de("complete",i),Gt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),de("cta_click",()=>e(t.click))}else if(s==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;de("view",()=>e(t.Ad_Load_Start)),de("start",()=>e(t.Ad_Viewable)),de("engagement",()=>e(t.First_Engagement)),de("complete",()=>e(t.Gameplay_Complete)),de("cta_click",()=>e(t.DSP_Click)),de("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function ko(){if(!tt())return;let s=window.TJ_API;s&&s.setPlayableAPI&&s.setPlayableAPI({skipAd:()=>{try{Ae.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function es(){var e,t,i;let s=window.TJ_API;(e=s==null?void 0:s.objectiveComplete)==null||e.call(s),(t=s==null?void 0:s.playableFinished)==null||t.call(s),(i=s==null?void 0:s.gameplayFinished)==null||i.call(s)}function Po(){et()&&(window.mintGameStart=()=>{Ot(!0),Ue()},window.mintGameClose=()=>{ft(!0)})}function Mo(){if(!an())return;let s=window.NUC;!s||!s.trigger||(Ae.on("cta_click",()=>{var e,t;return(t=(e=s.trigger).convert)==null?void 0:t.call(e,pt)}),Ae.on("complete",()=>{var e,t;return(t=(e=s.trigger).tryAgain)==null?void 0:t.call(e)}))}var Ae={init(s={},e){var t;if(ns=s.profile||"web_embed",ea=s.consent||{},dt={...ts,...s.ids||{}},ut=s.rootEl||ut,Mt=void 0,Ca((t=s.telemetry)!=null&&t.endpoint?s.telemetry:null),Je=null,ia=!1,na=!1,Hi.clear(),pt=s.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Fi=e),z("init"),document.body.oncontextmenu=()=>!1,Jr(),jo(ut),Za(),Ao(),Co(),!Ui){if(document.readyState==="complete")Zr();else if(!Xr){Xr=!0;let i=()=>{Zr(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}To(),Lo(),ko(),Po(),Mo(),console.log(`%c @handler/playable-sdk %c v${Xn} `,"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;"),je&&!Ie&&(z("boot"),z("view"),z("ready"),It&&(It=!1,Ae.start()),Ie=!0),Ie=je},getRoot(){return Jr()},get version(){return Xn},get maxWidth(){return gt},get maxHeight(){return ht},get isLandscape(){return ta},get isReady(){return Ie},get isStarted(){return Jn},get isPaused(){return jt},get isFinished(){return Pt},get volume(){return aa},get interactions(){return Ni},on(s,e){Gt(Bi(s),e)},off(s,e){en(Bi(s),e)},start(){var s,e;if(!Jn){if(!je){It=!0;return}if(Jn=!0,Je||(Je=Date.now()),z("start"),Ue(),et())ft(),(s=window.gameReady)==null||s.call(window);else if(tt()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:ta?"landscape":"portrait",buildID:Xn})}}},finish(){var s,e;Pt||(Pt=!0,z("complete"),Qn("complete"),et()?(s=window.gameEnd)==null||s.call(window):nn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):tt()&&es())},install(s){if(!Pt){Pt=!0,tt()?(es(),setTimeout(()=>Ae.install(s),300)):(z("complete"),setTimeout(()=>Ae.install(s),0));return}Zn||(Zn=!0,setTimeout(()=>Zn=!1,500),z("cta_click"),z("conversion"),Qn("cta"),Qr(s||pt))},emit(s,e){let t=Bi(s);if(!Eo.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${s} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=ss(t,e);tn(i,!!ea.analytics),qt(t,i)},gameStart(){Ae.start()},gameEnd(){Ae.finish()},ctaClick(s,e){z("cta_click",{url:s||pt,manual:!0}),(e==null?void 0:e.open)!==!1&&Qr(s||pt)},ctaShow(s){z("cta_show",s)},ctaDismiss(s){z("cta_dismiss",s)},getGameTimeMs(){return rs()},endSession(s="manual"){Qn(s)},setAttribution(s){Mt=s},abTest(s,e){if(!s)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(Io(`${is}:${s}`))%e.length,i=e[t];return Mt={...Mt||{},experiment_id:s},dt.variant_id=i,z("ab_assign",{experiment_id:s,variant_id:i}),i},levelStart(s,e){Je||(Je=Date.now()),z("level_start",{level_id:s,...e})},levelComplete(s,e){z("level_complete",{level_id:s,...e})},levelFail(s,e){z("level_fail",{level_id:s,...e})},checkpoint(s,e){z("checkpoint",{checkpoint_id:s,...e})},reward(s,e){z("reward",{reward_id:s,...e})},tutorialStart(s,e){z("tutorial_start",{step_id:s,...e})},tutorialComplete(s,e){z("tutorial_complete",{step_id:s,...e})},tutorialSkip(s,e){z("tutorial_skip",{step_id:s,...e})},timerStart(s){s&&Hi.set(s,Date.now())},timerEnd(s,e="custom",t){if(!s)return;let i=Hi.get(s);if(!i)return;Hi.delete(s);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){z("engagement",{action:"timer",key:s,duration_ms:n,...t});return}z(e,{key:s,duration_ms:n,...t})}},fps(s,e){z("fps",{value:s,...e})},memory(s,e){z("memory",{bytes:s,...e})},assetLoadStart(s,e){z("asset_load_start",{asset_id:s,...e})},assetLoadComplete(s,e){z("asset_load_complete",{asset_id:s,...e})},reportError(s,e,t){z("error",{code:s,message:e,...t})},retry(){var s,e,t;if(et())(s=window.gameRetry)==null||s.call(window);else if(an()){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(){ft(!0)},resume(){Ot(!0)},resize(s,e){Ue(s,e)}},Pe=Ae;function Io(s){let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function jo(s){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2476
2581
  (function(){
2477
2582
  var events = ['touchstart','touchend','mousedown','keydown'];
2478
2583
  function unlock(){
@@ -2488,14 +2593,14 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2488
2593
  }
2489
2594
  events.forEach(function(e){ document.addEventListener(e, unlock, false); });
2490
2595
  })();
2491
- `,r.appendChild(e)}async function Xn(r,e={}){let t=new Zs;await t.init({resizeTo:r,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=s=>{var p,u,g,m;if(!t.renderer)return;let o=(p=s==null?void 0:s.width)!=null?p:r.clientWidth,l=(u=s==null?void 0:s.height)!=null?u:r.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(m=window.innerHeight)!=null?m:480;t.renderer.resize(c,d)};r.appendChild(t.canvas),r.style.position="relative",r.style.display="flex",r.style.flexDirection="column",r.style.alignItems="stretch",r.style.width="100%",r.style.height="100dvh",r.style.minHeight="100vh",r.style.maxWidth="100%",r.style.maxHeight="100%",r.style.boxSizing="border-box",r.style.overflow="hidden",e.background&&(r.style.background=e.background),i();let n=document.createElement("div");return n.setAttribute("style",["position:absolute","inset:0","display:flex","flex-direction:column","align-items:center","justify-content:flex-start","gap:12px","pointer-events:none","font-family:Arial,sans-serif","padding:20px 16px","padding-bottom:clamp(24px, 6vh, 96px)","box-sizing:border-box","z-index:2"].join(";")),r.appendChild(n),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 d={width:l,height:c,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:"auto-resize",isLandscape:l>c};window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:d}))}}}).observe(r),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as Jn,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)}},Ii=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{}}},ji=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 Ii(n.render),this.sync()}sync(){this.transform.syncToPixi(this.pixiObject),this.renderer.syncToPixi(this.pixiObject,this.instanceId),this.applyAnchor(),this.applyEffectsScale(),this.applyEffects(),this.syncTextProperties(),(!this._initialized||this._shouldReplayIntro)&&(this.applyIntro(),this._initialized=!0,this._shouldReplayIntro=!1),this.applyMotion()}syncTextProperties(){var t;if(!this.pixiObject||!("text"in this.pixiObject))return;let e=(t=this._config)==null?void 0:t.ui;e&&(e.text!==void 0&&this.pixiObject.text!==e.text&&(this.pixiObject.text=e.text),this.pixiObject.style&&(e.fontSize!==void 0&&(this.pixiObject.style.fontSize=e.fontSize),e.color!==void 0&&(this.pixiObject.style.fill=e.color),e.align!==void 0&&(this.pixiObject.style.align=e.align)))}destroy(){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null),this._introTicker&&(dt.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,d,p,u,g,m,h,f,b,v;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(d=e==null?void 0:e.motion)==null?void 0:d.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(u=(p=this._config)==null?void 0:p.render)==null?void 0:u.asset)==null?void 0:g.type,a=(h=(m=e==null?void 0:e.render)==null?void 0:m.asset)==null?void 0:h.type,s=(b=(f=this._config)==null?void 0:f.ui)==null?void 0:b.renderMode,o=(v=e==null?void 0:e.ui)==null?void 0:v.renderMode;if((n!==a||s!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${s} to ${a}/${o}`),this.onRebuildRequired)){this.onRebuildRequired(this,e);return}this._config=e,e.transform&&this.transform.update(e.transform),e.render&&this.renderer.update(e.render),this.sync()}applyAnchor(){var n,a,s,o;if(!this.pixiObject||!("anchor"in this.pixiObject)||!this.pixiObject.anchor)return;let e=(a=(n=this._config)==null?void 0:n.render)==null?void 0:a.anchor,t=(o=(s=this._config)==null?void 0:s.transform)==null?void 0:o.anchor,i=e&&typeof e=="object"?e:t&&typeof t=="object"?t:null;i&&typeof i.x=="number"&&typeof i.y=="number"&&this.pixiObject.anchor.set(i.x,i.y)}applyEffectsScale(){var a,s,o;if(!((a=this.pixiObject)!=null&&a.scale))return;let e=(s=this._config)==null?void 0:s.effects,t=typeof(e==null?void 0:e.scale_x)=="number"?e.scale_x:1,i=typeof(e==null?void 0:e.scale_y)=="number"?e.scale_y:1;if(t===1&&i===1)return;let n=(o=this.transform.scale)!=null?o:1;typeof this.pixiObject.scale.set=="function"?this.pixiObject.scale.set(n*t,n*i):(this.pixiObject.scale.x=n*t,this.pixiObject.scale.y=n*i)}applyEffects(){var i,n,a,s,o,l,c,d,p;if(!this.pixiObject)return;let e=(i=this._config)==null?void 0:i.effects;if(!e||e.enabled===!1){this.pixiObject.filters=null;return}let t=[];if((n=e.blur)!=null&&n.enabled){let u=new Jn;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 Jn;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 Jn;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let m=new Qs,h=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;m.tint(h),t.push(m)}}(d=e.stroke)!=null&&d.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(p=e.distortion)!=null&&p.enabled&&console.warn("[Effects] Distortion effect requires pixi-filters or a displacement map. Install: npm install pixi-filters"),this.pixiObject.filters=t.length>0?t:null}applyIntro(){var d,p,u,g,m,h,f;let e=(d=this._config)==null?void 0:d.motion;if(!e||!((p=e.intro)!=null&&p.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,a=this.transform.position.y,s=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((h=(m=this._config)==null?void 0:m.effects)==null?void 0:h.scale_y)||1);if(this.pixiObject.alpha=(f=t.startAlpha)!=null?f:0,t.startScale!==void 0&&this.pixiObject.scale.set(s*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=a+(t.startYOffset||0)),this._introTicker&&dt.shared.remove(this._introTicker),i<=0&&n<=0){this.pixiObject.alpha=this.renderer.alpha,this.pixiObject.y=this.transform.position.y,this.pixiObject.scale.set(s,o);return}let l=0,c=b=>{var j,_,C,A,L,T;if(l+=b.deltaTime/60,l<n)return;let v=i>0?Math.min(1,(l-n)/i):1,x=1-Math.pow(1-v,3),y=this.renderer.alpha,w=this.transform.scale*(((_=(j=this._config)==null?void 0:j.effects)==null?void 0:_.scale_x)||1),I=this.transform.scale*(((A=(C=this._config)==null?void 0:C.effects)==null?void 0:A.scale_y)||1),R=this.transform.position.y,k=this.transform.position.x;if(this.pixiObject.alpha=((L=t.startAlpha)!=null?L:0)+(y-((T=t.startAlpha)!=null?T:0))*x,t.startScale!==void 0){let S=t.startScale+(1-t.startScale)*x;this.pixiObject.scale.set(w*S,I*S)}t.startYOffset!==void 0&&(this.pixiObject.y=R+t.startYOffset+(R-(R+t.startYOffset))*x),v>=1&&(dt.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=y,this.pixiObject.x=k,this.pixiObject.y=R,this.pixiObject.scale.set(w,I))};this._introTicker=c,dt.shared.add(c)}applyMotion(){var p,u,g,m,h,f;let e=(p=this._config)==null?void 0:p.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(this._lastMotionStr===i&&this._tickerCleanup)return;if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),!(((u=e.pulse)==null?void 0:u.enabled)||((g=e.swing)==null?void 0:g.enabled)||((m=e.continuousMove)==null?void 0:m.enabled)||((h=e.continuousRotate)==null?void 0:h.enabled)||((f=e.orbit)==null?void 0:f.enabled)))return;let a=0,s=0,o=0,l=0,c=1/60,d=b=>{var C,A,L,T,S,E,P,M,O,D,N,H,B,U,W,Q,ie,oe,$,Z,le,ge,ce,be,Se,Ae;let v=((C=b.deltaTime)!=null?C:1)*c;a+=b.deltaTime*.05;let x=this.transform.scale,y=x*(((L=(A=this._config)==null?void 0:A.effects)==null?void 0:L.scale_x)||1),w=x*(((S=(T=this._config)==null?void 0:T.effects)==null?void 0:S.scale_y)||1),I=this.transform.position.x,R=this.transform.position.y,k=this.transform.rotation,j=0,_=0;if((E=e.swing)!=null&&E.enabled){let G=(P=e.swing.amplitude)!=null?P:10,ee=(M=e.swing.speed)!=null?M:1,K=Math.sin(a*ee)*G;e.swing.axis==="vertical"?_+=K:e.swing.axis==="both"?(j+=K,_+=K):j+=K}if((O=e.continuousMove)!=null&&O.enabled){let G=(D=e.continuousMove.axis)!=null?D:"x",ee=Math.max(0,(N=e.continuousMove.speed)!=null?N:50),K=Math.sign((H=e.continuousMove.direction)!=null?H:1)||1,ae=Math.max(0,(B=e.continuousMove.lifetime)!=null?B:0);s+=v;let Ie=ae>0?Math.min(s,ae):s,Ne=ee*K*Ie;(G==="x"||G==="both")&&(j+=Ne),(G==="y"||G==="both")&&(_+=Ne)}if((U=e.orbit)!=null&&U.enabled){let G=Math.max(0,(W=e.orbit.radius)!=null?W:50),ee=Math.max(0,(Q=e.orbit.speed)!=null?Q:45),K=Math.sign((ie=e.orbit.direction)!=null?ie:1)||1,ae=ee*Math.PI/180;l+=ae*K*v;let Ie=(oe=e.orbit.pivotOffsetX)!=null?oe:0,Ne=($=e.orbit.pivotOffsetY)!=null?$:0;j+=Ie+G*Math.cos(l),_+=Ne+G*Math.sin(l)}if(this.pixiObject.x=I+j,this.pixiObject.y=R+_,(Z=e.pulse)!=null&&Z.enabled){let G=(le=e.pulse.intensity)!=null?le:.1,ee=(ge=e.pulse.speed)!=null?ge:1,ae=1+Math.sin(a*ee)*G;(ce=this.pixiObject.scale)!=null&&ce.set?this.pixiObject.scale.set(y*ae,w*ae):this.pixiObject.scale&&(this.pixiObject.scale.x=y*ae,this.pixiObject.scale.y=w*ae)}if((be=e.continuousRotate)!=null&&be.enabled){let G=Math.max(0,(Se=e.continuousRotate.speed)!=null?Se:90),ee=Math.sign((Ae=e.continuousRotate.direction)!=null?Ae:1)||1,K=G*Math.PI/180;o+=K*ee*v,this.pixiObject.rotation=k+o}};dt.shared.add(d),this._tickerCleanup=()=>{var b,v,x,y,w;if(dt.shared.remove(d),this.pixiObject){let I=this.transform.scale*(((v=(b=this._config)==null?void 0:b.effects)==null?void 0:v.scale_x)||1),R=this.transform.scale*(((y=(x=this._config)==null?void 0:x.effects)==null?void 0:y.scale_y)||1);this.pixiObject.x=this.transform.position.x,this.pixiObject.y=this.transform.position.y,this.pixiObject.rotation=this.transform.rotation,(w=this.pixiObject.scale)!=null&&w.set?this.pixiObject.scale.set(I,R):this.pixiObject.scale&&(this.pixiObject.scale.x=I,this.pixiObject.scale.y=R)}}}getComponent(e){return this._config[e]}getPosition(){return{...this.transform.position}}setPosition(e,t){this.transform.position={x:e,y:t},this.transform.syncToPixi(this.pixiObject)}getAlpha(){return this.renderer.alpha}setAlpha(e){this.renderer.alpha=e,this.renderer.syncToPixi(this.pixiObject)}getVisible(){return this.renderer.visible}setVisible(e){this.renderer.visible=e,this.renderer.syncToPixi(this.pixiObject)}},Mt=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 ji(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,s)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,s);o&&this.objects.get(e)===o&&console.log(`[GameObjectManager] \u2705 Rebuilt ${e} successfully`)}else console.warn(`[GameObjectManager] Rebuild required for ${e} but no factory provided`),a.updateConfig(s)},n}get(e){return this.objects.get(e)}updateConfig(e){this.config=e;for(let[t,i]of this.objects.entries()){let n=e.objects.get(t);n&&i.updateConfig(n)}}getAll(){return Array.from(this.objects.values())}remove(e){let t=this.objects.get(e);t&&t.destroy(),this.objects.delete(e)}clear(){for(let e of this.objects.values())e.destroy();this.objects.clear()}};var _i={"brand.primary":{family:"Arial, sans-serif",weight:"400"},"brand.warning":{family:"Arial Black, Arial, sans-serif",weight:"900"},"brand.heading":{family:"Arial Black, Arial, sans-serif",weight:"800"},"brand.body":{family:"Arial, sans-serif",weight:"400"}};function eo(r){let e=_i[r];return e?e.family:(console.warn(`Font ID "${r}" not found in registry, using fallback`),"Arial, sans-serif")}function to(r){var t;let e=_i[r];return e&&(t=e.weight)!=null?t:"400"}function io(r,e){_i[r]=e}function no(){return Object.keys(_i)}var pt=null;function ao(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!pt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),pt||(typeof window!="undefined"&&window.lottie?(pt=window.lottie,console.log("[LottieOverlay] \u2705 Found window.lottie, cached it")):(console.warn("[LottieOverlay] \u274C lottie-web is not available globally. Make sure it is loaded before using Lottie animations."),console.log("[LottieOverlay] window keys:",typeof window!="undefined"?Object.keys(window).filter(r=>r.toLowerCase().includes("lottie")):"no window"),pt=null)),pt}function ro(r){return!r||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("/")?r:`/${r.replace(/^\.\//,"")}`}function so(r){try{let e=new XMLHttpRequest;return e.open("GET",ro(r),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function Zr(r){return!r||typeof r!="object"||!Array.isArray(r.layers)?null:(Array.isArray(r.assets)||(r.assets=[]),Array.isArray(r.chars)||(r.chars=[]),r)}function $n(r){pt=r}function oo(r,e,t,i){var I,R,k,j,_,C,A,L,T,S,E,P,M,O,D,N,H,B,U;let n=t.objects.get(r);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${r}`),null;let a=((I=n.effects)==null?void 0:I.lottie)||{},s=n.transform||{},o=n.render||{};if(a.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[r],c=Zr(l);if(!c){let W=(k=(R=n.render)==null?void 0:R.asset)==null?void 0:k.path;if(typeof W=="string"&&W.toLowerCase().endsWith(".json")){let Q=so(W);if(c=Zr(Q),c)try{i[r]=c}catch{}}}if(!c){let W=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${r}`,{kind:W}),null}let d=ao();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${r}`),null;let p=(j=a.width)!=null?j:300,u=(_=a.height)!=null?_:300,g=(C=s.scale)!=null?C:1,m=((L=(A=s.position)==null?void 0:A.x)!=null?L:0)+((S=(T=s.offset)==null?void 0:T.x)!=null?S:0),h=((P=(E=s.position)==null?void 0:E.y)!=null?P:0)+((O=(M=s.offset)==null?void 0:M.y)!=null?O:0),f=(D=s.rotation)!=null?D:0,b=(N=o.z_index)!=null?N:100,v=(H=o.alpha)!=null?H:1,x=document.createElement("div");x.style.cssText=`
2596
+ `,s.appendChild(e)}async function ra(s,e={}){let t=new _o;await t.init({resizeTo:s,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0});let i=r=>{var p,u,g,h;if(!t.renderer)return;let o=(p=r==null?void 0:r.width)!=null?p:s.clientWidth,l=(u=r==null?void 0:r.height)!=null?u:s.clientHeight,c=o&&o>0?o:(g=window.innerWidth)!=null?g:320,d=l&&l>0?l:(h=window.innerHeight)!=null?h:480;t.renderer.resize(c,d)};s.appendChild(t.canvas),s.style.position="relative",s.style.display="flex",s.style.flexDirection="column",s.style.alignItems="stretch",s.style.width="100%",s.style.height="100dvh",s.style.minHeight="100vh",s.style.maxWidth="100%",s.style.maxHeight="100%",s.style.boxSizing="border-box",s.style.overflow="hidden",e.background&&(s.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(";")),s.appendChild(n),Pe.on("pause",()=>{t.ticker.stop(),document.querySelectorAll("audio").forEach(o=>o.pause())}),Pe.on("resume",()=>{t.ticker.start(),document.querySelectorAll("audio").forEach(o=>{o.currentTime>0&&!o.ended&&o.play().catch(()=>{})})}),Pe.on("resize",({payload:r})=>{i({width:r==null?void 0:r.width,height:r==null?void 0:r.height})}),window.addEventListener("resize",()=>i()),requestAnimationFrame(()=>i()),new ResizeObserver(r=>{let o=r[0];if(o&&o.contentRect.width>0&&o.contentRect.height>0){let l=Math.round(o.contentRect.width),c=Math.round(o.contentRect.height);if(i({width:l,height:c}),typeof window!="undefined"&&window.gameApp&&window.gameObjectManager){let d={width:l,height:c,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:"auto-resize",isLandscape:l>c};window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:d}))}}}).observe(s),{app:t,stage:t.stage,overlay:n,applySize:i}}import{BlurFilter as sa,Ticker as bt,ColorMatrixFilter as Oo}from"pixi.js";var Gi=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)}},qi=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}=us("handler-playable-sdk/pixi");if(n&&n[t]){let a=n[t];a&&(e.texture=a)}}catch{}}},Vi=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 Gi(n.transform),this.renderer=new qi(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&&(bt.shared.remove(this._introTicker),this._introTicker=null),this.pixiObject&&this.pixiObject.parent&&this.pixiObject.parent.removeChild(this.pixiObject)}updateConfig(e){var l,c,d,p,u,g,h,m,f,v,b;let t=(c=(l=this._config)==null?void 0:l.motion)==null?void 0:c.intro,i=(d=e==null?void 0:e.motion)==null?void 0:d.intro;i!=null&&i.enabled&&JSON.stringify(t)!==JSON.stringify(i)&&(this._shouldReplayIntro=!0);let n=(g=(u=(p=this._config)==null?void 0:p.render)==null?void 0:u.asset)==null?void 0:g.type,a=(m=(h=e==null?void 0:e.render)==null?void 0:h.asset)==null?void 0:m.type,r=(v=(f=this._config)==null?void 0:f.ui)==null?void 0:v.renderMode,o=(b=e==null?void 0:e.ui)==null?void 0:b.renderMode;if((n!==a||r!==o)&&(console.log(`[GameObject] Rebuild required for ${this.instanceId}: type changed from ${n}/${r} 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,r,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=(r=this._config)==null?void 0:r.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,r,o;if(!((a=this.pixiObject)!=null&&a.scale))return;let e=(r=this._config)==null?void 0:r.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,r,o,l,c,d,p;if(!this.pixiObject)return;let e=(i=this._config)==null?void 0:i.effects;if(!e||e.enabled===!1){this.pixiObject.filters=null;return}let t=[];if((n=e.blur)!=null&&n.enabled){let u=new sa;u.blur=(a=e.blur.strength)!=null?a:4,t.push(u)}if((r=e.shadow)!=null&&r.enabled){let u=e.shadow,g=new sa;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 sa;if(g.blur=(c=u.blur)!=null?c:8,t.push(g),u.color){let h=new Oo,m=typeof u.color=="string"?parseInt(u.color.replace("#",""),16):u.color;h.tint(m),t.push(h)}}(d=e.stroke)!=null&&d.enabled&&console.warn("[Effects] Stroke/outline effect requires pixi-filters. Install: npm install pixi-filters"),(p=e.distortion)!=null&&p.enabled&&console.warn("[Effects] Distortion effect requires pixi-filters or a displacement map. Install: npm install pixi-filters"),this.pixiObject.filters=t.length>0?t:null}applyIntro(){var d,p,u,g,h,m,f;let e=(d=this._config)==null?void 0:d.motion;if(!e||!((p=e.intro)!=null&&p.enabled)||!this.pixiObject)return;let t=e.intro,i=(t.duration||0)/1e3,n=(t.delay||0)/1e3,a=this.transform.position.y,r=this.transform.scale*(((g=(u=this._config)==null?void 0:u.effects)==null?void 0:g.scale_x)||1),o=this.transform.scale*(((m=(h=this._config)==null?void 0:h.effects)==null?void 0:m.scale_y)||1);if(this.pixiObject.alpha=(f=t.startAlpha)!=null?f:0,t.startScale!==void 0&&this.pixiObject.scale.set(r*t.startScale,o*t.startScale),t.startYOffset!==void 0&&(this.pixiObject.y=a+(t.startYOffset||0)),this._introTicker&&bt.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(r,o);return}let l=0,c=v=>{var _,O,L,A,k,C;if(l+=v.deltaTime/60,l<n)return;let b=i>0?Math.min(1,(l-n)/i):1,w=1-Math.pow(1-b,3),y=this.renderer.alpha,x=this.transform.scale*(((O=(_=this._config)==null?void 0:_.effects)==null?void 0:O.scale_x)||1),I=this.transform.scale*(((A=(L=this._config)==null?void 0:L.effects)==null?void 0:A.scale_y)||1),j=this.transform.position.y,T=this.transform.position.x;if(this.pixiObject.alpha=((k=t.startAlpha)!=null?k:0)+(y-((C=t.startAlpha)!=null?C:0))*w,t.startScale!==void 0){let E=t.startScale+(1-t.startScale)*w;this.pixiObject.scale.set(x*E,I*E)}t.startYOffset!==void 0&&(this.pixiObject.y=j+t.startYOffset+(j-(j+t.startYOffset))*w),b>=1&&(bt.shared.remove(c),this._introTicker=null,this.pixiObject.alpha=y,this.pixiObject.x=T,this.pixiObject.y=j,this.pixiObject.scale.set(x,I))};this._introTicker=c,bt.shared.add(c)}applyMotion(){var p,u,g,h,m,f;let e=(p=this._config)==null?void 0:p.motion,t=e&&e.enabled!==!1,i=JSON.stringify(e);if(this._lastMotionStr===i&&this._tickerCleanup)return;if(this._lastMotionStr=i,!t){this._tickerCleanup&&(this._tickerCleanup(),this._tickerCleanup=null);return}if(this._tickerCleanup&&this._tickerCleanup(),!(((u=e.pulse)==null?void 0:u.enabled)||((g=e.swing)==null?void 0:g.enabled)||((h=e.continuousMove)==null?void 0:h.enabled)||((m=e.continuousRotate)==null?void 0:m.enabled)||((f=e.orbit)==null?void 0:f.enabled)))return;let a=0,r=0,o=0,l=0,c=1/60,d=v=>{var L,A,k,C,E,S,M,P,R,D,N,H,F,G,Y,Q,ie,oe,$,Z,le,ge,ce,be,Ce,Te;let b=((L=v.deltaTime)!=null?L:1)*c;a+=v.deltaTime*.05;let w=this.transform.scale,y=w*(((k=(A=this._config)==null?void 0:A.effects)==null?void 0:k.scale_x)||1),x=w*(((E=(C=this._config)==null?void 0:C.effects)==null?void 0:E.scale_y)||1),I=this.transform.position.x,j=this.transform.position.y,T=this.transform.rotation,_=0,O=0;if((S=e.swing)!=null&&S.enabled){let q=(M=e.swing.amplitude)!=null?M:10,ee=(P=e.swing.speed)!=null?P:1,K=Math.sin(a*ee)*q;e.swing.axis==="vertical"?O+=K:e.swing.axis==="both"?(_+=K,O+=K):_+=K}if((R=e.continuousMove)!=null&&R.enabled){let q=(D=e.continuousMove.axis)!=null?D:"x",ee=Math.max(0,(N=e.continuousMove.speed)!=null?N:50),K=Math.sign((H=e.continuousMove.direction)!=null?H:1)||1,ae=Math.max(0,(F=e.continuousMove.lifetime)!=null?F:0);r+=b;let _e=ae>0?Math.min(r,ae):r,Ge=ee*K*_e;(q==="x"||q==="both")&&(_+=Ge),(q==="y"||q==="both")&&(O+=Ge)}if((G=e.orbit)!=null&&G.enabled){let q=Math.max(0,(Y=e.orbit.radius)!=null?Y:50),ee=Math.max(0,(Q=e.orbit.speed)!=null?Q:45),K=Math.sign((ie=e.orbit.direction)!=null?ie:1)||1,ae=ee*Math.PI/180;l+=ae*K*b;let _e=(oe=e.orbit.pivotOffsetX)!=null?oe:0,Ge=($=e.orbit.pivotOffsetY)!=null?$:0;_+=_e+q*Math.cos(l),O+=Ge+q*Math.sin(l)}if(this.pixiObject.x=I+_,this.pixiObject.y=j+O,(Z=e.pulse)!=null&&Z.enabled){let q=(le=e.pulse.intensity)!=null?le:.1,ee=(ge=e.pulse.speed)!=null?ge:1,ae=1+Math.sin(a*ee)*q;(ce=this.pixiObject.scale)!=null&&ce.set?this.pixiObject.scale.set(y*ae,x*ae):this.pixiObject.scale&&(this.pixiObject.scale.x=y*ae,this.pixiObject.scale.y=x*ae)}if((be=e.continuousRotate)!=null&&be.enabled){let q=Math.max(0,(Ce=e.continuousRotate.speed)!=null?Ce:90),ee=Math.sign((Te=e.continuousRotate.direction)!=null?Te:1)||1,K=q*Math.PI/180;o+=K*ee*b,this.pixiObject.rotation=T+o}};bt.shared.add(d),this._tickerCleanup=()=>{var v,b,w,y,x;if(bt.shared.remove(d),this.pixiObject){let I=this.transform.scale*(((b=(v=this._config)==null?void 0:v.effects)==null?void 0:b.scale_x)||1),j=this.transform.scale*(((y=(w=this._config)==null?void 0:w.effects)==null?void 0:y.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(I,j):this.pixiObject.scale&&(this.pixiObject.scale.x=I,this.pixiObject.scale.y=j)}}}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)}},Rt=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 Vi(e,i.object_config||e,t,i);return this.objects.set(e,n),n.onRebuildRequired=async(a,r)=>{if(this.onObjectRebuildRequired){console.log(`[GameObjectManager] Triggering rebuild for ${e}`);let o=await this.onObjectRebuildRequired(e,r);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(r)},n}get(e){return this.objects.get(e)}updateConfig(e){this.config=e;for(let[t,i]of this.objects.entries()){let n=e.objects.get(t);n&&i.updateConfig(n)}}getAll(){return Array.from(this.objects.values())}remove(e){let t=this.objects.get(e);t&&t.destroy(),this.objects.delete(e)}clear(){for(let e of this.objects.values())e.destroy();this.objects.clear()}};var Wi={"brand.primary":{family:"Arial, sans-serif",weight:"400"},"brand.warning":{family:"Arial Black, Arial, sans-serif",weight:"900"},"brand.heading":{family:"Arial Black, Arial, sans-serif",weight:"800"},"brand.body":{family:"Arial, sans-serif",weight:"400"}};function Ro(s){let e=Wi[s];return e?e.family:(console.warn(`Font ID "${s}" not found in registry, using fallback`),"Arial, sans-serif")}function zo(s){var t;let e=Wi[s];return e&&(t=e.weight)!=null?t:"400"}function Do(s,e){Wi[s]=e}function $o(){return Object.keys(Wi)}var vt=null;function Ho(){return console.log("[LottieOverlay] getLottie called, lottieLib cached?",!!vt),console.log("[LottieOverlay] window.lottie exists?",typeof window!="undefined"&&!!window.lottie),vt||(typeof window!="undefined"&&window.lottie?(vt=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(s=>s.toLowerCase().includes("lottie")):"no window"),vt=null)),vt}function No(s){return!s||s.startsWith("http://")||s.startsWith("https://")||s.startsWith("/")?s:`/${s.replace(/^\.\//,"")}`}function Fo(s){try{let e=new XMLHttpRequest;return e.open("GET",No(s),!1),e.send(null),e.status<200||e.status>=300||!e.responseText?null:JSON.parse(e.responseText)}catch{return null}}function os(s){return!s||typeof s!="object"||!Array.isArray(s.layers)?null:(Array.isArray(s.assets)||(s.assets=[]),Array.isArray(s.chars)||(s.chars=[]),s)}function Wn(s){vt=s}function Bo(s,e,t,i){var I,j,T,_,O,L,A,k,C,E,S,M,P,R,D,N,H,F,G;let n=t.objects.get(s);if(!n)return console.warn(`[LottieOverlay] Object config not found: ${s}`),null;let a=((I=n.effects)==null?void 0:I.lottie)||{},r=n.transform||{},o=n.render||{};if(a.enabled===!1||o.visible===!1)return null;let l=i==null?void 0:i[s],c=os(l);if(!c){let Y=(T=(j=n.render)==null?void 0:j.asset)==null?void 0:T.path;if(typeof Y=="string"&&Y.toLowerCase().endsWith(".json")){let Q=Fo(Y);if(c=os(Q),c)try{i[s]=c}catch{}}}if(!c){let Y=l&&typeof l=="object"?Object.prototype.toString.call(l):typeof l;return console.warn(`[LottieOverlay] Lottie JSON invalid for: ${s}`,{kind:Y}),null}let d=Ho();if(!d)return console.warn(`[LottieOverlay] lottie-web is not available. Cannot play animation: ${s}`),null;let p=(_=a.width)!=null?_:300,u=(O=a.height)!=null?O:300,g=(L=r.scale)!=null?L:1,h=((k=(A=r.position)==null?void 0:A.x)!=null?k:0)+((E=(C=r.offset)==null?void 0:C.x)!=null?E:0),m=((M=(S=r.position)==null?void 0:S.y)!=null?M:0)+((R=(P=r.offset)==null?void 0:P.y)!=null?R:0),f=(D=r.rotation)!=null?D:0,v=(N=o.z_index)!=null?N:100,b=(H=o.alpha)!=null?H:1,w=document.createElement("div");w.style.cssText=`
2492
2597
  position: absolute;
2493
- top: calc(50% + ${h}px);
2494
- left: calc(50% + ${m}px);
2598
+ top: calc(50% + ${m}px);
2599
+ left: calc(50% + ${h}px);
2495
2600
  transform: translate(-50%, -50%) scale(${g}) rotate(${f}deg);
2496
2601
  width: ${p}px;
2497
2602
  height: ${u}px;
2498
2603
  pointer-events: none;
2499
- z-index: ${b};
2500
- opacity: ${v};
2501
- `,e.appendChild(x);let y;try{y=d.loadAnimation({container:x,renderer:a.renderer||"svg",loop:(B=a.loop)!=null?B:!1,autoplay:(U=a.autoplay)!=null?U:!0,animationData:c})}catch(W){return x.parentNode&&x.parentNode.removeChild(x),console.warn(`[LottieOverlay] Failed to start animation: ${r}`,W),null}a.speed!==void 0&&y.setSpeed(a.speed);let w=()=>{y.destroy(),x.parentNode&&x.parentNode.removeChild(x)};return a.loop||y.addEventListener("complete",w),{animation:y,cleanup:w}}var Zn=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 Xn(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 Mt(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 It=class{constructor(){this.config=null}init(e){this.config=e}get(e){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return this.config.objects.get(e)}getAllIds(){if(!this.config)throw new Error("RuntimeObjectRegistry not initialized. Call init() first.");return Array.from(this.config.objects.keys())}has(e){return this.config?this.config.objects.has(e):!1}};import*as Qr from"pixi.js";var lo=Qr;typeof window!="undefined"&&(window.__basePixi=Qr);import{Sprite as co,Text as po,TextStyle as uo,Texture as es}from"pixi.js";var ts=r=>r*Math.PI/180;function go(r,e){var s,o,l,c,d;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(s=e.render)!=null&&s.tint&&(i=e.render.tint);let n=new uo({fontFamily:(o=t.font)!=null?o:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(d=t.letterSpacing)!=null?d:0}),a=new po({text:t.text,style:n});return a.label=r,a}function ho(r){var d,p,u,g,m,h,f,b,v,x;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:s}=r,o={},l={},c={};t.sortableChildren=!0;for(let[y,w]of i.objects.entries()){if(s!=null&&s.has(y)||a&&!a.has(y)||(w==null?void 0:w.enabled)===!1)continue;let I=(p=(d=w==null?void 0:w.render)==null?void 0:d.asset)==null?void 0:p.path,R=(g=(u=w==null?void 0:w.render)==null?void 0:u.asset)==null?void 0:g.type,k=!!(I&&R==="image"),j=!!((m=w==null?void 0:w.ui)!=null&&m.text),_=j?(h=w==null?void 0:w.ui)==null?void 0:h.renderMode:void 0,C;if(_==="png"&&k?C="png":_==="text"&&j?C="text":k?C="png":j?C="text":C="skip",C!=="skip"){if(C==="text"){let A=go(y,w);if(!A)continue;let L=w.render;A.alpha=typeof(L==null?void 0:L.alpha)=="number"?L.alpha:1,A.visible=(L==null?void 0:L.visible)!==!1,A.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"?A.anchor.set(L.anchor.x,L.anchor.y):A.anchor.set(.5,.5);let T=w.transform,S=(T==null?void 0:T.position)||(T==null?void 0:T.offset);S&&A.position.set((f=S.x)!=null?f:0,(b=S.y)!=null?b:0);let E=typeof(T==null?void 0:T.scale)=="number"?T.scale:1;A.scale.set(E,E);let P=typeof(T==null?void 0:T.rotation)=="number"?T.rotation:0;A.rotation=ts(P),A.parent||t.addChild(A);try{n.create(y,A)}catch{}o[y]=A,c[y]=A}else if(C==="png"){let A=ye[y]||(typeof es!="undefined"?es.EMPTY:void 0),L=new co(A);L.label=y;let T=w.render;L.alpha=typeof(T==null?void 0:T.alpha)=="number"?T.alpha:1,L.visible=(T==null?void 0:T.visible)!==!1,L.zIndex=typeof(T==null?void 0:T.z_index)=="number"?T.z_index:0,T!=null&&T.anchor&&typeof T.anchor.x=="number"&&typeof T.anchor.y=="number"&&L.anchor.set(T.anchor.x,T.anchor.y);let S=w.transform,E=(S==null?void 0:S.position)||(S==null?void 0:S.offset);E&&L.position.set((v=E.x)!=null?v:0,(x=E.y)!=null?x:0);let P=typeof(S==null?void 0:S.scale)=="number"?S.scale:1;L.scale.set(P,P);let M=typeof(S==null?void 0:S.rotation)=="number"?S.rotation:0;L.rotation=ts(M),L.parent||t.addChild(L);try{n.create(y,L)}catch{}o[y]=L,l[y]=L}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var Qn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new It}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var o;let s=this.registry.get(a);if(!s){console.warn("[Assets] No config found for object:",a);return}try{let l=await De.create(a,s,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await De.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},is=new Qn,mo=new Proxy(is,{get(r,e){if(e in r&&typeof r[e]=="function")return r[e].bind(r);if(r.get(e))return r.get(e)}});function fo(r,e){is.init(r,e)}var ea=class extends Pt{async init(){Ui(this.context.config,this.context.app),await ye.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},Ri={scale:1,position:1},zi=[];function yo(r,e,t,i,n,a,s){zi.push({element:r,originalScale:a,positionHelper:e,heightPercent:n}),e(r,t,i,n,a,s,!1)}function xo(){zi.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(){zi.length=0,console.log("[LAYOUT] Cleared all responsive elements")}function ta(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),Ri.scale=Pe.scaleFactor,Ri.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Ri.scale.toFixed(3)}`),xo()}var Y={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=Y[r];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${r}.${e} = ${t}`))}function So(){return Y}var Ao={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Oi(r,e){return typeof r=="number"&&Number.isFinite(r)?r:e}function ut(r,e={x:.5,y:.5}){var t;if(Array.isArray(r))return{x:Oi(r[0],e.x),y:Oi(r[1],e.y)};if(r&&typeof r=="object"){let i=r;return{x:Oi(i.x,e.x),y:Oi(i.y,e.y)}}if(typeof r=="string"){let i=r.trim().toLowerCase();return(t=Ao[i])!=null?t:e}return e}function _t(r,e,t,i={}){var g,m,h,f,b,v;let n=ut(t),a=(g=i.inset)!=null?g:{},s=(m=i.padding)!=null?m:{x:0,y:0},o=((h=a.left)!=null?h:0)+s.x,l=((f=a.right)!=null?f:0)+s.x,c=((b=a.top)!=null?b:0)+s.y,d=((v=a.bottom)!=null?v:0)+s.y,p=Math.max(0,r-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function Ot(r,e,t,i={}){var h,f,b,v,x,y;let n=(h=i.inset)!=null?h:{},a=(f=i.padding)!=null?f:{x:0,y:0},s=((b=n.left)!=null?b:0)+a.x,o=((v=n.right)!=null?v:0)+a.x,l=((x=n.top)!=null?x:0)+a.y,c=((y=n.bottom)!=null?y:0)+a.y,d=Math.max(0,r-s-o),p=Math.max(0,e-l-c),u=ut(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),m=Math.min(Math.max(u.y,0),1);return{x:s+d*g,y:l+p*m}}function ia(r,e,t,i={}){var d,p,u;if(!r)return;let n=i.positionRatio?Ot(e,t,i.positionRatio,{inset:i.inset,padding:i.screenPadding}):_t(e,t,i.anchor,{inset:i.inset,padding:i.screenPadding}),a=(d=i.offset)!=null?d:{x:0,y:0},s=n.x+a.x,o=n.y+a.y;r.anchor&&i.renderAnchor&&r.anchor.set(i.renderAnchor.x,i.renderAnchor.y),fe(r,s,o);let l=(p=i.scale)!=null?p:1,c=(u=i.scaleMultiplier)!=null?u:1;(i.scale!==void 0||i.scaleMultiplier!==void 0)&&Ee(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,ta(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),ta(window.innerWidth,window.innerHeight),window.updateDebugConfig=Eo,window.getDebugConfig=So,window.copyConfig=Ro,window.applyConfig=jt,window.applyConfigForRatio=zo,window.positionAtBottom=ns,window.positionAtTop=Lo,window.positionAtCenter=ko,window.positionAtLeft=Mo,window.positionAtRight=Po,window.positionAtBottomLeft=Io,window.positionAtBottomRight=jo,window.positionAtTopLeft=_o,window.positionAtTopRight=Oo,window.applyPositionContract=Co,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 Di(r,e,t=0){return r*e+t}function $i(r,e,t=0){return r*(1-e)+t}function Hi(r,e,t=0){return r*e+t}function Ni(r,e,t=0){return r*(1-e)+t}function ue(r,e=0){return r/2+e}function To(r,e){return r*e}function Co(r,e,t,i){var s,o,l,c,d,p,u,g,m,h,f,b,v,x,y,w,I,R,k,j;let n=0,a=0;switch(i.type){case"top":n=ue(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),a=Di(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ue(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=$i(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Hi(e,i.percent,(h=(m=i.offset)==null?void 0:m.x)!=null?h:0),a=ue(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":n=Ni(e,i.percent,(x=(v=i.offset)==null?void 0:v.x)!=null?x:0),a=ue(t,(w=(y=i.offset)==null?void 0:y.y)!=null?w:0);break;case"center":n=ue(e,(R=(I=i.offset)==null?void 0:I.x)!=null?R:0),a=ue(t,(j=(k=i.offset)==null?void 0:k.y)!=null?j:0);break}r.position?r.position.set(n,a):(r.x=n,r.y=a),i.scale!==void 0&&i.scale!==1&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(i.scale,i.scale):(r.scale.x=i.scale,r.scale.y=i.scale))}function ns(r,e,t,i=.2,n=1,a=!0,s=!1){let o=To(t,i),l=$i(t,i/2);fe(r,ue(e),l);let c=a?n*Pe.scaleFactor:n;Ee(r,c),s&&!zi.find(d=>d.element===r)&&yo(r,ns,e,t,i,n,a)}function Lo(r,e,t,i=.1,n=1){fe(r,ue(e),Di(t,i)),Ee(r,n)}function ko(r,e,t,i=0,n=0,a=1){fe(r,ue(e,i),ue(t,n)),Ee(r,a)}function Mo(r,e,t,i=.1,n=1){fe(r,Hi(e,i),ue(t)),Ee(r,n)}function Po(r,e,t,i=.1,n=1){fe(r,Ni(e,i),ue(t)),Ee(r,n)}function Io(r,e,t,i=.05,n=.05,a=1){fe(r,Hi(e,n),$i(t,i)),Ee(r,a)}function jo(r,e,t,i=.05,n=.05,a=1){fe(r,Ni(e,n),$i(t,i)),Ee(r,a)}function _o(r,e,t,i=.05,n=.05,a=1){fe(r,Hi(e,n),Di(t,i)),Ee(r,a)}function Oo(r,e,t,i=.05,n=.05,a=1){fe(r,Ni(e,n),Di(t,i)),Ee(r,a)}function fe(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 Ee(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(Y))}function jt(r){Object.keys(r).forEach(e=>{let t=e;Y[t]&&r[t]&&Object.assign(Y[t],r[t])}),console.log("Config applied:",r)}function zo(r,e){let t=r/e;t>1.6?(jt(qe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(jt(qe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(jt(qe.square),console.log("Applied SQUARE config for ratio:",t)):(jt(qe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let r=window;r.configPresets=qe,r.resolveAnchorVec2=r.resolveAnchorVec2||ut,r.resolveScreenAnchorPoint=r.resolveScreenAnchorPoint||_t,r.resolveScreenRatioPoint=r.resolveScreenRatioPoint||Ot}var se=null;function Do(r,e,t,i,n,a={}){var P,M,O,D,N,H,B,U,W,Q,ie,oe,$,Z,le,ge,ce,be,Se,Ae,G,ee,K,ae,Ie,Ne,na,aa,ra,sa,oa,la,ca,da;let s=(P=a.enableDebugLogs)!=null?P:!1;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== STARTING LAYOUT CALCULATION ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Screen dimensions:",{width:i.width,height:i.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Time:",t),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Options:",a));let{mainContainer:o,label:l,background:c,backgroundTexture:d,app:p}=r;if(!p||!p.renderer){s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] \u274C No app or renderer, skipping layout");return}s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] App renderer dimensions:",{width:p.renderer.width,height:p.renderer.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] App screen dimensions:",{width:p.screen.width,height:p.screen.height}));let u=i.width,g=i.height;s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Base dimensions:",{baseWidth:u,baseHeight:g});let m=u*Y.layout.screen_scale_x,h=g*Y.layout.screen_scale_y,f=u/2,b=e.engine.runtime||{},v=b.layout||{};s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug config:",{screen_scale_x:Y.layout.screen_scale_x,screen_scale_y:Y.layout.screen_scale_y}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Calculated dimensions:",{width:m,height:h,midX:f}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Engine runtime:",b),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Layout config:",v));let x=v.design_width_portrait||400,y=m/x;y=Math.min(y,1.15);let w=y*((M=Y.engine.scale)!=null?M:1),I=(O=a.skipMainContainerTransform)!=null?O:!1;!I&&o&&o.scale&&(typeof o.scale.set=="function"?o.scale.set(w):(o.scale.x=w,o.scale.y=w));let R=(D=v.main_container_anchor)!=null?D:"center",k=(N=v.main_container_position_ratio)!=null?N:{x:.5,y:.5},j=(H=v.main_container_offset)!=null?H:{x:0,y:0},_=v.main_container_position_ratio?Ot(u,g,k):_t(u,g,R),C=_.x+j.x+Y.layout.position_offset.x,A=_.y+j.y+Y.layout.position_offset.y;if(!I&&o&&o.position&&(typeof o.position.set=="function"?o.position.set(C,A):(o.position.x=C,o.position.y=A)),n&&(o!=null&&o.toLocal))for(let[re,ne]of e.objects.entries()){let q=ne==null?void 0:ne.transform;if(!q||((B=q.position_mode)!=null?B:"static")!=="static")continue;let F=(U=n.get)==null?void 0:U.call(n,re),ve=((W=F==null?void 0:F.getDisplayObject)==null?void 0:W.call(F))||(F==null?void 0:F.pixiObject)||F;if(!ve||ve.parent!==o)continue;let Rt=q.position_ratio!=null?Ot(u,g,q.position_ratio):_t(u,g,(Q=q.anchor)!=null?Q:"center"),zt=o.toLocal(new vo(Rt.x,Rt.y)),Dt=(ie=q.position)!=null?ie:{x:0,y:0},Be=zt.x+Dt.x,Bi=zt.y+Dt.y;typeof(F==null?void 0:F.setPosition)=="function"?F.setPosition(Be,Bi):(fe(ve,Be,Bi),(oe=F==null?void 0:F.transform)!=null&&oe.position&&(F.transform.position.x=Be,F.transform.position.y=Bi))}let L=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,S=((L==null?void 0:L.buildMode)||(typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"dev"))==="dev";if(Y.layout.debug_rect_visible&&S){(!se||se.parent!==p.stage)&&(se==null||se.destroy(),se=new bo,se.zIndex=9999,p.stage.addChild(se)),se.clear();let re=Y.layout.debug_rect_scale_x,ne=Y.layout.debug_rect_scale_y,q=(u-4)*re,je=(g-4)*ne,F=(u-q)/2,ve=(g-je)/2;s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== DEBUG RECT POSITIONING ====="),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect calculations:",{baseWidth:u,baseHeight:g,rectW:q,rectH:je,offsetX:F,offsetY:ve}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Debug rect final position:",{x:2+F,y:2+ve,width:q,height:je})),se.rect(2+F,2+ve,q,je).stroke({width:Y.layout.debug_rect_thickness,color:Y.layout.debug_rect_color})}else se&&(se.destroy(),se=null);let E=(($=r.label)==null?void 0:$.config)||e.objects.get("label_1")||e.objects.get("ui_tutorial_1");if(l&&l.position&&E){let re=(le=(Z=E==null?void 0:E.transform)==null?void 0:Z.anchor)!=null?le:"center",ne=(ge=E==null?void 0:E.transform)==null?void 0:ge.position_ratio,q=((ce=E==null?void 0:E.transform)==null?void 0:ce.offset)||{x:0,y:0};ia(l,u,g,{anchor:re,positionRatio:ne,offset:{x:q.x*w,y:q.y*w},renderAnchor:ut(re)})}if(l&&l.alpha>0){let re=1+Math.sin(t*Y.engine.label_pulse_speed)*Y.engine.label_pulse_intensity,ne=(Se=(be=E==null?void 0:E.transform)==null?void 0:be.scale)!=null?Se:1,q=re*w*ne;l.scale&&(typeof l.scale.set=="function"?l.scale.set(q):(l.scale.x=q,l.scale.y=q))}if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] ===== BACKGROUND POSITIONING ====="),c){s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background object exists:",!!c),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background type:",(Ae=c.constructor)==null?void 0:Ae.name)),c.alpha=((ee=(G=b.background)==null?void 0:G.alpha)!=null?ee:.98)*Y.engine.background_alpha,s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background alpha set to:",c.alpha);let re=e.objects.get("background_1");s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background config:",re);let ne=(re==null?void 0:re.transform)||{};s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background transform:",ne);let q=ne.offset||{x:0,y:0},je=((ae=(K=b.background)==null?void 0:K.offset_y)!=null?ae:0)+Y.engine.background_offset_y,F=(Ie=ne.anchor)!=null?Ie:"center",ve=ne.position_ratio;if(s&&console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background positioning params:",{bgOffset:q,bgRuntimeOffsetY:je,bgScreenAnchor:F,bgPositionRatio:ve,baseWidth:u,baseHeight:g,finalScale:w}),ia(c,u,g,{anchor:F,positionRatio:ve,offset:{x:q.x*w,y:q.y*w+je},renderAnchor:ut(F)}),s&&(console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background position after applyScreenAnchor:",{x:c.x,y:c.y,scaleX:(Ne=c.scale)==null?void 0:Ne.x,scaleY:(na=c.scale)==null?void 0:na.y,anchorX:(aa=c.anchor)==null?void 0:aa.x,anchorY:(ra=c.anchor)==null?void 0:ra.y,pivotX:(sa=c.pivot)==null?void 0:sa.x,pivotY:(oa=c.pivot)==null?void 0:oa.y,width:c.width,height:c.height}),console.log("\u{1F3AF} [LAYOUT_DEBUGS] Background texture dimensions:",{textureWidth:d==null?void 0:d.width,textureHeight:d==null?void 0:d.height})),d){let Rt=Math.max(m/d.width,h/d.height),zt=(ca=(la=b.background)==null?void 0:la.scale_multiplier)!=null?ca:1.05,Dt=(da=ne.scale)!=null?da:1,Be=Rt*zt*Y.engine.background_scale*Dt;c.scale&&(typeof c.scale.set=="function"?c.scale.set(Be):(c.scale.x=Be,c.scale.y=Be))}else c&&typeof c.clear=="function"&&(c.clear(),c.rect(-m/2,-h/2,m,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{Va as a,Xn as b,Pi as c,Ii as d,ji as e,Mt as f,eo as g,to as h,io as i,no as j,$n as k,oo as l,De as m,Zn as n,Pt as o,It as p,lo as q,ho as r,mo as s,fo as t,ea as u,Ri as v,wo as w,ta as x,ut as y,_t as z,Ot as A,ia as B,Do as C,$o as D,Ya as E,Wa as F,Qi as G,Xe as H,Jo as I,Si as J,In as K,jr as L,On as M,Nd as N,Bd as O,Le as P,Ns as Q,Bs as R,Nn as S,we as T,Ce as U};
2604
+ z-index: ${v};
2605
+ opacity: ${b};
2606
+ `,e.appendChild(w);let y;try{y=d.loadAnimation({container:w,renderer:a.renderer||"svg",loop:(F=a.loop)!=null?F:!1,autoplay:(G=a.autoplay)!=null?G:!0,animationData:c})}catch(Y){return w.parentNode&&w.parentNode.removeChild(w),console.warn(`[LottieOverlay] Failed to start animation: ${s}`,Y),null}a.speed!==void 0&&y.setSpeed(a.speed);let x=()=>{y.destroy(),w.parentNode&&w.parentNode.removeChild(w)};return a.loop||y.addEventListener("complete",x),{animation:y,cleanup:x}}var oa=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 ra(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 Rt(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 zt=class{setContext(e){this.context=e}};var Dt=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 ls from"pixi.js";var Uo=ls;typeof window!="undefined"&&(window.__basePixi=ls);import{Sprite as Go,Text as qo,TextStyle as Vo,Texture as cs}from"pixi.js";var ds=s=>s*Math.PI/180;function Wo(s,e){var r,o,l,c,d;let t=e.ui;if(!(t!=null&&t.text))return null;let i="#ffffff";(r=e.render)!=null&&r.tint&&(i=e.render.tint);let n=new Vo({fontFamily:(o=t.font)!=null?o:"Arial",fontSize:(l=t.fontSize)!=null?l:16,fill:i,align:(c=t.align)!=null?c:"center",letterSpacing:(d=t.letterSpacing)!=null?d:0}),a=new qo({text:t.text,style:n});return a.label=s,a}function Yo(s){var d,p,u,g,h,m,f,v,b,w;let{stage:e,mainContainer:t,activeConfig:i,gameObjectManager:n,allowList:a,denyList:r}=s,o={},l={},c={};t.sortableChildren=!0;for(let[y,x]of i.objects.entries()){if(r!=null&&r.has(y)||a&&!a.has(y)||(x==null?void 0:x.enabled)===!1)continue;let I=(p=(d=x==null?void 0:x.render)==null?void 0:d.asset)==null?void 0:p.path,j=(g=(u=x==null?void 0:x.render)==null?void 0:u.asset)==null?void 0:g.type,T=!!(I&&j==="image"),_=!!((h=x==null?void 0:x.ui)!=null&&h.text),O=_?(m=x==null?void 0:x.ui)==null?void 0:m.renderMode:void 0,L;if(O==="png"&&T?L="png":O==="text"&&_?L="text":T?L="png":_?L="text":L="skip",L!=="skip"){if(L==="text"){let A=Wo(y,x);if(!A)continue;let k=x.render;A.alpha=typeof(k==null?void 0:k.alpha)=="number"?k.alpha:1,A.visible=(k==null?void 0:k.visible)!==!1,A.zIndex=typeof(k==null?void 0:k.z_index)=="number"?k.z_index:0,k!=null&&k.anchor&&typeof k.anchor.x=="number"&&typeof k.anchor.y=="number"?A.anchor.set(k.anchor.x,k.anchor.y):A.anchor.set(.5,.5);let C=x.transform,E=(C==null?void 0:C.position)||(C==null?void 0:C.offset);E&&A.position.set((f=E.x)!=null?f:0,(v=E.y)!=null?v:0);let S=typeof(C==null?void 0:C.scale)=="number"?C.scale:1;A.scale.set(S,S);let M=typeof(C==null?void 0:C.rotation)=="number"?C.rotation:0;A.rotation=ds(M),A.parent||t.addChild(A);try{n.create(y,A)}catch{}o[y]=A,c[y]=A}else if(L==="png"){let A=ye[y]||(typeof cs!="undefined"?cs.EMPTY:void 0),k=new Go(A);k.label=y;let C=x.render;k.alpha=typeof(C==null?void 0:C.alpha)=="number"?C.alpha:1,k.visible=(C==null?void 0:C.visible)!==!1,k.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"&&k.anchor.set(C.anchor.x,C.anchor.y);let E=x.transform,S=(E==null?void 0:E.position)||(E==null?void 0:E.offset);S&&k.position.set((b=S.x)!=null?b:0,(w=S.y)!=null?w:0);let M=typeof(E==null?void 0:E.scale)=="number"?E.scale:1;k.scale.set(M,M);let P=typeof(E==null?void 0:E.rotation)=="number"?E.rotation:0;k.rotation=ds(P),k.parent||t.addChild(k);try{n.create(y,k)}catch{}o[y]=k,l[y]=k}}}return t.parent||e.addChild(t),{objects:o,sprites:l,texts:c}}var la=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new Dt}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 r=this.registry.get(a);if(!r){console.warn("[Assets] No config found for object:",a);return}try{let l=await we.create(a,r,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 we.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},ps=new la,Ko=new Proxy(ps,{get(s,e){if(e in s&&typeof s[e]=="function")return s[e].bind(s);if(s.get(e))return s.get(e)}});function Xo(s,e){ps.init(s,e)}var ca=class extends zt{async init(){Xi(this.context.config,this.context.app),await ye.ready(),console.log("[AssetSystem] All assets preloaded and ready")}async onStart(){}onConfigUpdate(){console.log("[AssetSystem] Config updated - systems will refresh textures")}};function Jo(s){var o,l,c;let{setState:e,updateLabelAlpha:t,updateHandAlpha:i,config:n,states:a}=s,r=((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=r.tutorial_delay_ms)!=null?c:1500)}export{Qa as a,ra as b,Gi as c,qi as d,Vi as e,Rt as f,Ro as g,zo as h,Do as i,$o as j,Wn as k,Bo as l,we as m,oa as n,zt as o,Dt as p,Uo as q,Yo as r,Ko as s,Xo as t,ca as u,Ii as v,Ys as w,Hn as x,He as y,Ne as z,Fe as A,Nn as B,po as C,Jo as D,er as E,tr as F,on as G,it as H,dl as I,Pi as J,Fn as K,Br as L,Un as M,hp as N,mp as O,Me as P,xo as Q,So as R,Kn as S,Ae as T,Pe as U};