handler-playable-sdk 0.5.2 → 0.5.26

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.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var Ho=Object.create;var Bt=Object.defineProperty;var No=Object.getOwnPropertyDescriptor;var Fo=Object.getOwnPropertyNames;var Bo=Object.getPrototypeOf,Uo=Object.prototype.hasOwnProperty;var de=(a,e)=>()=>(a&&(e=a(a=0)),e);var ht=(a,e)=>{for(var t in e)Bt(a,t,{get:e[t],enumerable:!0})},Ma=(a,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Fo(e))!Uo.call(a,n)&&n!==t&&Bt(a,n,{get:()=>e[n],enumerable:!(i=No(e,n))||i.enumerable});return a};var qe=(a,e,t)=>(t=a!=null?Ho(Bo(a)):{},Ma(e||!a||!a.__esModule?Bt(t,"default",{value:a,enumerable:!0}):t,a)),Go=a=>Ma(Bt({},"__esModule",{value:!0}),a);var pe,un=de(()=>{"use strict";pe=class{static get(e){var t;return(t=this.store.get(e))==null?void 0:t.data}static set(e,t){this.store.set(e,{data:t})}static has(e){return this.store.has(e)}static clear(){this.store.clear()}};pe.store=new Map});function Zo(){var a,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(a=document.querySelector("script"))==null?void 0:a.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),i=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(t&&!i)}catch{return!1}}async function Qo(){try{if(typeof window!="undefined"){let a=await fetch("./build-settings.json");if(a.ok){let e=await a.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function es(){try{if(typeof window!="undefined"){let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function ts(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${N}`),Object.keys(ue).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(ue)),ue;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),ue={...window.INLINE_ASSETS},ue;if(!(N==="publish"&&re!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ue;if(!gn){let e=typeof window!="undefined"?new URL("inline-assets.js",window.location.href).href:"./inline-assets.js";console.log("[AssetLoader] Loading inline assets from:",e),gn=(async()=>{try{try{let r=await import(e+"?t="+Date.now());if(r.INLINE_ASSETS)return console.log("[AssetLoader] Loaded INLINE_ASSETS via ES module:",Object.keys(r.INLINE_ASSETS)),r.INLINE_ASSETS}catch(r){console.warn("[AssetLoader] ES module import failed, trying text parse:",r)}let t=await fetch(e);if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);let i=await t.text();console.log("[AssetLoader] Received JS code, length:",i.length);let n=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(n)try{let r=n[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let o=new Function("return "+r)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(o)),o}catch(r){return console.warn("[AssetLoader] Failed to parse inline assets:",r),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ue=await gn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ue)),ue}function hn(a){return a===null||typeof a!="object"||(Object.freeze(a),Object.values(a).forEach(e=>hn(e))),a}function is(a=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=a,i.height=e;let n=i.getContext("2d");return n.fillStyle=`#${t.toString(16).padStart(6,"0")}`,n.fillRect(0,0,a,e),n.strokeStyle="#000",n.strokeRect(0,0,a,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",a/2,e/2),ge.Texture.from(i)}function fn(a,e){dr.set(a,e)}var ge,lr,cr,Ie,N,re,Ee,ue,gn,dr,je,Vt=de(()=>{"use strict";ge=require("pixi.js");un();lr=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",cr=Zo(),Ie=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,N=cr?"publish":lr,re=Ie==null?void 0:Ie.assetsInlined;Ie!=null&&Ie.buildMode&&(N=Ie.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${N}`));Ee=es();Ee!=null&&Ee.buildMode&&(N=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${N}`));(Ee==null?void 0:Ee.assetsInlined)!==void 0&&(re=Ee.assetsInlined);Qo().then(a=>{a!=null&&a.buildMode&&a.buildMode!==N&&(N=a.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${N}`)),(a==null?void 0:a.assetsInlined)!==void 0&&(re=a.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${lr}, Runtime: ${cr?"publish":"dev"}, Effective: ${N}`);ue={},gn=null;dr=new Map;je=class{static async load(e,t,i,n){let r=`${e}:${t.path}`,o=pe.get(r);if(o!==void 0)return o;console.log(`[AssetLoader] Loading asset: ${e}, type: ${t.type}, Effective mode: ${N}`),console.log(`[AssetLoader] Window defined: ${typeof window!="undefined"}, INLINE_ASSETS exists: ${!!(typeof window!="undefined"&&window.INLINE_ASSETS)}, keys: ${typeof window!="undefined"&&window.INLINE_ASSETS?Object.keys(window.INLINE_ASSETS).length:"N/A"}`);let s=await ts(),l=s[e];if(!l&&n&&(l=s[n],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${n}`)),!l&&t.path){let d=t.path.split("/");if(d.length>=2){let u=d[d.length-1].split(".")[0];s[u]&&(l=s[u],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${u}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),N==="publish"&&re!==!1&&(console.log("[AssetLoader] \u26A0\uFE0F PUBLISH MODE DETECTED - inline assets are MANDATORY"),!l))throw new Error(`[AssetLoader] PUBLISH MODE: Inline asset required but NOT FOUND for object: ${e}, path: ${t.path}`);let p=dr.get(t.type);if(p)try{let d=await p(t.path,l,e,i);return pe.set(r,d),d}catch(d){return this.handleFailure(e,t.type,d)}try{let d;switch(t.type){case"image":d=await this.loadImage(t.path,l);break;case"json":d=await this.loadJSON(t.path,l),d=hn(d);break;default:throw new Error(`Unknown asset type: ${t.type}`)}return pe.set(r,d),d}catch(d){return this.handleFailure(e,t.type,d)}}static async loadImage(e,t){let i=N==="publish",n=i&&re!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof t!="string"||!t.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof t}`);try{return await ge.Assets.load(t)}catch(r){throw console.error("[AssetLoader] Failed to load texture from data URI:",r),r}}if(t&&typeof t=="string"&&t.startsWith("data:"))try{return await ge.Assets.load(t)}catch(r){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",r),await ge.Assets.load(e)}return await ge.Assets.load(e)}static async loadJSON(e,t){let i=N==="publish",n=i&&re!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}let r=await fetch(e);if(!r.ok)throw new Error(`JSON fetch failed: ${e}`);return r.json()}static handleFailure(e,t,i){if(N==="dev"){let r=t==="image"?is():hn({__placeholder:!0,type:t});return pe.set(e+":"+((i==null?void 0:i.path)||"missing"),r),r}throw i}};fn("image",async(a,e)=>{let t=N==="publish",i=t&&re!==!1,n=N==="brand",r=t&&re===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${a}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return ge.Assets.load(e)}let o=a;return(n||r)&&a&&!a.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=a,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${a}" as-is`)):(o=`assets/${a}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${a}" -> "${o}"`))),ge.Assets.load(e||o)});fn("json",async(a,e)=>{let t=N==="publish",i=t&&re!==!1,n=N==="brand",r=t&&re===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${a}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let o=a;if((n||r)&&a&&!a.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=a,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${a}" as-is`)):(o=`assets/${a}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${a}" -> "${o}"`))),e)return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e);let s=await fetch(o);if(!s.ok)throw new Error(`JSON fetch failed: ${a}`);return s.json()})});var ur={};ht(ur,{AssetTextures:()=>oe,initAssetTextures:()=>yn});function yn(a,e){pr.init(a,e),typeof window!="undefined"&&(window.__AssetTextures=oe)}var bn,pr,oe,Ke=de(()=>{"use strict";Vt();bn=class{constructor(){this.textures=new Map;this.readyPromise=null;this.priorityReadyPromise=null;this.priorityReadyResolve=null;this.config=null;this.app=null;this.attempted=new Set;this.waiters=new Set}init(e,t){if(this.config===e&&this.app===t&&this.priorityReadyPromise){console.log("[AssetTextures] init called with same config/app; keeping existing state");return}this.textures.clear(),this.readyPromise=null,this.priorityReadyPromise=null,this.priorityReadyResolve=null,this.attempted.clear(),this.waiters.clear(),this.priorityReadyPromise=new Promise(i=>{this.priorityReadyResolve=i}),this.config=e,this.app=t,console.log("[AssetTextures] Initialized with config, cleared previous textures")}async ready(){if(this.readyPromise){await this.readyPromise;return}if(!this.config)throw new Error("[AssetTextures] Must call init() before ready() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before ready() - app is null");let e=this.config,t=this.app;return this.readyPromise=(async()=>{var o;console.log("[AssetTextures] Loading all assets...");let i=new Set(["background_loading_1"]),n=[],r=[];for(let[s,l]of e.objects.entries()){let c=(o=l.render)==null?void 0:o.asset;if(!c)continue;let p=async()=>{var d;try{let u=(d=l.identity)==null?void 0:d.id;console.log(`[AssetTextures] Loading ${c.type}: ${s} (${u})`);let g=await je.load(s,c,t,u);this.textures.set(s,g),console.log(`[AssetTextures] \u2713 Loaded: ${s}`)}catch(u){console.error(`[AssetTextures] \u2717 Failed to load: ${s}`,u)}finally{this.attempted.add(s);try{for(let u of Array.from(this.waiters))u()}catch{}}};i.has(s)?n.push(p()):r.push(p())}n.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(n),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(r),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,t={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let n=Array.from(new Set((e||[]).filter(s=>typeof s=="string"&&s))).filter(s=>{var l,c,p,d;try{let u=(p=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:p.call(c,s);return!!((d=u==null?void 0:u.render)!=null&&d.asset)}catch{return!1}});if(n.length===0)return;this.ready().catch(()=>{});let r=()=>n.every(s=>this.textures.has(s)||this.attempted.has(s));if(r())return;let o=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(s=>{let l=!1,c=()=>{l||r()&&(l=!0,this.waiters.delete(c),s())};this.waiters.add(c),c(),o>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:n}),s())},o)})}get(e){return this.textures.get(e)}set(e,t){this.textures.set(e,t),console.log(`[AssetTextures] Updated texture: ${e}`)}clear(){this.textures.clear(),this.readyPromise=null,console.log("[AssetTextures] Cleared all textures")}getAllIds(){return Array.from(this.textures.keys())}},pr=new bn,oe=new Proxy(pr,{get(a,e){return e in a&&typeof a[e]=="function"?a[e].bind(a):a.get(e)},set(a,e,t){return a.set(e,t),!0}})});var Xe={};ht(Xe,{applyConfigOverride:()=>Ae,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,clearConfigOverrides:()=>se,clearConfigOverridesForObject:()=>Ar,configOverrideManager:()=>Cr,deepClone:()=>G,exportConfigsAsJSON:()=>ze,getConfigOverrides:()=>Y,getConfigStateSummary:()=>ai,getOverrideMode:()=>xt,removeConfigOverride:()=>ni,resetToApplied:()=>Et,resetToOriginal:()=>oi,setOverrideMode:()=>En});function ti(){return typeof window=="undefined"?null:window.__editableConfig||null}function vr(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function br(a,e){var t,i;if(!a)return null;try{if(a instanceof Map)return(t=a.get(e))!=null?t:null;if(typeof a=="object")return(i=a[e])!=null?i:null}catch{}return null}function ks(a,e,t){if(a){if(a instanceof Map){a.set(e,t);return}typeof a=="object"&&(a[e]=t)}}function wr(a,e){for(let t of e)wt(a,t.path,t.value)}function xr(a){var s;if(typeof window=="undefined")return;let e=ti();if(!e)return;let t=vr(),i=(s=t?br(t.objects,a):null)!=null?s:br(e.objects,a);if(!i)return;let n=G(i),r=Y().filter(l=>l.objectId===a);try{wr(n,r)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",a,l);return}ks(e.objects,a,n);let o=window.applyEditableObjectConfig;if(typeof o=="function")try{o(a,n)}catch{}}function Ps(){var n;if(typeof window=="undefined")return;let a=ti();if(!(a!=null&&a.engine))return;let e=vr(),t=G(((n=e==null?void 0:e.engine)!=null?n:a.engine)||{}),i=Y().filter(r=>!r.objectId&&!r.sceneId);try{wr(t,i)}catch(r){console.error("[CONFIG] Failed to reapply engine overrides",r);return}try{let r=a.engine;for(let o of Object.keys(r))o in t||delete r[o];for(let[o,s]of Object.entries(t))r[o]=s}catch{a.engine=t}}function _s(){if(typeof window=="undefined")return"unknown";let a=window;return typeof a.__HANDLER_PROJECT_ID=="string"?a.__HANDLER_PROJECT_ID:"handler-default"}function Er(){return`handler_preview_config_overrides::${_s()}`}function Ms(){if(typeof window=="undefined")return[];try{let a=window.localStorage.getItem(Er());if(!a)return[];let e=JSON.parse(a);return Array.isArray(e)?e:[]}catch{return[]}}function ii(a){if(typeof window!="undefined")try{window.localStorage.setItem(Er(),JSON.stringify(a))}catch{}}function xt(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function En(a){if(typeof window!="undefined"){window.__enableConfigOverrides=a;try{window.localStorage.setItem(Sr,a?"true":"false")}catch{}}}function Ae(a,e={}){var u,g;let{objectId:t,path:i,value:n}=a,{silent:r=!1,persist:o=!0,emitEvent:s=!0}=e,l=ti();if(!l){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let c=t?(g=(u=l.objects)==null?void 0:u.get)==null?void 0:g.call(u,t):l.engine;if(!c){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:t,path:i,hasObjects:!!l.objects});return}r||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:i,value:n});let p;try{p=Is(c,i),wt(c,i,n)}catch(m){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:n},m);return}window.__configChanges=window.__configChanges||[];let d=window.__configChanges;if(d.push({objectId:t,path:i,oldValue:p,newValue:n,ts:Date.now()}),d.length>Os&&d.shift(),o){let m=Y(),h=m.findIndex(f=>f.objectId===t&&f.sceneId===a.sceneId&&f.path===i);h>=0?m[h].value=n:m.push(a),window.__configOverrides=m,ii(m),xt()||En(!0)}r||console.log("[CONFIG] Applied override:",a),s&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:a}))}function Ce(a,e={}){let t=e.emitEvent!==!1,i=[];for(let n of a)n!=null&&n.objectId&&typeof n.objectId=="string"&&i.push(n.objectId),Ae(n,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let n=Array.from(new Set(i));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:n,count:a.length}}))}}function se(){window.__configOverrides=[],window.__configChanges=[],ii([]),console.log("[CONFIG] Cleared all overrides")}function Ar(a){let e=Y().filter(i=>i.objectId!==a);window.__configOverrides=e,ii(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==a),xr(a),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:a}}))}function ni(a,e){let t=Y().filter(n=>n.objectId!==a||n.path!==e);window.__configOverrides=t,ii(t);let i=window.__configChanges||[];window.__configChanges=i.filter(n=>n.objectId!==a||n.path!==e),a?xr(a):Ps(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:a,path:e}}))}function Y(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Ms()),window.__configOverrides||[])}function wt(a,e,t){var o;let i=e.split("."),n=i.pop(),r=a;for(let s of i){if(r[s]!==void 0&&typeof r[s]!="object")throw new Error(`Invalid override path: ${e} (hit primitive at ${s})`);r[s]=(o=r[s])!=null?o:{},r=r[s]}r[n]=t}function Is(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function G(a){if(a===null||typeof a!="object")return a;if(a instanceof Date)return new Date(a.getTime());if(a instanceof Set)return new Set([...a].map(t=>G(t)));if(ArrayBuffer.isView(a))return a.slice();if(a instanceof Array)return a.map(t=>G(t));if(a instanceof Map){let t=new Map;return a.forEach((i,n)=>t.set(n,G(i))),t}let e={};for(let t in a)Object.prototype.hasOwnProperty.call(a,t)&&(e[t]=G(a[t]));return e}function ze(){let a=window.__editableConfigBaseline;if(!a){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return yr(e)}return yr(a)}function yr(a){let e={objects:{},scenes:{},engine:G(a.engine||{})},t=a.objects;if(t instanceof Map)t.forEach((r,o)=>{e.objects[o]=G(r)});else if(t&&typeof t=="object")for(let r in t)e.objects[r]=G(t[r]);let i=a.scenes;if(i instanceof Map)i.forEach((r,o)=>{e.scenes[o]=G(r)});else if(i&&typeof i=="object")for(let r in i)e.scenes[r]=G(i[r]);let n=Y();for(let r of n)r.objectId?(e.objects[r.objectId]||(e.objects[r.objectId]={}),wt(e.objects[r.objectId],r.path,r.value)):r.sceneId?(e.scenes[r.sceneId]||(e.scenes[r.sceneId]={}),wt(e.scenes[r.sceneId],r.path,r.value)):wt(e.engine,r.path,r.value);return e}function ai(){let a=Y(),e=new Set;for(let t of a)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:a.length,hasChanges:a.length>0,overrides:a}}async function ri(a){let e=ze(),t={};for(let[n,r]of Object.entries(e.objects)){let o=r,s=n;/^(json\.|ui\.|effects\.|engine\.)/.test(s)||(s=`json.${n}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=s),t[`objects/${s}.json`]=o}e.engine&&(e.engine.runtime&&(t["engine/engine.runtime.json"]=e.engine.runtime),e.engine.assets&&(t["engine/engine.assets.json"]=e.engine.assets),e.engine.splash&&(t["engine/engine.splash.json"]=e.engine.splash),e.engine.loading&&(t["engine/engine.loading.json"]=e.engine.loading),e.engine.start&&(t["engine/engine.start.json"]=e.engine.start),e.engine.tutorial&&(t["engine/engine.tutorial.json"]=e.engine.tutorial),e.engine.endgame&&(t["engine/engine.endgame.json"]=e.engine.endgame),!e.engine.runtime&&!e.engine.assets&&(t["engine/engine.json"]=e.engine));for(let[n,r]of Object.entries(e.scenes)){let o=n.startsWith("scene.")?n:`scene.${n}`;t[`scenes/${o}.json`]=r}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Y().length>0,versionName:a})});if(!i.ok){let n=await i.json();throw new Error(`Apply failed: ${n.error||"Unknown error"}`)}se();try{let n=ti();n&&(window.__editableConfigBaseline=G(n))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function Et(){se(),window.location.reload()}async function oi(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let e=await fetch("/api/reset-to-original",{method:"POST"});if(!e.ok){let t=await e.json();throw new Error(`Reset failed: ${t.error||"Unknown error"}`)}se(),window.location.reload()}var Sr,Os,Cr,K=de(()=>{"use strict";Sr="handler_preview_override_mode";if(typeof window!="undefined"){let a=window.localStorage.getItem(Sr);window.__enableConfigOverrides=a===null?!0:a==="true"}Os=500;Cr={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[]}}});function js(a,e){try{if(typeof a=="object"&&a!==null)return a;if(typeof a!="string")return null;if(a.startsWith("data:")){let i=a.indexOf(",");if(i===-1)return null;let n=a.slice(0,i);if(!n.includes("application/json")&&!n.includes("text/plain"))return null;let r=a.slice(i+1),o=n.includes("base64")?typeof atob=="function"?atob(r):r:decodeURIComponent(r);return JSON.parse(o)}let t=a.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(a):null}catch{return null}}function Rs(a){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=a.replace(/^\.\/+/,""),i=t.split("/").pop()||t,n=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let r of n){let o=e[r];if(o){let s=js(o,r);if(s!==null)return s}}return null}async function St(a){if(Sn.has(a)&&!An)return console.log(`[CONFIG] Using cached config for: "${a}"`),Sn.get(a);if(console.log(`[CONFIG] loadConfigFile called with: "${a}", MODE: ${H.toUpperCase()}, CACHE: ${An?"DISABLED":"ENABLED"}`),H==="publish"){let i=Rs(a);return i?(console.log(`[CONFIG] \u2713 Loaded ${a} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${a} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}H==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${a}"`);let e;H==="brand"?e=[`./${a.split("/").pop()||a}`,`./${a}`,`./${a.replace(/^configs\//,"")}`,`./${a.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${a}`,`./${a.replace(/^configs\//,"")}`,`./${a.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(i=>i.startsWith("./")?[i,`/${i.slice(2)}`]:i.startsWith("/")?[i]:[i,`/${i}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let i=An?"no-store":"force-cache";for(let n of e)try{let r=await fetch(n,{cache:i});if(!r.ok)continue;let o=await r.json();return console.log(`[CONFIG] \u2713 Loaded ${a} via ${n}`,o),o}catch(r){console.warn(`[CONFIG] \u2717 Failed to load ${n} (mode: ${H}):`,r)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${a}; using defaults`),{}})();return Sn.set(a,t),t}async function si(){console.log("[CONFIG] Loading component schemas...");let a=["components/identity.schema.json","components/transform.schema.json","components/render.schema.json","components/motion.schema.json","components/effects.schema.json","components/interaction.schema.json","components/gameplay.rules.schema.json","components/gameplay.tuning.schema.json","components/visibility.schema.json","components/audio.schema.json","components/physics.schema.json","components/ui.schema.json"],e=new Map;for(let t of a)try{let i=H==="publish"||H==="brand"?t.split("/").pop()||t:`configs/${t}`,n=await St(i);n.component&&(e.set(n.component,n),console.log(`[CONFIG] \u2713 Schema loaded: ${n.component} ${H==="publish"||H==="brand"?"(flattened)":"(nested)"}`))}catch(i){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,i)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function Te(a){console.log(`[CONFIG] Loading object config: ${a}`);let e=H==="publish"||H==="brand"?`${a}.json`:`configs/objects/${a}.json`;return await St(e)}async function li(a){let e=new Map;if(a.objects&&Array.isArray(a.objects)){for(let t of a.objects)if(t.enabled&&t.object_config)try{let i=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(i)||(i=`json.${i}`);let n=await Te(i);(!n||Object.keys(n).length===0)&&i!==t.instance_id&&(n=await Te(t.instance_id)),!n||Object.keys(n).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),n=await Te(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...n,instance_id:t.instance_id,object_config:t.object_config})}catch(i){console.warn(`Failed to load object ${t.object_config}:`,i)}}return e}async function ci(){console.log("[CONFIG] Loading engine configs...");let a=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(a.map(i=>{let n=`engine.${i}.json`,r=H==="publish"||H==="brand"?n:`configs/engine/${n}`;return St(r)})),t=Object.fromEntries(a.map((i,n)=>[i,e[n]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(a.map(i=>{var o;let n=(o=t[i])!=null?o:{},r=Object.keys(n);return[i,r.length>0?r:"empty"]}))),t}async function Cn(){return await St(H==="publish"||H==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function di(a="scene.main"){console.log(`[CONFIG] Loading scene config: ${a}`);let e=H==="publish"||H==="brand"?`${a}.json`:`configs/scenes/${a}.json`;return await St(e)}function Je(a,e){let t=[];if(!a.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let i=e.get("identity");if(i)for(let n of i.required||[])a.identity[n]||t.push(`Missing required identity field: ${n}`);for(let[n,r]of Object.entries(a)){if(n==="identity")continue;let o=e.get(n);if(o&&r&&typeof r=="object"){let s=r;for(let l of o.required||[])s[l]===void 0&&t.push(`Missing required field in ${n}: ${l}`);if(o.constraints&&typeof o.constraints=="object")for(let[l,c]of Object.entries(o.constraints)){let p=s[l];if(p!==void 0&&c&&typeof c=="object"){let d=c;typeof p=="number"&&(d.min!==void 0&&p<d.min&&t.push(`${n}.${l} value ${p} is below minimum ${d.min}`),d.max!==void 0&&p>d.max&&t.push(`${n}.${l} value ${p} is above maximum ${d.max}`))}}}}return{valid:t.length===0,errors:t}}function De(a,e){let t={...a},i=["identity","transform","render"];for(let[n,r]of e.entries())r.defaults&&Object.keys(r.defaults).length>0&&(i.includes(n)||t[n])&&(t[n]||(t[n]={}),t[n]={...r.defaults,...t[n]});return t}function Q(a,e,t,i){return typeof a!="number"||!Number.isFinite(a)?e:Math.min(Math.max(a,t),i)}function Lr(a,e){if(Array.isArray(a))return{x:Q(a[0],e.x,-2e3,2e3),y:Q(a[1],e.y,-2e3,2e3)};if(!a||typeof a!="object")return e;let{x:t,y:i}=a;return{x:Q(t,e.x,-2e3,2e3),y:Q(i,e.y,-2e3,2e3)}}function zs(a,e){if(Array.isArray(a))return{x:Q(a[0],e.x,0,1),y:Q(a[1],e.y,0,1)};if(!a||typeof a!="object")return e;let{x:t,y:i}=a;return{x:Q(t,e.x,0,1),y:Q(i,e.y,0,1)}}function Ds(a){if(Array.isArray(a))return{x:Q(a[0],.5,-10,10),y:Q(a[1],.5,-10,10)};if(a&&typeof a=="object"){let{x:e,y:t}=a;return{x:Q(e,.5,-10,10),y:Q(t,.5,-10,10)}}return typeof a=="string"?a:null}async function be(a="scene.main",e){var l,c,p,d,u,g,m,h,f,y,b,v,w,E;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await si(),i=Y();i.length>0&&console.log(`[CONFIG] Applying ${i.length} active overrides`);let n=await di(a);console.log(`[CONFIG] Scene config loaded: ${((l=n.objects)==null?void 0:l.length)||0} objects`);let r=await ci();console.log("[CONFIG] Loading object configs...");let o=await li(n);console.log(`[CONFIG] Loaded ${o.size} object configs:`,Array.from(o.keys()));for(let[x,A]of o.entries()){let S=De(A,t),P=Je(S,t);P.valid||console.warn(`Object ${x} validation errors:`,P.errors),(c=S.transform)!=null&&c.position&&(S.transform.position=Lr(S.transform.position,{x:0,y:0})),(p=S.transform)!=null&&p.offset&&(S.transform.offset=Lr(S.transform.offset,{x:0,y:0})),((d=S.transform)==null?void 0:d.anchor)!==void 0&&(S.transform.anchor=Ds(S.transform.anchor)),((u=S.transform)==null?void 0:u.position_ratio)!==void 0&&S.transform.position_ratio!==null&&(S.transform.position_ratio=zs(S.transform.position_ratio,{x:.5,y:.5})),o.set(x,S)}if(e){if(e.objects)for(let[x,A]of e.objects.entries())o.set(x,A);e.engine&&(r.runtime={...r.runtime,...e.engine.runtime},r.assets={...r.assets,...e.engine.assets},r.splash={...(g=r.splash)!=null?g:{},...(m=e.engine.splash)!=null?m:{}})}let s={objects:o,engine:r,scene:n,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=De(s,t))),i.length>0&&xt()&&Ce(i,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(o.keys()),engine:{runtime:Object.keys((h=r.runtime)!=null?h:{}),assets:Object.keys((f=r.assets)!=null?f:{}),splash:Object.keys((y=r.splash)!=null?y:{}),loading:Object.keys((b=r.loading)!=null?b:{}),start:Object.keys((v=r.start)!=null?v:{}),tutorial:Object.keys((w=r.tutorial)!=null?w:{}),endgame:Object.keys((E=r.endgame)!=null?E:{})},scene:n.scene_id||"unknown"}),s}function Tn(a){var t,i,n,r,o,s,l,c,p,d,u,g,m,h,f,y,b,v,w,E,x,A,S,P,I,L,T,j,O,D,R,$,C;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[_,M]of a.objects.entries()){let q=((t=M.identity)==null?void 0:t.id)||_;q.includes("character")&&(e.gameplay.character_pos=((i=M.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((n=M.transform)==null?void 0:n.scale)||1,e.gameplay.character_anim_speed=((o=(r=M.gameplay)==null?void 0:r.tuning)==null?void 0:o.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(s=M.gameplay)==null?void 0:s.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((p=(c=M.gameplay)==null?void 0:c.tuning)==null?void 0:p.relief_speed)||.22),(q.includes("gun")||q.includes("flame"))&&(e.gameplay.gun=M.gun||{},e.gameplay.gunmuzzle=((d=M.effects)==null?void 0:d.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=M.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=M.effects)==null?void 0:g.flame)||{}),q.includes("diamond")&&(e.gameplay.diamond=M),q.includes("ice")&&(e.gameplay.melt=M.melt||{},e.gameplay.melt_anchor=((m=M.transform)==null?void 0:m.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((h=M.transform)==null?void 0:h.position)||{x:0,y:0},e.gameplay.hybrid_melting=((f=M.effects)==null?void 0:f.hybrid_melting)||{},e.gameplay.physics_chunks=((y=M.effects)==null?void 0:y.physics_chunks)||{},e.gameplay.melting_particles=((b=M.effects)==null?void 0:b.melting_particles)||{},e.gameplay.hard_ice=M.hard_ice||{}),q.includes("water")&&(e.gameplay.water_drops=M),q.includes("crack")&&(e.gameplay.crack=M),q.includes("hand")&&(e.gameplay.hand=((v=M.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((w=M.transform)==null?void 0:w.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((E=M.transform)==null?void 0:E.scale)||1.5),q.includes("hazard")&&(e.gameplay.hazard=((x=M.gameplay)==null?void 0:x.tuning)||{},e.gameplay.danger_pos=((A=M.transform)==null?void 0:A.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((P=(S=M.gameplay)==null?void 0:S.tuning)==null?void 0:P.danger_pulse)||{},e.gameplay.hazard_height=((L=(I=M.gameplay)==null?void 0:I.tuning)==null?void 0:L.hazard_height)||140)}return e.gameplay.timeline=((T=a.engine.runtime)==null?void 0:T.timeline)||{},e.gameplay.drag_surface=((j=a.engine.runtime)==null?void 0:j.drag_surface)||{},e.gameplay.background=((O=a.engine.runtime)==null?void 0:O.background)||{},e.gameplay.ui_styles=((D=a.engine.runtime)==null?void 0:D.ui_styles)||{},e.gameplay.label_pulse=((R=a.engine.runtime)==null?void 0:R.label_pulse)||{},e.ui=(($=a.engine.runtime)==null?void 0:$.ui)||{},e.theme=((C=a.engine.runtime)==null?void 0:C.theme)||{},e.assets=a.engine.assets||{},e}var Tr,H,Sn,An,Ln=de(()=>{"use strict";K();Tr=null,H="dev";if(typeof window!="undefined"){let a=window.__BUILD_SETTINGS__;if(a!=null&&a.buildMode)Tr=a,H=a.buildMode,console.log("[CONFIG] Loaded inline build settings:",a,"buildMode:",H);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);Tr=t,H=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",H)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",H)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",H);Sn=new Map,An=H==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function kn(a,e){let t=[];function i(n,r,o=""){if(n!==r){if(typeof n!=typeof r){t.push(`${o}: type changed`);return}if(typeof n=="object"&&n!==null&&r!==null){let s=new Set([...Object.keys(n),...Object.keys(r)]);for(let l of s){let c=o?`${o}.${l}`:l;l in n?l in r?i(n[l],r[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${o}: changed`)}}return i(a,e),t}function Pn(a,e,t,i){let n={...t};for(let[r,o]of i.entries())n[r]&&o.defaults&&(n[r]={...o.defaults,...n[r]});return n}var At,$e,_n=de(()=>{"use strict";At=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},$e=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let i=`${e}?t=${Date.now()}&r=${Math.random()}`,n=await fetch(i,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(n.ok){let r=await n.text(),o=this.hashString(r),s=this.fileHashes.get(e);if(s&&s!==o&&console.log(`[HOT-RELOAD] File changed: ${e}`),s&&s!==o){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,o)}else s||this.fileHashes.set(e,o)}}catch(i){console.warn(`Failed to check ${e}:`,i)}}determineEventType(e){var t,i;return e.includes("/components/")?{type:"component",path:e,componentName:(t=e.split("/").pop())==null?void 0:t.replace(".schema.json","")}:e.includes("/engine/")?{type:"engine",path:e}:e.includes("/scenes/")?{type:"scene",path:e}:e.includes("/objects/")?{type:"object",path:e,objectId:(i=e.split("/").pop())==null?void 0:i.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let i=0;i<e.length;i++){let n=e.charCodeAt(i);t=(t<<5)-t+n,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}}});function On(a){if(typeof window=="undefined")return;let e=typeof Mn!="undefined"&&!!Mn.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let n=null,r=!1,o=null;if(t){o=new $e;let m=window.__configWatcher;m!=null&&m.stop&&m.stop(),window.__configWatcher=o}let s=new Set,l=m=>{var y,b;if(!o)return;let h=new Set;h.add("configs/engine/engine.runtime.json"),h.add("configs/engine/engine.assets.json"),h.add("configs/engine/engine.splash.json"),h.add("configs/scenes/scene.main.json");let f=(b=(y=m.scene)==null?void 0:y.objects)!=null?b:[];for(let v of f)v!=null&&v.object_config&&h.add(`configs/objects/${v.object_config}.json`);for(let v of s)h.has(v)||o.unwatch(v);for(let v of h)s.has(v)||o.watch(v,w=>g(w));s=h},c=new Set,p=!1,d=async m=>{let h=await Te(m),f=De(h,a.activeConfig.schemas),y=Je(f,a.activeConfig.schemas);y.valid||console.warn(`[HOT-RELOAD] ${m} validation errors:`,y.errors),await a.liveEditBridge.applyObjectConfig(m,f)};async function u(m){if(!r){r=!0;try{if(p||c.size===0){a.audioSystem.destroy();let h=await be("scene.main");a.setActiveConfig(h),a.gameObjectManager.updateConfig(h),a.CustomAssets.updateConfig(h),await a.CustomAssets.ready();let f=a.createAudioSystem(h);a.setAudioSystem(f),window.__audioSystem=f,await f.start(),a.liveEditBridge.rebuildIndexes(),l(h),console.log(`[GAME] Hot-reload complete (${m})`)}else{let h=Array.from(c);c.clear();for(let f of h)await d(f);console.log(`[GAME] Hot-reload updated objects: ${h.join(", ")}`)}}catch(h){console.warn("[GAME] Hot-reload failed:",h)}finally{r=!1,p=!1,c.clear()}}}function g(m){m.type==="object"&&m.objectId?c.add(m.objectId):p=!0,n&&window.clearTimeout(n),n=window.setTimeout(()=>{u(m.type)},120)}e&&Mn.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(a.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${s.size} files)`))}var Mn,kr=de(()=>{"use strict";_n();Ln();Mn={}});var Pr={};ht(Pr,{ConfigWatcher:()=>$e,DefaultReloadStrategy:()=>At,applyDefaults:()=>De,diffConfigs:()=>kn,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>Cn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Pn,setupHotReload:()=>On,toLegacyFormat:()=>Tn,validateObjectConfig:()=>Je});var pi=de(()=>{"use strict";Ln();_n();kr()});var ho={};ht(ho,{AssetEditorModal:()=>pa});var pa,ua=de(()=>{"use strict";pa=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,i,n){this.currentObjectId=e,this.currentPath=t,this.currentAsset=i,this.onApplyCallback=n,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let i=document.createElement("div");i.className="asset-editor-modal",i.innerHTML=`
1
+ "use strict";var Ho=Object.create;var Ut=Object.defineProperty;var No=Object.getOwnPropertyDescriptor;var Fo=Object.getOwnPropertyNames;var Bo=Object.getPrototypeOf,Uo=Object.prototype.hasOwnProperty;var de=(a,e)=>()=>(a&&(e=a(a=0)),e);var ht=(a,e)=>{for(var t in e)Ut(a,t,{get:e[t],enumerable:!0})},Ma=(a,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Fo(e))!Uo.call(a,n)&&n!==t&&Ut(a,n,{get:()=>e[n],enumerable:!(i=No(e,n))||i.enumerable});return a};var qe=(a,e,t)=>(t=a!=null?Ho(Bo(a)):{},Ma(e||!a||!a.__esModule?Ut(t,"default",{value:a,enumerable:!0}):t,a)),Go=a=>Ma(Ut({},"__esModule",{value:!0}),a);var pe,un=de(()=>{"use strict";pe=class{static get(e){var t;return(t=this.store.get(e))==null?void 0:t.data}static set(e,t){this.store.set(e,{data:t})}static has(e){return this.store.has(e)}static clear(){this.store.clear()}};pe.store=new Map});function Zo(){var a,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(a=document.querySelector("script"))==null?void 0:a.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),i=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(t&&!i)}catch{return!1}}async function Qo(){try{if(typeof window!="undefined"){let a=await fetch("./build-settings.json");if(a.ok){let e=await a.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function es(){try{if(typeof window!="undefined"){let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function ts(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${N}`),Object.keys(ue).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(ue)),ue;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),ue={...window.INLINE_ASSETS},ue;if(!(N==="publish"&&oe!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ue;if(!gn){let e=typeof window!="undefined"?new URL("inline-assets.js",window.location.href).href:"./inline-assets.js";console.log("[AssetLoader] Loading inline assets from:",e),gn=(async()=>{try{try{let r=await import(e+"?t="+Date.now());if(r.INLINE_ASSETS)return console.log("[AssetLoader] Loaded INLINE_ASSETS via ES module:",Object.keys(r.INLINE_ASSETS)),r.INLINE_ASSETS}catch(r){console.warn("[AssetLoader] ES module import failed, trying text parse:",r)}let t=await fetch(e);if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);let i=await t.text();console.log("[AssetLoader] Received JS code, length:",i.length);let n=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(n)try{let r=n[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let o=new Function("return "+r)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(o)),o}catch(r){return console.warn("[AssetLoader] Failed to parse inline assets:",r),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ue=await gn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ue)),ue}function hn(a){return a===null||typeof a!="object"||(Object.freeze(a),Object.values(a).forEach(e=>hn(e))),a}function is(a=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=a,i.height=e;let n=i.getContext("2d");return n.fillStyle=`#${t.toString(16).padStart(6,"0")}`,n.fillRect(0,0,a,e),n.strokeStyle="#000",n.strokeRect(0,0,a,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",a/2,e/2),ge.Texture.from(i)}function fn(a,e){dr.set(a,e)}var ge,lr,cr,Ie,N,oe,Ee,ue,gn,dr,je,Wt=de(()=>{"use strict";ge=require("pixi.js");un();lr=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",cr=Zo(),Ie=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,N=cr?"publish":lr,oe=Ie==null?void 0:Ie.assetsInlined;Ie!=null&&Ie.buildMode&&(N=Ie.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${N}`));Ee=es();Ee!=null&&Ee.buildMode&&(N=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${N}`));(Ee==null?void 0:Ee.assetsInlined)!==void 0&&(oe=Ee.assetsInlined);Qo().then(a=>{a!=null&&a.buildMode&&a.buildMode!==N&&(N=a.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${N}`)),(a==null?void 0:a.assetsInlined)!==void 0&&(oe=a.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${lr}, Runtime: ${cr?"publish":"dev"}, Effective: ${N}`);ue={},gn=null;dr=new Map;je=class{static async load(e,t,i,n){let r=`${e}:${t.path}`,o=pe.get(r);if(o!==void 0)return o;console.log(`[AssetLoader] Loading asset: ${e}, type: ${t.type}, Effective mode: ${N}`),console.log(`[AssetLoader] Window defined: ${typeof window!="undefined"}, INLINE_ASSETS exists: ${!!(typeof window!="undefined"&&window.INLINE_ASSETS)}, keys: ${typeof window!="undefined"&&window.INLINE_ASSETS?Object.keys(window.INLINE_ASSETS).length:"N/A"}`);let s=await ts(),l=s[e];if(!l&&n&&(l=s[n],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${n}`)),!l&&t.path){let d=t.path.split("/");if(d.length>=2){let u=d[d.length-1].split(".")[0];s[u]&&(l=s[u],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${u}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),N==="publish"&&oe!==!1&&(console.log("[AssetLoader] \u26A0\uFE0F PUBLISH MODE DETECTED - inline assets are MANDATORY"),!l))throw new Error(`[AssetLoader] PUBLISH MODE: Inline asset required but NOT FOUND for object: ${e}, path: ${t.path}`);let p=dr.get(t.type);if(p)try{let d=await p(t.path,l,e,i);return pe.set(r,d),d}catch(d){return this.handleFailure(e,t.type,d)}try{let d;switch(t.type){case"image":d=await this.loadImage(t.path,l);break;case"json":d=await this.loadJSON(t.path,l),d=hn(d);break;default:throw new Error(`Unknown asset type: ${t.type}`)}return pe.set(r,d),d}catch(d){return this.handleFailure(e,t.type,d)}}static async loadImage(e,t){let i=N==="publish",n=i&&oe!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof t!="string"||!t.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof t}`);try{return await ge.Assets.load(t)}catch(r){throw console.error("[AssetLoader] Failed to load texture from data URI:",r),r}}if(t&&typeof t=="string"&&t.startsWith("data:"))try{return await ge.Assets.load(t)}catch(r){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",r),await ge.Assets.load(e)}return await ge.Assets.load(e)}static async loadJSON(e,t){let i=N==="publish",n=i&&oe!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}let r=await fetch(e);if(!r.ok)throw new Error(`JSON fetch failed: ${e}`);return r.json()}static handleFailure(e,t,i){if(N==="dev"){let r=t==="image"?is():hn({__placeholder:!0,type:t});return pe.set(e+":"+((i==null?void 0:i.path)||"missing"),r),r}throw i}};fn("image",async(a,e)=>{let t=N==="publish",i=t&&oe!==!1,n=N==="brand",r=t&&oe===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${a}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return ge.Assets.load(e)}let o=a;return(n||r)&&a&&!a.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=a,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${a}" as-is`)):(o=`assets/${a}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${a}" -> "${o}"`))),ge.Assets.load(e||o)});fn("json",async(a,e)=>{let t=N==="publish",i=t&&oe!==!1,n=N==="brand",r=t&&oe===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${a}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let o=a;if((n||r)&&a&&!a.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=a,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${a}" as-is`)):(o=`assets/${a}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${a}" -> "${o}"`))),e)return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e);let s=await fetch(o);if(!s.ok)throw new Error(`JSON fetch failed: ${a}`);return s.json()})});var ur={};ht(ur,{AssetTextures:()=>se,initAssetTextures:()=>yn});function yn(a,e){pr.init(a,e),typeof window!="undefined"&&(window.__AssetTextures=se)}var bn,pr,se,Ke=de(()=>{"use strict";Wt();bn=class{constructor(){this.textures=new Map;this.readyPromise=null;this.priorityReadyPromise=null;this.priorityReadyResolve=null;this.config=null;this.app=null;this.attempted=new Set;this.waiters=new Set}init(e,t){if(this.config===e&&this.app===t&&this.priorityReadyPromise){console.log("[AssetTextures] init called with same config/app; keeping existing state");return}this.textures.clear(),this.readyPromise=null,this.priorityReadyPromise=null,this.priorityReadyResolve=null,this.attempted.clear(),this.waiters.clear(),this.priorityReadyPromise=new Promise(i=>{this.priorityReadyResolve=i}),this.config=e,this.app=t,console.log("[AssetTextures] Initialized with config, cleared previous textures")}async ready(){if(this.readyPromise){await this.readyPromise;return}if(!this.config)throw new Error("[AssetTextures] Must call init() before ready() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before ready() - app is null");let e=this.config,t=this.app;return this.readyPromise=(async()=>{var o;console.log("[AssetTextures] Loading all assets...");let i=new Set(["background_loading_1"]),n=[],r=[];for(let[s,l]of e.objects.entries()){let c=(o=l.render)==null?void 0:o.asset;if(!c)continue;let p=async()=>{var d;try{let u=(d=l.identity)==null?void 0:d.id;console.log(`[AssetTextures] Loading ${c.type}: ${s} (${u})`);let h=await je.load(s,c,t,u);this.textures.set(s,h),console.log(`[AssetTextures] \u2713 Loaded: ${s}`)}catch(u){console.error(`[AssetTextures] \u2717 Failed to load: ${s}`,u)}finally{this.attempted.add(s);try{for(let u of Array.from(this.waiters))u()}catch{}}};i.has(s)?n.push(p()):r.push(p())}n.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(n),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(r),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,t={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let n=Array.from(new Set((e||[]).filter(s=>typeof s=="string"&&s))).filter(s=>{var l,c,p,d;try{let u=(p=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:p.call(c,s);return!!((d=u==null?void 0:u.render)!=null&&d.asset)}catch{return!1}});if(n.length===0)return;this.ready().catch(()=>{});let r=()=>n.every(s=>this.textures.has(s)||this.attempted.has(s));if(r())return;let o=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(s=>{let l=!1,c=()=>{l||r()&&(l=!0,this.waiters.delete(c),s())};this.waiters.add(c),c(),o>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:n}),s())},o)})}get(e){return this.textures.get(e)}set(e,t){this.textures.set(e,t),console.log(`[AssetTextures] Updated texture: ${e}`)}clear(){this.textures.clear(),this.readyPromise=null,console.log("[AssetTextures] Cleared all textures")}getAllIds(){return Array.from(this.textures.keys())}},pr=new bn,se=new Proxy(pr,{get(a,e){return e in a&&typeof a[e]=="function"?a[e].bind(a):a.get(e)},set(a,e,t){return a.set(e,t),!0}})});var Xe={};ht(Xe,{applyConfigOverride:()=>Ae,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,clearConfigOverrides:()=>te,clearConfigOverridesForObject:()=>Ar,configOverrideManager:()=>Cr,deepClone:()=>G,exportConfigsAsJSON:()=>ze,getConfigOverrides:()=>Y,getConfigStateSummary:()=>Et,getOverrideMode:()=>xt,removeConfigOverride:()=>ai,resetToApplied:()=>St,resetToOriginal:()=>oi,setOverrideMode:()=>En});function ii(){return typeof window=="undefined"?null:window.__editableConfig||null}function vr(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function br(a,e){var t,i;if(!a)return null;try{if(a instanceof Map)return(t=a.get(e))!=null?t:null;if(typeof a=="object")return(i=a[e])!=null?i:null}catch{}return null}function ks(a,e,t){if(a){if(a instanceof Map){a.set(e,t);return}typeof a=="object"&&(a[e]=t)}}function wr(a,e){for(let t of e)wt(a,t.path,t.value)}function xr(a){var s;if(typeof window=="undefined")return;let e=ii();if(!e)return;let t=vr(),i=(s=t?br(t.objects,a):null)!=null?s:br(e.objects,a);if(!i)return;let n=G(i),r=Y().filter(l=>l.objectId===a);try{wr(n,r)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",a,l);return}ks(e.objects,a,n);let o=window.applyEditableObjectConfig;if(typeof o=="function")try{o(a,n)}catch{}}function Ps(){var n;if(typeof window=="undefined")return;let a=ii();if(!(a!=null&&a.engine))return;let e=vr(),t=G(((n=e==null?void 0:e.engine)!=null?n:a.engine)||{}),i=Y().filter(r=>!r.objectId&&!r.sceneId);try{wr(t,i)}catch(r){console.error("[CONFIG] Failed to reapply engine overrides",r);return}try{let r=a.engine;for(let o of Object.keys(r))o in t||delete r[o];for(let[o,s]of Object.entries(t))r[o]=s}catch{a.engine=t}}function _s(){if(typeof window=="undefined")return"unknown";let a=window;return typeof a.__HANDLER_PROJECT_ID=="string"?a.__HANDLER_PROJECT_ID:"handler-default"}function Er(){return`handler_preview_config_overrides::${_s()}`}function Ms(){if(typeof window=="undefined")return[];try{let a=window.localStorage.getItem(Er());if(!a)return[];let e=JSON.parse(a);return Array.isArray(e)?e:[]}catch{return[]}}function ni(a){if(typeof window!="undefined")try{window.localStorage.setItem(Er(),JSON.stringify(a))}catch{}}function xt(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function En(a){if(typeof window!="undefined"){window.__enableConfigOverrides=a;try{window.localStorage.setItem(Sr,a?"true":"false")}catch{}}}function Ae(a,e={}){var u,h;let{objectId:t,path:i,value:n}=a,{silent:r=!1,persist:o=!0,emitEvent:s=!0}=e,l=ii();if(!l){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let c=t?(h=(u=l.objects)==null?void 0:u.get)==null?void 0:h.call(u,t):l.engine;if(!c){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:t,path:i,hasObjects:!!l.objects});return}r||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:i,value:n});let p;try{p=Is(c,i),wt(c,i,n)}catch(f){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:n},f);return}window.__configChanges=window.__configChanges||[];let d=window.__configChanges;if(d.push({objectId:t,path:i,oldValue:p,newValue:n,ts:Date.now()}),d.length>Os&&d.shift(),o){let f=Y(),g=f.findIndex(m=>m.objectId===t&&m.sceneId===a.sceneId&&m.path===i);g>=0?f[g].value=n:f.push(a),window.__configOverrides=f,ni(f),xt()||En(!0)}r||console.log("[CONFIG] Applied override:",a),s&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:a}))}function Ce(a,e={}){let t=e.emitEvent!==!1,i=[];for(let n of a)n!=null&&n.objectId&&typeof n.objectId=="string"&&i.push(n.objectId),Ae(n,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let n=Array.from(new Set(i));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:n,count:a.length}}))}}function te(){window.__configOverrides=[],window.__configChanges=[],ni([]),console.log("[CONFIG] Cleared all overrides")}function Ar(a){let e=Y().filter(i=>i.objectId!==a);window.__configOverrides=e,ni(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==a),xr(a),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:a}}))}function ai(a,e){let t=Y().filter(n=>n.objectId!==a||n.path!==e);window.__configOverrides=t,ni(t);let i=window.__configChanges||[];window.__configChanges=i.filter(n=>n.objectId!==a||n.path!==e),a?xr(a):Ps(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:a,path:e}}))}function Y(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Ms()),window.__configOverrides||[])}function wt(a,e,t){var o;let i=e.split("."),n=i.pop(),r=a;for(let s of i){if(r[s]!==void 0&&typeof r[s]!="object")throw new Error(`Invalid override path: ${e} (hit primitive at ${s})`);r[s]=(o=r[s])!=null?o:{},r=r[s]}r[n]=t}function Is(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function G(a){if(a===null||typeof a!="object")return a;if(a instanceof Date)return new Date(a.getTime());if(a instanceof Set)return new Set([...a].map(t=>G(t)));if(ArrayBuffer.isView(a))return a.slice();if(a instanceof Array)return a.map(t=>G(t));if(a instanceof Map){let t=new Map;return a.forEach((i,n)=>t.set(n,G(i))),t}let e={};for(let t in a)Object.prototype.hasOwnProperty.call(a,t)&&(e[t]=G(a[t]));return e}function ze(){let a=window.__editableConfigBaseline;if(!a){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return yr(e)}return yr(a)}function yr(a){let e={objects:{},scenes:{},engine:G(a.engine||{})},t=a.objects;if(t instanceof Map)t.forEach((r,o)=>{e.objects[o]=G(r)});else if(t&&typeof t=="object")for(let r in t)e.objects[r]=G(t[r]);let i=a.scenes;if(i instanceof Map)i.forEach((r,o)=>{e.scenes[o]=G(r)});else if(i&&typeof i=="object")for(let r in i)e.scenes[r]=G(i[r]);let n=Y();for(let r of n)r.objectId?(e.objects[r.objectId]||(e.objects[r.objectId]={}),wt(e.objects[r.objectId],r.path,r.value)):r.sceneId?(e.scenes[r.sceneId]||(e.scenes[r.sceneId]={}),wt(e.scenes[r.sceneId],r.path,r.value)):wt(e.engine,r.path,r.value);return e}function Et(){let a=Y(),e=new Set;for(let t of a)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:a.length,hasChanges:a.length>0,overrides:a}}async function ri(a){let e=ze(),t={};for(let[n,r]of Object.entries(e.objects)){let o=r,s=n;/^(json\.|ui\.|effects\.|engine\.)/.test(s)||(s=`json.${n}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=s),t[`objects/${s}.json`]=o}e.engine&&(e.engine.runtime&&(t["engine/engine.runtime.json"]=e.engine.runtime),e.engine.assets&&(t["engine/engine.assets.json"]=e.engine.assets),e.engine.splash&&(t["engine/engine.splash.json"]=e.engine.splash),e.engine.loading&&(t["engine/engine.loading.json"]=e.engine.loading),e.engine.start&&(t["engine/engine.start.json"]=e.engine.start),e.engine.tutorial&&(t["engine/engine.tutorial.json"]=e.engine.tutorial),e.engine.endgame&&(t["engine/engine.endgame.json"]=e.engine.endgame),!e.engine.runtime&&!e.engine.assets&&(t["engine/engine.json"]=e.engine));for(let[n,r]of Object.entries(e.scenes)){let o=n.startsWith("scene.")?n:`scene.${n}`;t[`scenes/${o}.json`]=r}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Y().length>0,versionName:a})});if(!i.ok){let n=await i.json();throw new Error(`Apply failed: ${n.error||"Unknown error"}`)}te();try{let n=ii();n&&(window.__editableConfigBaseline=G(n))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function St(){te(),window.location.reload()}async function oi(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let e=await fetch("/api/reset-to-original",{method:"POST"});if(!e.ok){let t=await e.json();throw new Error(`Reset failed: ${t.error||"Unknown error"}`)}te(),window.location.reload()}var Sr,Os,Cr,K=de(()=>{"use strict";Sr="handler_preview_override_mode";if(typeof window!="undefined"){let a=window.localStorage.getItem(Sr);window.__enableConfigOverrides=a===null?!0:a==="true"}Os=500;Cr={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[]}}});function js(a,e){try{if(typeof a=="object"&&a!==null)return a;if(typeof a!="string")return null;if(a.startsWith("data:")){let i=a.indexOf(",");if(i===-1)return null;let n=a.slice(0,i);if(!n.includes("application/json")&&!n.includes("text/plain"))return null;let r=a.slice(i+1),o=n.includes("base64")?typeof atob=="function"?atob(r):r:decodeURIComponent(r);return JSON.parse(o)}let t=a.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(a):null}catch{return null}}function Rs(a){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=a.replace(/^\.\/+/,""),i=t.split("/").pop()||t,n=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let r of n){let o=e[r];if(o){let s=js(o,r);if(s!==null)return s}}return null}async function At(a){if(Sn.has(a)&&!An)return console.log(`[CONFIG] Using cached config for: "${a}"`),Sn.get(a);if(console.log(`[CONFIG] loadConfigFile called with: "${a}", MODE: ${H.toUpperCase()}, CACHE: ${An?"DISABLED":"ENABLED"}`),H==="publish"){let i=Rs(a);return i?(console.log(`[CONFIG] \u2713 Loaded ${a} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${a} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}H==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${a}"`);let e;H==="brand"?e=[`./${a.split("/").pop()||a}`,`./${a}`,`./${a.replace(/^configs\//,"")}`,`./${a.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${a}`,`./${a.replace(/^configs\//,"")}`,`./${a.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(i=>i.startsWith("./")?[i,`/${i.slice(2)}`]:i.startsWith("/")?[i]:[i,`/${i}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let i=An?"no-store":"force-cache";for(let n of e)try{let r=await fetch(n,{cache:i});if(!r.ok)continue;let o=await r.json();return console.log(`[CONFIG] \u2713 Loaded ${a} via ${n}`,o),o}catch(r){console.warn(`[CONFIG] \u2717 Failed to load ${n} (mode: ${H}):`,r)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${a}; using defaults`),{}})();return Sn.set(a,t),t}async function si(){console.log("[CONFIG] Loading component schemas...");let a=["components/identity.schema.json","components/transform.schema.json","components/render.schema.json","components/motion.schema.json","components/effects.schema.json","components/interaction.schema.json","components/gameplay.rules.schema.json","components/gameplay.tuning.schema.json","components/visibility.schema.json","components/audio.schema.json","components/physics.schema.json","components/ui.schema.json"],e=new Map;for(let t of a)try{let i=H==="publish"||H==="brand"?t.split("/").pop()||t:`configs/${t}`,n=await At(i);n.component&&(e.set(n.component,n),console.log(`[CONFIG] \u2713 Schema loaded: ${n.component} ${H==="publish"||H==="brand"?"(flattened)":"(nested)"}`))}catch(i){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,i)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function Te(a){console.log(`[CONFIG] Loading object config: ${a}`);let e=H==="publish"||H==="brand"?`${a}.json`:`configs/objects/${a}.json`;return await At(e)}async function li(a){let e=new Map;if(a.objects&&Array.isArray(a.objects)){for(let t of a.objects)if(t.enabled&&t.object_config)try{let i=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(i)||(i=`json.${i}`);let n=await Te(i);(!n||Object.keys(n).length===0)&&i!==t.instance_id&&(n=await Te(t.instance_id)),!n||Object.keys(n).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),n=await Te(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...n,instance_id:t.instance_id,object_config:t.object_config})}catch(i){console.warn(`Failed to load object ${t.object_config}:`,i)}}return e}async function ci(){console.log("[CONFIG] Loading engine configs...");let a=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(a.map(i=>{let n=`engine.${i}.json`,r=H==="publish"||H==="brand"?n:`configs/engine/${n}`;return At(r)})),t=Object.fromEntries(a.map((i,n)=>[i,e[n]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(a.map(i=>{var o;let n=(o=t[i])!=null?o:{},r=Object.keys(n);return[i,r.length>0?r:"empty"]}))),t}async function Cn(){return await At(H==="publish"||H==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function di(a="scene.main"){console.log(`[CONFIG] Loading scene config: ${a}`);let e=H==="publish"||H==="brand"?`${a}.json`:`configs/scenes/${a}.json`;return await At(e)}function Je(a,e){let t=[];if(!a.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let i=e.get("identity");if(i)for(let n of i.required||[])a.identity[n]||t.push(`Missing required identity field: ${n}`);for(let[n,r]of Object.entries(a)){if(n==="identity")continue;let o=e.get(n);if(o&&r&&typeof r=="object"){let s=r;for(let l of o.required||[])s[l]===void 0&&t.push(`Missing required field in ${n}: ${l}`);if(o.constraints&&typeof o.constraints=="object")for(let[l,c]of Object.entries(o.constraints)){let p=s[l];if(p!==void 0&&c&&typeof c=="object"){let d=c;typeof p=="number"&&(d.min!==void 0&&p<d.min&&t.push(`${n}.${l} value ${p} is below minimum ${d.min}`),d.max!==void 0&&p>d.max&&t.push(`${n}.${l} value ${p} is above maximum ${d.max}`))}}}}return{valid:t.length===0,errors:t}}function De(a,e){let t={...a},i=["identity","transform","render"];for(let[n,r]of e.entries())r.defaults&&Object.keys(r.defaults).length>0&&(i.includes(n)||t[n])&&(t[n]||(t[n]={}),t[n]={...r.defaults,...t[n]});return t}function Q(a,e,t,i){return typeof a!="number"||!Number.isFinite(a)?e:Math.min(Math.max(a,t),i)}function Lr(a,e){if(Array.isArray(a))return{x:Q(a[0],e.x,-2e3,2e3),y:Q(a[1],e.y,-2e3,2e3)};if(!a||typeof a!="object")return e;let{x:t,y:i}=a;return{x:Q(t,e.x,-2e3,2e3),y:Q(i,e.y,-2e3,2e3)}}function zs(a,e){if(Array.isArray(a))return{x:Q(a[0],e.x,0,1),y:Q(a[1],e.y,0,1)};if(!a||typeof a!="object")return e;let{x:t,y:i}=a;return{x:Q(t,e.x,0,1),y:Q(i,e.y,0,1)}}function Ds(a){if(Array.isArray(a))return{x:Q(a[0],.5,-10,10),y:Q(a[1],.5,-10,10)};if(a&&typeof a=="object"){let{x:e,y:t}=a;return{x:Q(e,.5,-10,10),y:Q(t,.5,-10,10)}}return typeof a=="string"?a:null}async function be(a="scene.main",e){var l,c,p,d,u,h,f,g,m,y,b,v,w,E;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await si(),i=Y();i.length>0&&console.log(`[CONFIG] Applying ${i.length} active overrides`);let n=await di(a);console.log(`[CONFIG] Scene config loaded: ${((l=n.objects)==null?void 0:l.length)||0} objects`);let r=await ci();console.log("[CONFIG] Loading object configs...");let o=await li(n);console.log(`[CONFIG] Loaded ${o.size} object configs:`,Array.from(o.keys()));for(let[x,A]of o.entries()){let S=De(A,t),P=Je(S,t);P.valid||console.warn(`Object ${x} validation errors:`,P.errors),(c=S.transform)!=null&&c.position&&(S.transform.position=Lr(S.transform.position,{x:0,y:0})),(p=S.transform)!=null&&p.offset&&(S.transform.offset=Lr(S.transform.offset,{x:0,y:0})),((d=S.transform)==null?void 0:d.anchor)!==void 0&&(S.transform.anchor=Ds(S.transform.anchor)),((u=S.transform)==null?void 0:u.position_ratio)!==void 0&&S.transform.position_ratio!==null&&(S.transform.position_ratio=zs(S.transform.position_ratio,{x:.5,y:.5})),o.set(x,S)}if(e){if(e.objects)for(let[x,A]of e.objects.entries())o.set(x,A);e.engine&&(r.runtime={...r.runtime,...e.engine.runtime},r.assets={...r.assets,...e.engine.assets},r.splash={...(h=r.splash)!=null?h:{},...(f=e.engine.splash)!=null?f:{}})}let s={objects:o,engine:r,scene:n,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=De(s,t))),i.length>0&&xt()&&Ce(i,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(o.keys()),engine:{runtime:Object.keys((g=r.runtime)!=null?g:{}),assets:Object.keys((m=r.assets)!=null?m:{}),splash:Object.keys((y=r.splash)!=null?y:{}),loading:Object.keys((b=r.loading)!=null?b:{}),start:Object.keys((v=r.start)!=null?v:{}),tutorial:Object.keys((w=r.tutorial)!=null?w:{}),endgame:Object.keys((E=r.endgame)!=null?E:{})},scene:n.scene_id||"unknown"}),s}function Tn(a){var t,i,n,r,o,s,l,c,p,d,u,h,f,g,m,y,b,v,w,E,x,A,S,P,I,L,T,j,O,D,R,$,C;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[_,M]of a.objects.entries()){let q=((t=M.identity)==null?void 0:t.id)||_;q.includes("character")&&(e.gameplay.character_pos=((i=M.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((n=M.transform)==null?void 0:n.scale)||1,e.gameplay.character_anim_speed=((o=(r=M.gameplay)==null?void 0:r.tuning)==null?void 0:o.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(s=M.gameplay)==null?void 0:s.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((p=(c=M.gameplay)==null?void 0:c.tuning)==null?void 0:p.relief_speed)||.22),(q.includes("gun")||q.includes("flame"))&&(e.gameplay.gun=M.gun||{},e.gameplay.gunmuzzle=((d=M.effects)==null?void 0:d.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=M.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((h=M.effects)==null?void 0:h.flame)||{}),q.includes("diamond")&&(e.gameplay.diamond=M),q.includes("ice")&&(e.gameplay.melt=M.melt||{},e.gameplay.melt_anchor=((f=M.transform)==null?void 0:f.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((g=M.transform)==null?void 0:g.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=M.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((y=M.effects)==null?void 0:y.physics_chunks)||{},e.gameplay.melting_particles=((b=M.effects)==null?void 0:b.melting_particles)||{},e.gameplay.hard_ice=M.hard_ice||{}),q.includes("water")&&(e.gameplay.water_drops=M),q.includes("crack")&&(e.gameplay.crack=M),q.includes("hand")&&(e.gameplay.hand=((v=M.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((w=M.transform)==null?void 0:w.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((E=M.transform)==null?void 0:E.scale)||1.5),q.includes("hazard")&&(e.gameplay.hazard=((x=M.gameplay)==null?void 0:x.tuning)||{},e.gameplay.danger_pos=((A=M.transform)==null?void 0:A.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((P=(S=M.gameplay)==null?void 0:S.tuning)==null?void 0:P.danger_pulse)||{},e.gameplay.hazard_height=((L=(I=M.gameplay)==null?void 0:I.tuning)==null?void 0:L.hazard_height)||140)}return e.gameplay.timeline=((T=a.engine.runtime)==null?void 0:T.timeline)||{},e.gameplay.drag_surface=((j=a.engine.runtime)==null?void 0:j.drag_surface)||{},e.gameplay.background=((O=a.engine.runtime)==null?void 0:O.background)||{},e.gameplay.ui_styles=((D=a.engine.runtime)==null?void 0:D.ui_styles)||{},e.gameplay.label_pulse=((R=a.engine.runtime)==null?void 0:R.label_pulse)||{},e.ui=(($=a.engine.runtime)==null?void 0:$.ui)||{},e.theme=((C=a.engine.runtime)==null?void 0:C.theme)||{},e.assets=a.engine.assets||{},e}var Tr,H,Sn,An,Ln=de(()=>{"use strict";K();Tr=null,H="dev";if(typeof window!="undefined"){let a=window.__BUILD_SETTINGS__;if(a!=null&&a.buildMode)Tr=a,H=a.buildMode,console.log("[CONFIG] Loaded inline build settings:",a,"buildMode:",H);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);Tr=t,H=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",H)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",H)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",H);Sn=new Map,An=H==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function kn(a,e){let t=[];function i(n,r,o=""){if(n!==r){if(typeof n!=typeof r){t.push(`${o}: type changed`);return}if(typeof n=="object"&&n!==null&&r!==null){let s=new Set([...Object.keys(n),...Object.keys(r)]);for(let l of s){let c=o?`${o}.${l}`:l;l in n?l in r?i(n[l],r[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${o}: changed`)}}return i(a,e),t}function Pn(a,e,t,i){let n={...t};for(let[r,o]of i.entries())n[r]&&o.defaults&&(n[r]={...o.defaults,...n[r]});return n}var Ct,$e,_n=de(()=>{"use strict";Ct=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},$e=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let i=`${e}?t=${Date.now()}&r=${Math.random()}`,n=await fetch(i,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(n.ok){let r=await n.text(),o=this.hashString(r),s=this.fileHashes.get(e);if(s&&s!==o&&console.log(`[HOT-RELOAD] File changed: ${e}`),s&&s!==o){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,o)}else s||this.fileHashes.set(e,o)}}catch(i){console.warn(`Failed to check ${e}:`,i)}}determineEventType(e){var t,i;return e.includes("/components/")?{type:"component",path:e,componentName:(t=e.split("/").pop())==null?void 0:t.replace(".schema.json","")}:e.includes("/engine/")?{type:"engine",path:e}:e.includes("/scenes/")?{type:"scene",path:e}:e.includes("/objects/")?{type:"object",path:e,objectId:(i=e.split("/").pop())==null?void 0:i.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let i=0;i<e.length;i++){let n=e.charCodeAt(i);t=(t<<5)-t+n,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}}});function On(a){if(typeof window=="undefined")return;let e=typeof Mn!="undefined"&&!!Mn.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let n=null,r=!1,o=null;if(t){o=new $e;let f=window.__configWatcher;f!=null&&f.stop&&f.stop(),window.__configWatcher=o}let s=new Set,l=f=>{var y,b;if(!o)return;let g=new Set;g.add("configs/engine/engine.runtime.json"),g.add("configs/engine/engine.assets.json"),g.add("configs/engine/engine.splash.json"),g.add("configs/scenes/scene.main.json");let m=(b=(y=f.scene)==null?void 0:y.objects)!=null?b:[];for(let v of m)v!=null&&v.object_config&&g.add(`configs/objects/${v.object_config}.json`);for(let v of s)g.has(v)||o.unwatch(v);for(let v of g)s.has(v)||o.watch(v,w=>h(w));s=g},c=new Set,p=!1,d=async f=>{let g=await Te(f),m=De(g,a.activeConfig.schemas),y=Je(m,a.activeConfig.schemas);y.valid||console.warn(`[HOT-RELOAD] ${f} validation errors:`,y.errors),await a.liveEditBridge.applyObjectConfig(f,m)};async function u(f){if(!r){r=!0;try{if(p||c.size===0){a.audioSystem.destroy();let g=await be("scene.main");a.setActiveConfig(g),a.gameObjectManager.updateConfig(g),a.CustomAssets.updateConfig(g),await a.CustomAssets.ready();let m=a.createAudioSystem(g);a.setAudioSystem(m),window.__audioSystem=m,await m.start(),a.liveEditBridge.rebuildIndexes(),l(g),console.log(`[GAME] Hot-reload complete (${f})`)}else{let g=Array.from(c);c.clear();for(let m of g)await d(m);console.log(`[GAME] Hot-reload updated objects: ${g.join(", ")}`)}}catch(g){console.warn("[GAME] Hot-reload failed:",g)}finally{r=!1,p=!1,c.clear()}}}function h(f){f.type==="object"&&f.objectId?c.add(f.objectId):p=!0,n&&window.clearTimeout(n),n=window.setTimeout(()=>{u(f.type)},120)}e&&Mn.hot.on("config-change",()=>{h({type:"hmr"})}),t&&(l(a.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${s.size} files)`))}var Mn,kr=de(()=>{"use strict";_n();Ln();Mn={}});var Pr={};ht(Pr,{ConfigWatcher:()=>$e,DefaultReloadStrategy:()=>Ct,applyDefaults:()=>De,diffConfigs:()=>kn,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>Cn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Pn,setupHotReload:()=>On,toLegacyFormat:()=>Tn,validateObjectConfig:()=>Je});var pi=de(()=>{"use strict";Ln();_n();kr()});var ho={};ht(ho,{AssetEditorModal:()=>pa});var pa,ua=de(()=>{"use strict";pa=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,i,n){this.currentObjectId=e,this.currentPath=t,this.currentAsset=i,this.onApplyCallback=n,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let i=document.createElement("div");i.className="asset-editor-modal",i.innerHTML=`
2
2
  <div class="asset-editor-card">
3
3
  <div class="asset-editor-header">
4
4
  <div>
@@ -43,7 +43,7 @@
43
43
  <button class="debug-btn primary" data-modal-apply>Apply</button>
44
44
  </div>
45
45
  </div>
46
- `,this.modal=i}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(o=>{o.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(o=>{o.addEventListener("click",s=>{let c=s.target.dataset.tab;c&&this.switchTab(c)})});let i=this.modal.querySelector("[data-ai-generate]");i==null||i.addEventListener("click",()=>{this.openAiEditor("generate")});let n=this.modal.querySelector("[data-ai-edit]");n==null||n.addEventListener("click",()=>{this.openAiEditor("edit")});let r=this.modal.querySelector("[data-modal-apply]");r==null||r.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",o=>{o.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let t=window.__openAiEditor;if(typeof t!="function"){alert("AI Editor not available. Please check your setup.");return}let i="";e==="edit"&&this.currentAsset?i=`Edit this image: ${this.currentObjectId}`:i=`Create an image for: ${this.currentObjectId}`,t(this.currentObjectId||"unknown",i,this.currentAsset,{path:this.currentPath,onApply:n=>{this.onApplyCallback&&this.onApplyCallback(n),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var wl={};ht(wl,{COLORS:()=>ce,ConfigWatcher:()=>$e,DebugPanel:()=>Ot,DefaultReloadStrategy:()=>At,Handler:()=>ie,PlayableLoadingScreen:()=>Wi,PreviewShell:()=>Gi,STROKE_WIDTH:()=>Eo,THEME:()=>So,applyConfigOverride:()=>Ae,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,applyDefaults:()=>De,baseLottie:()=>cn,bootstrap:()=>cl,clearConfigOverrides:()=>se,clearConfigOverridesForObject:()=>Ar,configOverrideManager:()=>Cr,createPreviewShell:()=>fa,deepClone:()=>G,default:()=>Oe,defaultPreset:()=>ui,deviceGroups:()=>Rn,devicePresets:()=>jn,diffConfigs:()=>kn,exportConfigsAsJSON:()=>ze,getConfigOverrides:()=>Y,getConfigStateSummary:()=>ai,getOverrideMode:()=>xt,getPresetById:()=>He,getPresetsByCategory:()=>$s,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>Cn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Pn,removeConfigOverride:()=>ni,resetToApplied:()=>Et,resetToOriginal:()=>oi,setBootstrapDependencies:()=>sl,setOverrideMode:()=>En,setupHotReload:()=>On,setupLiveEditBridge:()=>qi,toLegacyFormat:()=>Tn,validateObjectConfig:()=>Je});module.exports=Go(wl);var xe={};function Ut(a,e,t=!1){xe[a]||(xe[a]=[]),xe[a].push({fn:e,once:t})}function rn(a,e){if(xe[a]){if(!e){delete xe[a];return}xe[a]=xe[a].filter(t=>t.fn!==e)}}function Gt(a,...e){let t=xe[a];if(t)for(let i of[...t])i.fn(...e),i.once&&rn(a,i.fn)}function X(a,e){Ut(a,e,!0)}var B=null,ee=[],Ve=null;function ja(a){B=a,ee=[],Ve!==null&&(clearTimeout(Ve),Ve=null)}function Ra(){var a,e,t;return{endpoint:(B==null?void 0:B.endpoint)||"",transport:(B==null?void 0:B.transport)||"beacon",batchSize:(a=B==null?void 0:B.batchSize)!=null?a:10,flushIntervalMs:(e=B==null?void 0:B.flushIntervalMs)!=null?e:300,maxQueue:(t=B==null?void 0:B.maxQueue)!=null?t:200,debug:!!(B!=null&&B.debug)}}async function Oa(a,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(a,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function on(a,e){let t=Ra();if(e&&t.endpoint){if(ee.push(a),ee.length>t.maxQueue&&(ee=ee.slice(ee.length-t.maxQueue)),ee.length>=t.batchSize){Ia();return}Ve===null&&(Ve=window.setTimeout(()=>{Ve=null,Ia()},t.flushIntervalMs))}}async function Ia(){let a=Ra();if(!a.endpoint||ee.length===0)return;let e=ee.splice(0,a.batchSize);await Oa(a.endpoint,{events:e},a.transport,a.debug),ee.length>0&&await Oa(a.endpoint,{events:ee.splice(0,a.batchSize)},a.transport,a.debug)}function za(a){return Math.max(0,Math.min(1,a))}function qo(a){let e=String(a!=null?a:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function ft(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Vo(a,e){let t=a==null?void 0:a[e];return typeof t=="number"?t:0}function Da(a,e,t){try{a[e]=t}catch{}}function Wo(a){let e=a==null?void 0:a.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function $a(a,e){let t=a==null?void 0:a.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Ha(a,e){let t=Wo(a);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function Na(){let a=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),a.size>0&&i()})},n=p=>{var u;a.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},r=p=>{a.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},o=p=>{p.killed||(p.killed=!0,r(p))},s=()=>{var d,u;let p=ft();for(let g of Array.from(a)){if(g.killed||g.paused)continue;let m=p-g.startMs-g.delayMs;if(m<0)continue;let h=g.durationMs>0?m/g.durationMs:1,f=za(h),y=g.repeat>=0?g.repeat+1:1,b=g.repeat>0?Math.min(Math.floor(h),y-1):0;if(g.repeat>0&&h>=1){let E=h-b;f=za(E)}let v=g.ease(f);g.yoyo&&b%2===1&&(v=1-v);for(let E of g.props)Da(g.target,E.key,E.from+(E.to-E.from)*v);g.scaleFrom&&g.scaleTo&&$a(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(d=g.onUpdate)==null||d.call(g)}catch{}if(h>=y){o(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(p,d,u)=>{var E;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),m=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((E=u==null?void 0:u.delayMsOverride)!=null?E:0)),h=qo(d.ease),f=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,y=d.yoyo===!0,b=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let x of Object.keys(d)){if(b.has(x))continue;let A=d[x];typeof A=="number"&&v.push({key:x,from:Vo(p,x),to:A})}let w=Ha(p,d);return{target:p,startMs:ft(),delayMs:m,durationMs:g,ease:h,props:v,scaleFrom:w.from,scaleTo:w.to,repeat:f,yoyo:y,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return n(u),{kill:()=>o(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ft())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:ft(),m=ft()-g;u.startMs+=m,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let g of Object.keys(d)){let m=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof m=="number"&&Da(p,g,m)}let u=Ha(p,d);u.to&&$a(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))o(u)},timeline(p={}){let d=[],u=0,g=!1,m=[],h=b=>{if(typeof b=="number")return Math.max(0,b*1e3);let v=typeof b=="string"?b.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},f=b=>{d.push(b);let v=Math.max(0,(typeof b.vars.duration=="number"?b.vars.duration:.5)*1e3);u=Math.max(u,b.atMs+v)},y={to(b,v,w){return f({kind:"to",target:b,vars:v,atMs:h(w)}),y},fromTo(b,v,w,E){return f({kind:"fromTo",target:b,vars:w,from:v,atMs:h(E)}),y},play(){var b,v;if(g)return y;g=!0,m=[];for(let w of d)w.kind==="fromTo"&&c.set(w.target,(b=w.from)!=null?b:{}),m.push(c.to(w.target,{...w.vars,delay:w.atMs/1e3+((v=w.vars.delay)!=null?v:0)}));return y},pause(){for(let b of m)b.pause();return y},kill(){for(let b of m)b.kill();m=[],g=!1}};return p.paused||y.play(),y}};return c}function Fa(){if(typeof window=="undefined")return;let a=window;if(!a.gsap)try{a.gsap=Na()}catch{}}var Ba={name:"handler-playable-sdk",version:"0.5.2",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 J=0,Ko=J++,Ua=J++,Ga=J++,qa=J++,Va=J++,Wa=J++,Ya=J++,Ka=J++,Xa=J++,Ja=J++,Za=J++,Qa=J++,F=Ko;function er(){return F===Ua}function tr(){return F===Ga}function ir(){return F===qa}function nr(){return F===Va}function We(){return F===Wa}function Ye(){return F===Ya}function ar(){return F===Ka}function rr(){return F===Xa}function or(){return F===Ja}function sn(){return F===Za}function ln(){return F===Qa}function sr(){let a=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(a==="mraid")try{mraid.getState(),F=Ua;return}catch{}else if(a==="dapi")try{dapi.isReady(),F=Ga;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(F=qa)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(F=Va)}catch{}else if(e==="mintegral")window.gameReady&&(F=Wa);else if(e==="tapjoy")window.TJ_API&&(F=Ya);else if(e==="tiktok")window.openAppStore&&(F=Ka);else if(e==="smadex")try{window.smxTracking&&(F=Xa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(F=Ja)}catch{}else e==="vungle"?F=Za:(a==="nucleo"||e==="nucleo")&&(F=Qa)}var qt=qe(require("lottie-web"),1),cn=qt.default;typeof window!="undefined"&&(window.lottie=qt.default,window.__baseLottie=qt.default);var Xo=require("pixi.js");var dn=require("pixi.js");var Jo=null;function pn(a){Jo=a}Vt();un();var mt=require("pixi.js");Vt();var ns=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",mn=ns;if(typeof window!="undefined")try{let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);e!=null&&e.buildMode&&(mn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${mn}`))}}catch{}function as(a){var t,i,n,r,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(a);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(a))return{x:(t=a[0])!=null?t:.5,y:(i=a[1])!=null?i:.5};if(a&&typeof a=="object"&&"x"in a&&"y"in a)return{x:(n=a.x)!=null?n:.5,y:(r=a.y)!=null?r:.5};if(typeof a=="string"){let s=a.trim().toLowerCase();return(o=e[s])!=null?o:{x:.5,y:.5}}return null}var Se=class{static async create(e,t,i){var l,c,p,d,u,g,m;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${mn}`);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 mt.Container;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let r=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${n.type}, path: ${n.path}`);let o=await je.load(e,n,i,r);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=o==null?void 0:o.constructor)==null?void 0:p.name}`);let s;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",o,"for object:",e),s=new mt.Sprite(o),console.log("[ObjectFactory] Created object:",s,"type:",(d=s==null?void 0:s.constructor)==null?void 0:d.name),this.applyTransform(s,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=o==null?void 0:o.constructor)==null?void 0:u.name,o),o&&(((g=o.constructor)==null?void 0:g.name)==="Container"||o instanceof mt.Container)){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 y of h)try{let b=await fetch(y);if(b.ok){s=await b.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",y,"type:",(m=s==null?void 0:s.constructor)==null?void 0:m.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),s=o)}else s=o;else s=o,s&&typeof s=="object"&&("x"in s||"position"in s)&&this.applyTransform(s,t==null?void 0:t.transform,t);return s}static applyTransform(e,t,i){var n,r,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((o=t.position.x)!=null?o:0,(s=t.position.y)!=null?s: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=as(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var bt=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}};var ss=qe(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=ss);Ke();var Wt=require("pixi.js");Ke();var vn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new bt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async r=>{var s;let o=this.registry.get(r);if(!o){console.warn("[Assets] No config found for object:",r);return}try{let l=await Se.create(r,o,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(s=l==null?void 0:l.constructor)==null?void 0:s.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Se.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},ls=new vn,cs=new Proxy(ls,{get(a,e){if(e in a&&typeof a[e]=="function")return a[e].bind(a);if(a.get(e))return a.get(e)}});Ke();var gr=require("pixi.js"),he={width:400,height:600,designWidth:400,scaleFactor:1},Kt={scale:1,position:1},xn=[];function ps(a,e,t,i,n,r,o){xn.push({element:a,originalScale:r,positionHelper:e,heightPercent:n}),e(a,t,i,n,r,o,!1)}function us(){xn.forEach(({element:a,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*he.scaleFactor;t(a,he.width,he.height,i,n,!0,!1)})}function wn(a,e){console.log(`[SCREEN] updateScreenState called: ${a}x${e}`),he.width=a,he.height=e,he.scaleFactor=Math.min(a/he.designWidth,1.15),Kt.scale=he.scaleFactor,Kt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Kt.scale.toFixed(3)}`),us()}var vt={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 gs(a,e,t){let i=vt[a];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${a}.${e} = ${t}`))}function hs(){return vt}var fs={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 Yt(a,e){return typeof a=="number"&&Number.isFinite(a)?a:e}function Xt(a,e={x:.5,y:.5}){var t;if(Array.isArray(a))return{x:Yt(a[0],e.x),y:Yt(a[1],e.y)};if(a&&typeof a=="object"){let i=a;return{x:Yt(i.x,e.x),y:Yt(i.y,e.y)}}if(typeof a=="string"){let i=a.trim().toLowerCase();return(t=fs[i])!=null?t:e}return e}function hr(a,e,t,i={}){var g,m,h,f,y,b;let n=Xt(t),r=(g=i.inset)!=null?g:{},o=(m=i.padding)!=null?m:{x:0,y:0},s=((h=r.left)!=null?h:0)+o.x,l=((f=r.right)!=null?f:0)+o.x,c=((y=r.top)!=null?y:0)+o.y,p=((b=r.bottom)!=null?b:0)+o.y,d=Math.max(0,a-s-l),u=Math.max(0,e-c-p);return{x:s+d*n.x,y:c+u*n.y}}function fr(a,e,t,i={}){var h,f,y,b,v,w;let n=(h=i.inset)!=null?h:{},r=(f=i.padding)!=null?f:{x:0,y:0},o=((y=n.left)!=null?y:0)+r.x,s=((b=n.right)!=null?b:0)+r.x,l=((v=n.top)!=null?v:0)+r.y,c=((w=n.bottom)!=null?w:0)+r.y,p=Math.max(0,a-o-s),d=Math.max(0,e-l-c),u=Xt(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:o+p*g,y:l+d*m}}if(typeof window!="undefined"){let a=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==a||n!==e)&&(a=i,e=n,wn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),wn(window.innerWidth,window.innerHeight),window.updateDebugConfig=gs,window.getDebugConfig=hs,window.copyConfig=Ts,window.applyConfig=yt,window.applyConfigForRatio=Ls,window.positionAtBottom=mr,window.positionAtTop=ys,window.positionAtCenter=vs,window.positionAtLeft=ws,window.positionAtRight=xs,window.positionAtBottomLeft=Es,window.positionAtBottomRight=Ss,window.positionAtTopLeft=As,window.positionAtTopRight=Cs,window.applyPositionContract=bs,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 Jt(a,e,t=0){return a*e+t}function Zt(a,e,t=0){return a*(1-e)+t}function Qt(a,e,t=0){return a*e+t}function ei(a,e,t=0){return a*(1-e)+t}function Z(a,e=0){return a/2+e}function ms(a,e){return a*e}function bs(a,e,t,i){var o,s,l,c,p,d,u,g,m,h,f,y,b,v,w,E,x,A,S,P;let n=0,r=0;switch(i.type){case"top":n=Z(e,(s=(o=i.offset)==null?void 0:o.x)!=null?s:0),r=Jt(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=Z(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),r=Zt(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=Qt(e,i.percent,(h=(m=i.offset)==null?void 0:m.x)!=null?h:0),r=Z(t,(y=(f=i.offset)==null?void 0:f.y)!=null?y:0);break;case"right":n=ei(e,i.percent,(v=(b=i.offset)==null?void 0:b.x)!=null?v:0),r=Z(t,(E=(w=i.offset)==null?void 0:w.y)!=null?E:0);break;case"center":n=Z(e,(A=(x=i.offset)==null?void 0:x.x)!=null?A:0),r=Z(t,(P=(S=i.offset)==null?void 0:S.y)!=null?P:0);break}a.position?a.position.set(n,r):(a.x=n,a.y=r),i.scale!==void 0&&i.scale!==1&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(i.scale,i.scale):(a.scale.x=i.scale,a.scale.y=i.scale))}function mr(a,e,t,i=.2,n=1,r=!0,o=!1){let s=ms(t,i),l=Zt(t,i/2);fe(a,Z(e),l);let c=r?n*he.scaleFactor:n;me(a,c),o&&!xn.find(p=>p.element===a)&&ps(a,mr,e,t,i,n,r)}function ys(a,e,t,i=.1,n=1){fe(a,Z(e),Jt(t,i)),me(a,n)}function vs(a,e,t,i=0,n=0,r=1){fe(a,Z(e,i),Z(t,n)),me(a,r)}function ws(a,e,t,i=.1,n=1){fe(a,Qt(e,i),Z(t)),me(a,n)}function xs(a,e,t,i=.1,n=1){fe(a,ei(e,i),Z(t)),me(a,n)}function Es(a,e,t,i=.05,n=.05,r=1){fe(a,Qt(e,n),Zt(t,i)),me(a,r)}function Ss(a,e,t,i=.05,n=.05,r=1){fe(a,ei(e,n),Zt(t,i)),me(a,r)}function As(a,e,t,i=.05,n=.05,r=1){fe(a,Qt(e,n),Jt(t,i)),me(a,r)}function Cs(a,e,t,i=.05,n=.05,r=1){fe(a,ei(e,n),Jt(t,i)),me(a,r)}function fe(a,e,t){a&&a.position?typeof a.position.set=="function"?a.position.set(e,t):(a.position.x=e,a.position.y=t):a&&(a.x=e,a.y=t)}function me(a,e){e!==1&&a&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(e,e):a.scale.x!==void 0&&a.scale.y!==void 0&&(a.scale.x=e,a.scale.y=e))}var Re={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 Ts(a){return a&&Re[a]?JSON.parse(JSON.stringify(Re[a])):JSON.parse(JSON.stringify(vt))}function yt(a){Object.keys(a).forEach(e=>{let t=e;vt[t]&&a[t]&&Object.assign(vt[t],a[t])}),console.log("Config applied:",a)}function Ls(a,e){let t=a/e;t>1.6?(yt(Re.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(yt(Re.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(yt(Re.square),console.log("Applied SQUARE config for ratio:",t)):(yt(Re.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let a=window;a.configPresets=Re,a.resolveAnchorVec2=a.resolveAnchorVec2||Xt,a.resolveScreenAnchorPoint=a.resolveScreenAnchorPoint||hr,a.resolveScreenRatioPoint=a.resolveScreenRatioPoint||fr}pi();function U(a,e){let t=(n,r)=>r===0?n:t(r,n%r),i=t(a,e);return`${a/i}:${e/i}`}var Yc=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:U(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:U(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:U(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:U(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:U(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:U(360,780)}],Kc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:U(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:U(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:U(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:U(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:U(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:U(412,915)}],Xc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:U(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:U(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:U(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:U(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:U(800,1280)}],In=[{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:U(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:U(768,1024),mraidScale:.7}];var jn=[...In],Rn=[{category:"playable",label:"Playable Ad",devices:In}],ui=In[0];function He(a){return jn.find(e=>e.id===a)||ui}function $s(a){return jn.filter(e=>e.category===a)}K();var Ze=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let r=window.getEditableObjectConfig;if(typeof r!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let o=r(e);if(!o){console.error("[PropertyUpdateManager] Config not found for:",e);return}Ae({objectId:e,path:t,value:i},{persist:!0});let s=window.applyEditableObjectConfig;if(typeof s=="function"){let d=window.__editableConfig,u=(p=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?p:o;await s(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let r of i)if(n&&typeof n=="object"&&r in n)n=n[r];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function zn(a){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var r;let i=(r=t.target.files)==null?void 0:r[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let o=n.result,s=a.category||"misc",c=`${(a.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:s,filename:`${c}.png`,data:o,overwrite:!0})})).json();if(!(d!=null&&d.success)){alert(`Upload failed: ${(d==null?void 0:d.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(s,`${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 a.onApply(d.path)}catch(p){console.error("[QuickActionsBar] Upload error:",p),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var gi=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 r=n(t);if(!r)return;let o=this.updateManager.getNestedProperty(r,i);if(e==="ai-convert"||e==="upload"||e==="library"){let s=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";s&&(await this.prepareForImageConversion(t,r),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,o);break;case"ai-edit":this.openAIEditor(t,i,o);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,o);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 o=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",o),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",o)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var s,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===r||p.slotId===r)){let p=((s=t.identity)==null?void 0:s.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),n.slots.push({slotId:r,displayName:r.replace(/_/g," "),objectId:r,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),n.categories&&!n.categories.includes(p)&&n.categories.push(p),n.libraryAssets&&!n.libraryAssets[p]&&(n.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var r;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let o=window.__updateWorkbenchTabs;typeof o=="function"&&o()}if(n.libraryPanel){let o=window.getEditableObjectConfig,s=o==null?void 0:o(e),l=(r=s==null?void 0:s.identity)==null?void 0:r.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=t.split(".").pop()||t;n(r,`Edit ${r} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var o;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),r=((o=n==null?void 0:n.identity)==null?void 0:o.category)||(t.split(".")[0]==="render"?"environment":"ui");zn({objectId:e,category:r,onApply:async s=>{var p,d;await this.updateManager.updateProperty(e,t,s);let l=window.__debugContext;(d=(p=l==null?void 0:l.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,s);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,r)},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],r=i.slice(1),o=window.__editableConfig;if(!(o!=null&&o.schemas))return;let s=null;if(o.schemas instanceof Map?s=o.schemas.get(n):typeof o.schemas=="object"&&(s=o.schemas[n]),!(s!=null&&s.defaults))return;let l=s.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let o=`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.`,s="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",s),n(e,o,"",{objectId:e,path:s});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 Hs=["loading","start","gameplay","tutorial","endgame"],Ns=["environment","ui","character","system","backgrounds"],Fs=["bg","world","ui"],_r={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}}},hi=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=`
46
+ `,this.modal=i}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(o=>{o.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(o=>{o.addEventListener("click",s=>{let c=s.target.dataset.tab;c&&this.switchTab(c)})});let i=this.modal.querySelector("[data-ai-generate]");i==null||i.addEventListener("click",()=>{this.openAiEditor("generate")});let n=this.modal.querySelector("[data-ai-edit]");n==null||n.addEventListener("click",()=>{this.openAiEditor("edit")});let r=this.modal.querySelector("[data-modal-apply]");r==null||r.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",o=>{o.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let t=window.__openAiEditor;if(typeof t!="function"){alert("AI Editor not available. Please check your setup.");return}let i="";e==="edit"&&this.currentAsset?i=`Edit this image: ${this.currentObjectId}`:i=`Create an image for: ${this.currentObjectId}`,t(this.currentObjectId||"unknown",i,this.currentAsset,{path:this.currentPath,onApply:n=>{this.onApplyCallback&&this.onApplyCallback(n),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var wl={};ht(wl,{COLORS:()=>ce,ConfigWatcher:()=>$e,DebugPanel:()=>It,DefaultReloadStrategy:()=>Ct,Handler:()=>ne,PlayableLoadingScreen:()=>Wi,PreviewShell:()=>Gi,STROKE_WIDTH:()=>Eo,THEME:()=>So,applyConfigOverride:()=>Ae,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,applyDefaults:()=>De,baseLottie:()=>cn,bootstrap:()=>cl,clearConfigOverrides:()=>te,clearConfigOverridesForObject:()=>Ar,configOverrideManager:()=>Cr,createPreviewShell:()=>fa,deepClone:()=>G,default:()=>Oe,defaultPreset:()=>ui,deviceGroups:()=>Rn,devicePresets:()=>jn,diffConfigs:()=>kn,exportConfigsAsJSON:()=>ze,getConfigOverrides:()=>Y,getConfigStateSummary:()=>Et,getOverrideMode:()=>xt,getPresetById:()=>He,getPresetsByCategory:()=>$s,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>Cn,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>Pn,removeConfigOverride:()=>ai,resetToApplied:()=>St,resetToOriginal:()=>oi,setBootstrapDependencies:()=>sl,setOverrideMode:()=>En,setupHotReload:()=>On,setupLiveEditBridge:()=>qi,toLegacyFormat:()=>Tn,validateObjectConfig:()=>Je});module.exports=Go(wl);var xe={};function Gt(a,e,t=!1){xe[a]||(xe[a]=[]),xe[a].push({fn:e,once:t})}function rn(a,e){if(xe[a]){if(!e){delete xe[a];return}xe[a]=xe[a].filter(t=>t.fn!==e)}}function qt(a,...e){let t=xe[a];if(t)for(let i of[...t])i.fn(...e),i.once&&rn(a,i.fn)}function X(a,e){Gt(a,e,!0)}var B=null,ee=[],Ve=null;function ja(a){B=a,ee=[],Ve!==null&&(clearTimeout(Ve),Ve=null)}function Ra(){var a,e,t;return{endpoint:(B==null?void 0:B.endpoint)||"",transport:(B==null?void 0:B.transport)||"beacon",batchSize:(a=B==null?void 0:B.batchSize)!=null?a:10,flushIntervalMs:(e=B==null?void 0:B.flushIntervalMs)!=null?e:300,maxQueue:(t=B==null?void 0:B.maxQueue)!=null?t:200,debug:!!(B!=null&&B.debug)}}async function Oa(a,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(a,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(r){i&&console.warn("[handler.telemetry] fetch failed",r)}}function on(a,e){let t=Ra();if(e&&t.endpoint){if(ee.push(a),ee.length>t.maxQueue&&(ee=ee.slice(ee.length-t.maxQueue)),ee.length>=t.batchSize){Ia();return}Ve===null&&(Ve=window.setTimeout(()=>{Ve=null,Ia()},t.flushIntervalMs))}}async function Ia(){let a=Ra();if(!a.endpoint||ee.length===0)return;let e=ee.splice(0,a.batchSize);await Oa(a.endpoint,{events:e},a.transport,a.debug),ee.length>0&&await Oa(a.endpoint,{events:ee.splice(0,a.batchSize)},a.transport,a.debug)}function za(a){return Math.max(0,Math.min(1,a))}function qo(a){let e=String(a!=null?a:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function ft(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Vo(a,e){let t=a==null?void 0:a[e];return typeof t=="number"?t:0}function Da(a,e,t){try{a[e]=t}catch{}}function Wo(a){let e=a==null?void 0:a.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function $a(a,e){let t=a==null?void 0:a.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Ha(a,e){let t=Wo(a);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function Na(){let a=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),a.size>0&&i()})},n=p=>{var u;a.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},r=p=>{a.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},o=p=>{p.killed||(p.killed=!0,r(p))},s=()=>{var d,u;let p=ft();for(let h of Array.from(a)){if(h.killed||h.paused)continue;let f=p-h.startMs-h.delayMs;if(f<0)continue;let g=h.durationMs>0?f/h.durationMs:1,m=za(g),y=h.repeat>=0?h.repeat+1:1,b=h.repeat>0?Math.min(Math.floor(g),y-1):0;if(h.repeat>0&&g>=1){let E=g-b;m=za(E)}let v=h.ease(m);h.yoyo&&b%2===1&&(v=1-v);for(let E of h.props)Da(h.target,E.key,E.from+(E.to-E.from)*v);h.scaleFrom&&h.scaleTo&&$a(h.target,{x:h.scaleFrom.x+(h.scaleTo.x-h.scaleFrom.x)*v,y:h.scaleFrom.y+(h.scaleTo.y-h.scaleFrom.y)*v});try{(d=h.onUpdate)==null||d.call(h)}catch{}if(g>=y){o(h);try{(u=h.onComplete)==null||u.call(h)}catch{}}}},l=(p,d,u)=>{var E;let h=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),f=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((E=u==null?void 0:u.delayMsOverride)!=null?E:0)),g=qo(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,y=d.yoyo===!0,b=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let x of Object.keys(d)){if(b.has(x))continue;let A=d[x];typeof A=="number"&&v.push({key:x,from:Vo(p,x),to:A})}let w=Ha(p,d);return{target:p,startMs:ft(),delayMs:f,durationMs:h,ease:g,props:v,scaleFrom:w.from,scaleTo:w.to,repeat:m,yoyo:y,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return n(u),{kill:()=>o(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ft())},resume:()=>{var g;if(!u.paused)return;let h=(g=u.pauseAtMs)!=null?g:ft(),f=ft()-h;u.startMs+=f,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let h of Object.keys(d)){let f=d[h];h==="scale"||h==="scaleX"||h==="scaleY"||typeof f=="number"&&Da(p,h,f)}let u=Ha(p,d);u.to&&$a(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))o(u)},timeline(p={}){let d=[],u=0,h=!1,f=[],g=b=>{if(typeof b=="number")return Math.max(0,b*1e3);let v=typeof b=="string"?b.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=b=>{d.push(b);let v=Math.max(0,(typeof b.vars.duration=="number"?b.vars.duration:.5)*1e3);u=Math.max(u,b.atMs+v)},y={to(b,v,w){return m({kind:"to",target:b,vars:v,atMs:g(w)}),y},fromTo(b,v,w,E){return m({kind:"fromTo",target:b,vars:w,from:v,atMs:g(E)}),y},play(){var b,v;if(h)return y;h=!0,f=[];for(let w of d)w.kind==="fromTo"&&c.set(w.target,(b=w.from)!=null?b:{}),f.push(c.to(w.target,{...w.vars,delay:w.atMs/1e3+((v=w.vars.delay)!=null?v:0)}));return y},pause(){for(let b of f)b.pause();return y},kill(){for(let b of f)b.kill();f=[],h=!1}};return p.paused||y.play(),y}};return c}function Fa(){if(typeof window=="undefined")return;let a=window;if(!a.gsap)try{a.gsap=Na()}catch{}}var Ba={name:"handler-playable-sdk",version:"0.5.26",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 J=0,Ko=J++,Ua=J++,Ga=J++,qa=J++,Va=J++,Wa=J++,Ya=J++,Ka=J++,Xa=J++,Ja=J++,Za=J++,Qa=J++,F=Ko;function er(){return F===Ua}function tr(){return F===Ga}function ir(){return F===qa}function nr(){return F===Va}function We(){return F===Wa}function Ye(){return F===Ya}function ar(){return F===Ka}function rr(){return F===Xa}function or(){return F===Ja}function sn(){return F===Za}function ln(){return F===Qa}function sr(){let a=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(a==="mraid")try{mraid.getState(),F=Ua;return}catch{}else if(a==="dapi")try{dapi.isReady(),F=Ga;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(F=qa)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(F=Va)}catch{}else if(e==="mintegral")window.gameReady&&(F=Wa);else if(e==="tapjoy")window.TJ_API&&(F=Ya);else if(e==="tiktok")window.openAppStore&&(F=Ka);else if(e==="smadex")try{window.smxTracking&&(F=Xa)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(F=Ja)}catch{}else e==="vungle"?F=Za:(a==="nucleo"||e==="nucleo")&&(F=Qa)}var Vt=qe(require("lottie-web"),1),cn=Vt.default;typeof window!="undefined"&&(window.lottie=Vt.default,window.__baseLottie=Vt.default);var Xo=require("pixi.js");var dn=require("pixi.js");var Jo=null;function pn(a){Jo=a}Wt();un();var mt=require("pixi.js");Wt();var ns=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",mn=ns;if(typeof window!="undefined")try{let a=new XMLHttpRequest;if(a.open("GET","./build-settings.json",!1),a.send(),a.status===200&&a.responseText){let e=JSON.parse(a.responseText);e!=null&&e.buildMode&&(mn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${mn}`))}}catch{}function as(a){var t,i,n,r,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(a);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(a))return{x:(t=a[0])!=null?t:.5,y:(i=a[1])!=null?i:.5};if(a&&typeof a=="object"&&"x"in a&&"y"in a)return{x:(n=a.x)!=null?n:.5,y:(r=a.y)!=null?r:.5};if(typeof a=="string"){let s=a.trim().toLowerCase();return(o=e[s])!=null?o:{x:.5,y:.5}}return null}var Se=class{static async create(e,t,i){var l,c,p,d,u,h,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${mn}`);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 g=new mt.Container;return this.applyTransform(g,t==null?void 0:t.transform,t),g}let r=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${r}, type: ${n.type}, path: ${n.path}`);let o=await je.load(e,n,i,r);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=o==null?void 0:o.constructor)==null?void 0:p.name}`);let s;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",o,"for object:",e),s=new mt.Sprite(o),console.log("[ObjectFactory] Created object:",s,"type:",(d=s==null?void 0:s.constructor)==null?void 0:d.name),this.applyTransform(s,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=o==null?void 0:o.constructor)==null?void 0:u.name,o),o&&(((h=o.constructor)==null?void 0:h.name)==="Container"||o instanceof mt.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let g=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let y of g)try{let b=await fetch(y);if(b.ok){s=await b.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",y,"type:",(f=s==null?void 0:s.constructor)==null?void 0:f.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),s=o)}else s=o;else s=o,s&&typeof s=="object"&&("x"in s||"position"in s)&&this.applyTransform(s,t==null?void 0:t.transform,t);return s}static applyTransform(e,t,i){var n,r,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((o=t.position.x)!=null?o:0,(s=t.position.y)!=null?s: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=as(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};var bt=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}};var ss=qe(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=ss);Ke();var Yt=require("pixi.js");Ke();var vn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new bt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async r=>{var s;let o=this.registry.get(r);if(!o){console.warn("[Assets] No config found for object:",r);return}try{let l=await Se.create(r,o,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(s=l==null?void 0:l.constructor)==null?void 0:s.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Se.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},ls=new vn,cs=new Proxy(ls,{get(a,e){if(e in a&&typeof a[e]=="function")return a[e].bind(a);if(a.get(e))return a.get(e)}});Ke();var gr=require("pixi.js"),he={width:400,height:600,designWidth:400,scaleFactor:1},Xt={scale:1,position:1},xn=[];function ps(a,e,t,i,n,r,o){xn.push({element:a,originalScale:r,positionHelper:e,heightPercent:n}),e(a,t,i,n,r,o,!1)}function us(){xn.forEach(({element:a,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*he.scaleFactor;t(a,he.width,he.height,i,n,!0,!1)})}function wn(a,e){console.log(`[SCREEN] updateScreenState called: ${a}x${e}`),he.width=a,he.height=e,he.scaleFactor=Math.min(a/he.designWidth,1.15),Xt.scale=he.scaleFactor,Xt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Xt.scale.toFixed(3)}`),us()}var vt={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 gs(a,e,t){let i=vt[a];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${a}.${e} = ${t}`))}function hs(){return vt}var fs={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 Kt(a,e){return typeof a=="number"&&Number.isFinite(a)?a:e}function Jt(a,e={x:.5,y:.5}){var t;if(Array.isArray(a))return{x:Kt(a[0],e.x),y:Kt(a[1],e.y)};if(a&&typeof a=="object"){let i=a;return{x:Kt(i.x,e.x),y:Kt(i.y,e.y)}}if(typeof a=="string"){let i=a.trim().toLowerCase();return(t=fs[i])!=null?t:e}return e}function hr(a,e,t,i={}){var h,f,g,m,y,b;let n=Jt(t),r=(h=i.inset)!=null?h:{},o=(f=i.padding)!=null?f:{x:0,y:0},s=((g=r.left)!=null?g:0)+o.x,l=((m=r.right)!=null?m:0)+o.x,c=((y=r.top)!=null?y:0)+o.y,p=((b=r.bottom)!=null?b:0)+o.y,d=Math.max(0,a-s-l),u=Math.max(0,e-c-p);return{x:s+d*n.x,y:c+u*n.y}}function fr(a,e,t,i={}){var g,m,y,b,v,w;let n=(g=i.inset)!=null?g:{},r=(m=i.padding)!=null?m:{x:0,y:0},o=((y=n.left)!=null?y:0)+r.x,s=((b=n.right)!=null?b:0)+r.x,l=((v=n.top)!=null?v:0)+r.y,c=((w=n.bottom)!=null?w:0)+r.y,p=Math.max(0,a-o-s),d=Math.max(0,e-l-c),u=Jt(t,{x:.5,y:.5}),h=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:o+p*h,y:l+d*f}}if(typeof window!="undefined"){let a=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==a||n!==e)&&(a=i,e=n,wn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),wn(window.innerWidth,window.innerHeight),window.updateDebugConfig=gs,window.getDebugConfig=hs,window.copyConfig=Ts,window.applyConfig=yt,window.applyConfigForRatio=Ls,window.positionAtBottom=mr,window.positionAtTop=ys,window.positionAtCenter=vs,window.positionAtLeft=ws,window.positionAtRight=xs,window.positionAtBottomLeft=Es,window.positionAtBottomRight=Ss,window.positionAtTopLeft=As,window.positionAtTopRight=Cs,window.applyPositionContract=bs,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 Zt(a,e,t=0){return a*e+t}function Qt(a,e,t=0){return a*(1-e)+t}function ei(a,e,t=0){return a*e+t}function ti(a,e,t=0){return a*(1-e)+t}function Z(a,e=0){return a/2+e}function ms(a,e){return a*e}function bs(a,e,t,i){var o,s,l,c,p,d,u,h,f,g,m,y,b,v,w,E,x,A,S,P;let n=0,r=0;switch(i.type){case"top":n=Z(e,(s=(o=i.offset)==null?void 0:o.x)!=null?s:0),r=Zt(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=Z(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),r=Qt(t,i.percent,(h=(u=i.offset)==null?void 0:u.y)!=null?h:0);break;case"left":n=ei(e,i.percent,(g=(f=i.offset)==null?void 0:f.x)!=null?g:0),r=Z(t,(y=(m=i.offset)==null?void 0:m.y)!=null?y:0);break;case"right":n=ti(e,i.percent,(v=(b=i.offset)==null?void 0:b.x)!=null?v:0),r=Z(t,(E=(w=i.offset)==null?void 0:w.y)!=null?E:0);break;case"center":n=Z(e,(A=(x=i.offset)==null?void 0:x.x)!=null?A:0),r=Z(t,(P=(S=i.offset)==null?void 0:S.y)!=null?P:0);break}a.position?a.position.set(n,r):(a.x=n,a.y=r),i.scale!==void 0&&i.scale!==1&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(i.scale,i.scale):(a.scale.x=i.scale,a.scale.y=i.scale))}function mr(a,e,t,i=.2,n=1,r=!0,o=!1){let s=ms(t,i),l=Qt(t,i/2);fe(a,Z(e),l);let c=r?n*he.scaleFactor:n;me(a,c),o&&!xn.find(p=>p.element===a)&&ps(a,mr,e,t,i,n,r)}function ys(a,e,t,i=.1,n=1){fe(a,Z(e),Zt(t,i)),me(a,n)}function vs(a,e,t,i=0,n=0,r=1){fe(a,Z(e,i),Z(t,n)),me(a,r)}function ws(a,e,t,i=.1,n=1){fe(a,ei(e,i),Z(t)),me(a,n)}function xs(a,e,t,i=.1,n=1){fe(a,ti(e,i),Z(t)),me(a,n)}function Es(a,e,t,i=.05,n=.05,r=1){fe(a,ei(e,n),Qt(t,i)),me(a,r)}function Ss(a,e,t,i=.05,n=.05,r=1){fe(a,ti(e,n),Qt(t,i)),me(a,r)}function As(a,e,t,i=.05,n=.05,r=1){fe(a,ei(e,n),Zt(t,i)),me(a,r)}function Cs(a,e,t,i=.05,n=.05,r=1){fe(a,ti(e,n),Zt(t,i)),me(a,r)}function fe(a,e,t){a&&a.position?typeof a.position.set=="function"?a.position.set(e,t):(a.position.x=e,a.position.y=t):a&&(a.x=e,a.y=t)}function me(a,e){e!==1&&a&&a.scale&&(typeof a.scale.set=="function"?a.scale.set(e,e):a.scale.x!==void 0&&a.scale.y!==void 0&&(a.scale.x=e,a.scale.y=e))}var Re={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 Ts(a){return a&&Re[a]?JSON.parse(JSON.stringify(Re[a])):JSON.parse(JSON.stringify(vt))}function yt(a){Object.keys(a).forEach(e=>{let t=e;vt[t]&&a[t]&&Object.assign(vt[t],a[t])}),console.log("Config applied:",a)}function Ls(a,e){let t=a/e;t>1.6?(yt(Re.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(yt(Re.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(yt(Re.square),console.log("Applied SQUARE config for ratio:",t)):(yt(Re.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let a=window;a.configPresets=Re,a.resolveAnchorVec2=a.resolveAnchorVec2||Jt,a.resolveScreenAnchorPoint=a.resolveScreenAnchorPoint||hr,a.resolveScreenRatioPoint=a.resolveScreenRatioPoint||fr}pi();function U(a,e){let t=(n,r)=>r===0?n:t(r,n%r),i=t(a,e);return`${a/i}:${e/i}`}var Yc=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:U(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:U(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:U(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:U(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:U(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:U(360,780)}],Kc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:U(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:U(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:U(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:U(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:U(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:U(412,915)}],Xc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:U(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:U(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:U(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:U(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:U(800,1280)}],In=[{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:U(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:U(768,1024),mraidScale:.7}];var jn=[...In],Rn=[{category:"playable",label:"Playable Ad",devices:In}],ui=In[0];function He(a){return jn.find(e=>e.id===a)||ui}function $s(a){return jn.filter(e=>e.category===a)}K();var Ze=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let r=window.getEditableObjectConfig;if(typeof r!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let o=r(e);if(!o){console.error("[PropertyUpdateManager] Config not found for:",e);return}Ae({objectId:e,path:t,value:i},{persist:!0});let s=window.applyEditableObjectConfig;if(typeof s=="function"){let d=window.__editableConfig,u=(p=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?p:o;await s(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let r of i)if(n&&typeof n=="object"&&r in n)n=n[r];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function zn(a){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var r;let i=(r=t.target.files)==null?void 0:r[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let o=n.result,s=a.category||"misc",c=`${(a.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:s,filename:`${c}.png`,data:o,overwrite:!0})})).json();if(!(d!=null&&d.success)){alert(`Upload failed: ${(d==null?void 0:d.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(s,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let h=window.refreshAssetLibrary;typeof h=="function"&&await h(),await a.onApply(d.path)}catch(p){console.error("[QuickActionsBar] Upload error:",p),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var gi=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 r=n(t);if(!r)return;let o=this.updateManager.getNestedProperty(r,i);if(e==="ai-convert"||e==="upload"||e==="library"){let s=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";s&&(await this.prepareForImageConversion(t,r),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,o);break;case"ai-edit":this.openAIEditor(t,i,o);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,o);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 o=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",o),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",o)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var s,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===r||p.slotId===r)){let p=((s=t.identity)==null?void 0:s.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),n.slots.push({slotId:r,displayName:r.replace(/_/g," "),objectId:r,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),n.categories&&!n.categories.includes(p)&&n.categories.push(p),n.libraryAssets&&!n.libraryAssets[p]&&(n.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var r;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let o=window.__updateWorkbenchTabs;typeof o=="function"&&o()}if(n.libraryPanel){let o=window.getEditableObjectConfig,s=o==null?void 0:o(e),l=(r=s==null?void 0:s.identity)==null?void 0:r.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=t.split(".").pop()||t;n(r,`Edit ${r} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var o;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),r=((o=n==null?void 0:n.identity)==null?void 0:o.category)||(t.split(".")[0]==="render"?"environment":"ui");zn({objectId:e,category:r,onApply:async s=>{var p,d;await this.updateManager.updateProperty(e,t,s);let l=window.__debugContext;(d=(p=l==null?void 0:l.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,s);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,r)},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],r=i.slice(1),o=window.__editableConfig;if(!(o!=null&&o.schemas))return;let s=null;if(o.schemas instanceof Map?s=o.schemas.get(n):typeof o.schemas=="object"&&(s=o.schemas[n]),!(s!=null&&s.defaults))return;let l=s.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let o=`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.`,s="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",s),n(e,o,"",{objectId:e,path:s});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 Hs=["loading","start","gameplay","tutorial","endgame"],Ns=["environment","ui","character","system","backgrounds"],Fs=["bg","world","ui"],_r={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}}},hi=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=`
47
47
  <div class="wizard-card">
48
48
  <div class="wizard-header">
49
49
  <div class="wizard-title">
@@ -348,7 +348,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
348
348
  </div>
349
349
  <div class="panel-resize-handle-v" data-panel-resize-v></div>
350
350
  </div>
351
- `}initialize(e,t){var r,o,s,l,c,p,d;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"),(s=this.searchInput)==null||s.addEventListener("input",()=>this.refreshObjects());let i=(l=this.root)==null?void 0:l.querySelector("[data-add-object]");i==null||i.addEventListener("click",()=>{let u=this.getDefaultScreenForCreate();this.openAddObjectWizard(u)});let n=(c=this.root)==null?void 0:c.querySelector("#scene-screen-filter");if(n){try{let u=window.localStorage.getItem(this.getScreenFilterStorageKey());u&&(this.screenFilter=u)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let u=n.value||"all";this.screenFilter=u;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(p=this.root)==null||p.addEventListener("click",u=>{let g=u.target;if(!g||g.closest("[data-context-menu]"))return;let m=g.closest("[data-object-id]");if(!m)return;let h=m.dataset.objectId;h&&this.select(h)}),(d=this.listContainer)==null||d.addEventListener("contextmenu",u=>{var v;let g=u.target,m=g==null?void 0:g.closest("[data-object-id]");if(!m)return;let h=m.dataset.objectId;if(!h)return;u.preventDefault();let f=window.getEditableObjectConfig,y=typeof f=="function"?f(h):null;if(!y){let w=window.__editableObjectConfigs;w&&typeof w.get=="function"&&(y=(v=w.get(h))!=null?v:null)}let b=this.inferScreen(h,y);this.showContextMenu(h,b,u.clientX,u.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){var o,s,l,c,p;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{d.classList.toggle("selected",d.dataset.objectId===e)});let i=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumbs]"),n=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),r=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&r)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let y=window.__editableObjectConfigs;y&&typeof y.get=="function"&&(u=(c=y.get(e))!=null?c:null)}let g=this.inferScreen(e,u),m={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),f=this.formatDisplayName(h);n.textContent=m[g]||g,r.textContent=f,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let n=e();if(!Array.isArray(n)||n.length===0){let d=window.__editableObjectConfigs;d&&typeof d.keys=="function"&&(n=Array.from(d.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let r=(((p=this.searchInput)==null?void 0:p.value)||"").trim().toLowerCase(),o=["loading","start","gameplay","tutorial","endgame"],s=Object.fromEntries(o.map(d=>[d,[]])),l=Object.fromEntries(o.map(d=>[d,[]]));n.forEach(d=>{var P,I,L,T;let u=typeof t=="function"?t(d):null;if(!u){let j=window.__editableObjectConfigs;j&&typeof j.get=="function"&&(u=(P=j.get(d))!=null?P:null)}let g=(((I=u==null?void 0:u.identity)==null?void 0:I.category)||"scene").toString(),m=(((L=u==null?void 0:u.identity)==null?void 0:L.id)||d).toString(),h=g.toLowerCase(),f=m.toLowerCase(),y=h.includes("ui")||f.startsWith("ui")||f.includes("label"),b=this.formatDisplayName(m||d),v=((T=u==null?void 0:u.render)==null?void 0:T.visible)===!1||(u==null?void 0:u.enabled)===!1,w=this.getObjectType(u),E={id:d,label:b,category:g,isUi:y,isUnused:v,objectType:w},x=this.inferScreen(E.id,u);if(this.screenFilter!=="all"&&x!==this.screenFilter||!(!r||E.id.toLowerCase().includes(r)||E.label.toLowerCase().includes(r)))return;(E.isUnused?l:s)[x].push(E)});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"};this.listContainer.innerHTML=`
351
+ `}initialize(e,t){var r,o,s,l,c,p,d;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"),(s=this.searchInput)==null||s.addEventListener("input",()=>this.refreshObjects());let i=(l=this.root)==null?void 0:l.querySelector("[data-add-object]");i==null||i.addEventListener("click",()=>{let u=this.getDefaultScreenForCreate();this.openAddObjectWizard(u)});let n=(c=this.root)==null?void 0:c.querySelector("#scene-screen-filter");if(n){try{let u=window.localStorage.getItem(this.getScreenFilterStorageKey());u&&(this.screenFilter=u)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let u=n.value||"all";this.screenFilter=u;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(p=this.root)==null||p.addEventListener("click",u=>{let h=u.target;if(!h||h.closest("[data-context-menu]"))return;let f=h.closest("[data-object-id]");if(!f)return;let g=f.dataset.objectId;g&&this.select(g)}),(d=this.listContainer)==null||d.addEventListener("contextmenu",u=>{var v;let h=u.target,f=h==null?void 0:h.closest("[data-object-id]");if(!f)return;let g=f.dataset.objectId;if(!g)return;u.preventDefault();let m=window.getEditableObjectConfig,y=typeof m=="function"?m(g):null;if(!y){let w=window.__editableObjectConfigs;w&&typeof w.get=="function"&&(y=(v=w.get(g))!=null?v:null)}let b=this.inferScreen(g,y);this.showContextMenu(g,b,u.clientX,u.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){var o,s,l,c,p;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{d.classList.toggle("selected",d.dataset.objectId===e)});let i=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumbs]"),n=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),r=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&r)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let y=window.__editableObjectConfigs;y&&typeof y.get=="function"&&(u=(c=y.get(e))!=null?c:null)}let h=this.inferScreen(e,u),f={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},g=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),m=this.formatDisplayName(g);n.textContent=f[h]||h,r.textContent=m,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let n=e();if(!Array.isArray(n)||n.length===0){let d=window.__editableObjectConfigs;d&&typeof d.keys=="function"&&(n=Array.from(d.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let r=(((p=this.searchInput)==null?void 0:p.value)||"").trim().toLowerCase(),o=["loading","start","gameplay","tutorial","endgame"],s=Object.fromEntries(o.map(d=>[d,[]])),l=Object.fromEntries(o.map(d=>[d,[]]));n.forEach(d=>{var P,I,L,T;let u=typeof t=="function"?t(d):null;if(!u){let j=window.__editableObjectConfigs;j&&typeof j.get=="function"&&(u=(P=j.get(d))!=null?P:null)}let h=(((I=u==null?void 0:u.identity)==null?void 0:I.category)||"scene").toString(),f=(((L=u==null?void 0:u.identity)==null?void 0:L.id)||d).toString(),g=h.toLowerCase(),m=f.toLowerCase(),y=g.includes("ui")||m.startsWith("ui")||m.includes("label"),b=this.formatDisplayName(f||d),v=((T=u==null?void 0:u.render)==null?void 0:T.visible)===!1||(u==null?void 0:u.enabled)===!1,w=this.getObjectType(u),E={id:d,label:b,category:h,isUi:y,isUnused:v,objectType:w},x=this.inferScreen(E.id,u);if(this.screenFilter!=="all"&&x!==this.screenFilter||!(!r||E.id.toLowerCase().includes(r)||E.label.toLowerCase().includes(r)))return;(E.isUnused?l:s)[x].push(E)});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"};this.listContainer.innerHTML=`
352
352
  ${o.map(d=>this.renderGroup(c[d],[...s[d],...l[d]])).join("")}
353
353
  `,this.setSelected(this.selectedId)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var s,l;let i=window.__HANDLER_SCREEN_INDEX,n=(s=i==null?void 0:i.instanceToScreen)==null?void 0:s[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let r=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),o=`${e} ${r}`.toLowerCase();return o.includes("loading")?"loading":o.includes("start")?"start":o.includes("tutorial")?"tutorial":o.includes("endgame")||o.includes("end_card")||o.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,r,o,s,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(r=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&r.endsWith(".json")?"animation":((s=(o=e.render)==null?void 0:o.asset)==null?void 0:s.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(p=(c=e.gameplay)==null?void 0:c.tuning)!=null&&p.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(r=>{var p,d;let o=typeof i=="function"?i(r.id):null;if(!o){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(o=(p=u.get(r.id))!=null?p:null)}let s=this.getTypeIconByType(r.objectType),l=this.getAssetPreview(o),c=(d=o==null?void 0:o.ui)!=null&&d.text?`"${o.ui.text.substring(0,12)}${o.ui.text.length>12?"...":""}"`:"";return`
354
354
  <button class="scene-object-item ${r.isUnused?"unused":""}" data-object-id="${r.id}">
@@ -466,7 +466,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
466
466
  </div>
467
467
  </div>
468
468
  </div>
469
- `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(r=>{r.addEventListener("click",()=>{var l,c,p,d;let o=r.dataset.nudge,s=this.getNudgeStep();switch(o){case"up":(l=this.options)==null||l.onNudge(0,-s);break;case"down":(c=this.options)==null||c.onNudge(0,s);break;case"left":(p=this.options)==null||p.onNudge(-s,0);break;case"right":(d=this.options)==null||d.onNudge(s,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(r=>{r.addEventListener("click",()=>{var l;let s=r.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(s)})})}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 Ct=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let i=e||{},n=t||{},r={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},o=Array.isArray(i.slots)?i.slots:[];if(o.length>0&&r.slots.length>0)for(let c of r.slots){let p=o.find(d=>(d==null?void 0:d.slotId)&&d.slotId===(c==null?void 0:c.slotId));p!=null&&p.currentAsset&&p.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=p.currentAsset)}let s=i.libraryAssets||{};for(let[c,p]of Object.entries(s)){if(!Array.isArray(p))continue;r.libraryAssets[c]||(r.libraryAssets[c]=[]);let d=new Set((r.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of p){let g=u==null?void 0:u.filename;!g||d.has(g)||(r.libraryAssets[c].unshift(u),d.add(g))}}let l=new Set(r.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return r.categories=Array.from(l),r}render(){return`
469
+ `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(r=>{r.addEventListener("click",()=>{var l,c,p,d;let o=r.dataset.nudge,s=this.getNudgeStep();switch(o){case"up":(l=this.options)==null||l.onNudge(0,-s);break;case"down":(c=this.options)==null||c.onNudge(0,s);break;case"left":(p=this.options)==null||p.onNudge(-s,0);break;case"right":(d=this.options)==null||d.onNudge(s,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(r=>{r.addEventListener("click",()=>{var l;let s=r.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(s)})})}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 Tt=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let i=e||{},n=t||{},r={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},o=Array.isArray(i.slots)?i.slots:[];if(o.length>0&&r.slots.length>0)for(let c of r.slots){let p=o.find(d=>(d==null?void 0:d.slotId)&&d.slotId===(c==null?void 0:c.slotId));p!=null&&p.currentAsset&&p.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=p.currentAsset)}let s=i.libraryAssets||{};for(let[c,p]of Object.entries(s)){if(!Array.isArray(p))continue;r.libraryAssets[c]||(r.libraryAssets[c]=[]);let d=new Set((r.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of p){let h=u==null?void 0:u.filename;!h||d.has(h)||(r.libraryAssets[c].unshift(u),d.add(h))}}let l=new Set(r.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return r.categories=Array.from(l),r}render(){return`
470
470
  <div class="scene-panel library-panel panel-accent-purple" data-panel="library">
471
471
  <div class="scene-panel-header" data-panel-handle>
472
472
  <div class="panel-title">
@@ -485,7 +485,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
485
485
  </div>
486
486
  <div class="panel-resize-handle" data-panel-resize></div>
487
487
  </div>
488
- `}initialize(e,t){var r,o,s;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-slots]");let i=(o=this.root)==null?void 0:o.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(s=this.root)==null?void 0:s.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),r=this.mergeRegistries(t,n);window.getEditableAssets=()=>r,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let r=document.createElement("div");r.className="library-category";let o=document.createElement("div");o.className="library-category-header",o.textContent=this.formatCategoryName(i),r.appendChild(o);let s=document.createElement("div");s.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);s.appendChild(c)}r.appendChild(s),this.slotsContainer.appendChild(r)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let r=document.createElement("div");r.className="slot-header";let o=document.createElement("div");o.className="slot-current";let s=document.createElement("img");s.src=`/raw/${e.currentAsset}?t=${t}`,s.alt=e.displayName,s.className="slot-thumbnail",s.onerror=()=>{s.style.display="none"},o.appendChild(s),r.appendChild(o);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let p=document.createElement("div");p.className="slot-asset",p.textContent=e.currentAsset,l.appendChild(c),l.appendChild(p),r.appendChild(l);let d=document.createElement("div");d.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async f=>{f.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async f=>{f.stopPropagation(),await this.handleUpload(e)}),d.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)}),d.appendChild(m);let h=document.createElement("span");if(h.className="slot-expand-icon",h.textContent=i?"\u25BC":"\u25B6",d.appendChild(h),r.appendChild(d),r.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(r),i){let f=this.createLibraryElement(e,t);n.appendChild(f)}return n}createLibraryElement(e,t){var r;let i=document.createElement("div");i.className="slot-library";let n=((r=this.registry)==null?void 0:r.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(o=>{let s=new Map;for(let c of n)s.set(c.filename,c);for(let c of o)s.has(c.filename)||s.set(c.filename,c);let l=Array.from(s.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let p=document.createElement("div");p.className="library-item";let d=document.createElement("img");d.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,d.alt=c.displayName,d.className="library-thumbnail",d.onerror=()=>{d.style.opacity="0.3"},p.appendChild(d);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,p.appendChild(u),p.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(p)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),r=[],o=/href="([^"]+\.(png|jpg|jpeg))"/gi,s;for(;(s=o.exec(n))!==null;){let l=s[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");r.push({filename:l,displayName:c})}}return r}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let r=`raw/library/${e.libraryFolder}/${t}`;n.onPick(r),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 r=await this.fileToDataUrl(i);if(!r){alert("Failed to read file");return}let s=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",s,"to category:",l);let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${s}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[Library] \u2705 Upload saved:",p.path);let d=window.addAssetToRegistry;typeof d=="function"&&d(l,`${s}.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,`${s}.png`),e.currentAsset=`${s}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",p.error),alert(`Upload failed: ${p.error}`)}catch(r){console.error("[Library] \u274C Upload error:",r),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(r=>(r.objectId===i||r.slotId===i)&&(!t||r.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var o;let r=(o=this.slotsContainer)==null?void 0:o.querySelector(`[data-slot-id="${n.slotId}"]`);r&&(r.scrollIntoView({behavior:"smooth",block:"center"}),r.classList.add("highlight-pulse"),setTimeout(()=>r.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var vi=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 wi=class{render(e,t,i,n){let r=this.formatLabel(t),o=i?this.getThumbnailUrl(i):"";return`
488
+ `}initialize(e,t){var r,o,s;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-slots]");let i=(o=this.root)==null?void 0:o.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(s=this.root)==null?void 0:s.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),r=this.mergeRegistries(t,n);window.getEditableAssets=()=>r,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let r=document.createElement("div");r.className="library-category";let o=document.createElement("div");o.className="library-category-header",o.textContent=this.formatCategoryName(i),r.appendChild(o);let s=document.createElement("div");s.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);s.appendChild(c)}r.appendChild(s),this.slotsContainer.appendChild(r)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let r=document.createElement("div");r.className="slot-header";let o=document.createElement("div");o.className="slot-current";let s=document.createElement("img");s.src=`/raw/${e.currentAsset}?t=${t}`,s.alt=e.displayName,s.className="slot-thumbnail",s.onerror=()=>{s.style.display="none"},o.appendChild(s),r.appendChild(o);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let p=document.createElement("div");p.className="slot-asset",p.textContent=e.currentAsset,l.appendChild(c),l.appendChild(p),r.appendChild(l);let d=document.createElement("div");d.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async m=>{m.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(u);let h=document.createElement("button");h.className="slot-upload",h.title="Upload new asset",h.textContent="\u{1F4E4}",h.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),d.appendChild(h);let f=document.createElement("button");f.className="slot-reset",f.title="Reset to default",f.textContent="\u21BA",f.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),d.appendChild(f);let g=document.createElement("span");if(g.className="slot-expand-icon",g.textContent=i?"\u25BC":"\u25B6",d.appendChild(g),r.appendChild(d),r.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(r),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var r;let i=document.createElement("div");i.className="slot-library";let n=((r=this.registry)==null?void 0:r.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(o=>{let s=new Map;for(let c of n)s.set(c.filename,c);for(let c of o)s.has(c.filename)||s.set(c.filename,c);let l=Array.from(s.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let p=document.createElement("div");p.className="library-item";let d=document.createElement("img");d.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,d.alt=c.displayName,d.className="library-thumbnail",d.onerror=()=>{d.style.opacity="0.3"},p.appendChild(d);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,p.appendChild(u),p.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(p)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),r=[],o=/href="([^"]+\.(png|jpg|jpeg))"/gi,s;for(;(s=o.exec(n))!==null;){let l=s[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");r.push({filename:l,displayName:c})}}return r}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let r=`raw/library/${e.libraryFolder}/${t}`;n.onPick(r),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 r=await this.fileToDataUrl(i);if(!r){alert("Failed to read file");return}let s=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",s,"to category:",l);let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${s}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[Library] \u2705 Upload saved:",p.path);let d=window.addAssetToRegistry;typeof d=="function"&&d(l,`${s}.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,`${s}.png`),e.currentAsset=`${s}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",p.error),alert(`Upload failed: ${p.error}`)}catch(r){console.error("[Library] \u274C Upload error:",r),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(r=>(r.objectId===i||r.slotId===i)&&(!t||r.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var o;let r=(o=this.slotsContainer)==null?void 0:o.querySelector(`[data-slot-id="${n.slotId}"]`);r&&(r.scrollIntoView({behavior:"smooth",block:"center"}),r.classList.add("highlight-pulse"),setTimeout(()=>r.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var vi=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 wi=class{render(e,t,i,n){let r=this.formatLabel(t),o=i?this.getThumbnailUrl(i):"";return`
489
489
  <div class="inspector-property" data-property-type="image">
490
490
  <div class="inspector-property-header">
491
491
  <label class="inspector-label">${r}</label>
@@ -581,7 +581,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
581
581
  ${r.join("")}
582
582
  </div>
583
583
  </div>
584
- `}renderLogic(e,t,i,n){let r=[],o=typeof(i==null?void 0:i.id)=="string"?i.id:"",s={zone:["bottom-left","bottom-right","top-left","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"]},l=(()=>{let p=window,d=Array.isArray(p==null?void 0:p.__HANDLER_LOGIC_OPTIONS)?p.__HANDLER_LOGIC_OPTIONS:[],g=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...d].map(m=>String(m)).filter(m=>m.trim().length>0);return Array.from(new Set(g)).sort((m,h)=>m.localeCompare(h))})(),c=o&&!l.includes(o)?[o,...l]:l;r.push(`
584
+ `}renderLogic(e,t,i,n){let r=[],o=typeof(i==null?void 0:i.id)=="string"?i.id:"",s={zone:["bottom-left","bottom-right","top-left","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"]},l=(()=>{let p=window,d=Array.isArray(p==null?void 0:p.__HANDLER_LOGIC_OPTIONS)?p.__HANDLER_LOGIC_OPTIONS:[],h=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...d].map(f=>String(f)).filter(f=>f.trim().length>0);return Array.from(new Set(h)).sort((f,g)=>f.localeCompare(g))})(),c=o&&!l.includes(o)?[o,...l]:l;r.push(`
585
585
  <div class="inspector-property inspector-property-text">
586
586
  <label class="inspector-property-label">Id</label>
587
587
  <div class="inspector-input-group">
@@ -594,9 +594,9 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
594
594
  </select>
595
595
  </div>
596
596
  </div>
597
- `);for(let p in i){if(p==="id")continue;let d=i[p],u=`${n}.${p}`;if(p==="props"&&d&&typeof d=="object"){let m=[];for(let h in d){let f=d[h],y=`${u}.${h}`,b=s[h];if((h==="targetId"||h==="inputId")&&typeof f=="string"){let v=(()=>{try{let x=window,A=x==null?void 0:x.__editableConfig;if(!(A!=null&&A.objects))return[];let S=[];if(A.objects instanceof Map)for(let P of A.objects.keys())S.push(P);else typeof A.objects=="object"&&S.push(...Object.keys(A.objects));return S.sort()}catch{return[]}})(),w=f||"",E=w&&!v.includes(w)?[w,...v]:v;m.push(`
597
+ `);for(let p in i){if(p==="id")continue;let d=i[p],u=`${n}.${p}`;if(p==="props"&&d&&typeof d=="object"){let f=[];for(let g in d){let m=d[g],y=`${u}.${g}`,b=s[g];if((g==="targetId"||g==="inputId")&&typeof m=="string"){let v=(()=>{try{let x=window,A=x==null?void 0:x.__editableConfig;if(!(A!=null&&A.objects))return[];let S=[];if(A.objects instanceof Map)for(let P of A.objects.keys())S.push(P);else typeof A.objects=="object"&&S.push(...Object.keys(A.objects));return S.sort()}catch{return[]}})(),w=m||"",E=w&&!v.includes(w)?[w,...v]:v;f.push(`
598
598
  <div class="inspector-property inspector-property-text">
599
- <label class="inspector-property-label">${this.formatLabel(h)}</label>
599
+ <label class="inspector-property-label">${this.formatLabel(g)}</label>
600
600
  <div class="inspector-input-group">
601
601
  <select class="inspector-component-select inspector-input"
602
602
  data-property-path="${y}"
@@ -606,25 +606,25 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
606
606
  </select>
607
607
  </div>
608
608
  </div>
609
- `);continue}if(Array.isArray(b)&&b.length)m.push(`
609
+ `);continue}if(Array.isArray(b)&&b.length)f.push(`
610
610
  <div class="inspector-property inspector-property-text">
611
- <label class="inspector-property-label">${this.formatLabel(h)}</label>
611
+ <label class="inspector-property-label">${this.formatLabel(g)}</label>
612
612
  <div class="inspector-input-group">
613
613
  <select class="inspector-component-select inspector-input"
614
614
  data-property-path="${y}"
615
615
  data-object-id="${e}">
616
- ${b.map(v=>`<option value="${String(v)}" ${String(v)===String(f)?"selected":""}>${String(v)}</option>`).join("")}
616
+ ${b.map(v=>`<option value="${String(v)}" ${String(v)===String(m)?"selected":""}>${String(v)}</option>`).join("")}
617
617
  </select>
618
618
  </div>
619
619
  </div>
620
- `);else{let v=this.registry.renderProperty(e,h,f,y);v&&m.push(v)}}m.length&&r.push(`
620
+ `);else{let v=this.registry.renderProperty(e,g,m,y);v&&f.push(v)}}f.length&&r.push(`
621
621
  <div class="inspector-property inspector-property-object">
622
622
  <div class="inspector-object-header">Props</div>
623
623
  <div class="inspector-object-body">
624
- ${m.join("")}
624
+ ${f.join("")}
625
625
  </div>
626
626
  </div>
627
- `);continue}let g=this.registry.renderProperty(e,p,d,u);g&&r.push(g)}return r.length===0?"":`
627
+ `);continue}let h=this.registry.renderProperty(e,p,d,u);h&&r.push(h)}return r.length===0?"":`
628
628
  <div class="inspector-property inspector-property-object">
629
629
  <div class="inspector-object-header">${this.formatLabel(t)}</div>
630
630
  <div class="inspector-object-body">
@@ -686,7 +686,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
686
686
  </div>
687
687
  </div>
688
688
  </div>
689
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var _i=class{constructor(){this.typeDetector=new vi,this.imageRenderer=new wi,this.colorRenderer=new xi,this.numberRenderer=new Ei,this.textRenderer=new Si,this.booleanRenderer=new Ai,this.arrayRenderer=new Ci,this.objectRenderer=new Ti(this),this.selectRenderer=new Li,this.jsonRenderer=new ki,this.spawnPointsRenderer=new Pi}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,r=n==null?void 0:n.schemas;if(!r)return null;let o=String(e||"").split(".").filter(Boolean);if(o.length<2)return null;let s=o[0],l=o.slice(1).join("."),c=r instanceof Map?r.get(s):r==null?void 0:r[s];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(n)).sort((r,o)=>r.localeCompare(o))}catch{return[]}}renderProperty(e,t,i,n){let r=t.toLowerCase(),o=r==="logic"||r==="logic_id"||r==="logicid",s=r==="id"&&n.toLowerCase().includes("logic");if((o||s)&&typeof i=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,i,n,u)}let c={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],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"],destroyEffect:["","effects_confetti_1"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]}[t];if(c&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,c);if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&typeof i=="string"){let u=this.getObjectIds();return this.selectRenderer.render(e,t,i,n,["",...u])}let p=this.getEnumOptionsFromSchemas(n);if(p)return this.selectRenderer.render(e,t,i,n,p);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function Bs(a,e){let t;return function(...n){let r=()=>{clearTimeout(t),a(...n)};clearTimeout(t),t=setTimeout(r,e)}}var Mi=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 _i,this.updateManager=new Ze,this.quickActions=new gi;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`
689
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var _i=class{constructor(){this.typeDetector=new vi,this.imageRenderer=new wi,this.colorRenderer=new xi,this.numberRenderer=new Ei,this.textRenderer=new Si,this.booleanRenderer=new Ai,this.arrayRenderer=new Ci,this.objectRenderer=new Ti(this),this.selectRenderer=new Li,this.jsonRenderer=new ki,this.spawnPointsRenderer=new Pi}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,r=n==null?void 0:n.schemas;if(!r)return null;let o=String(e||"").split(".").filter(Boolean);if(o.length<2)return null;let s=o[0],l=o.slice(1).join("."),c=r instanceof Map?r.get(s):r==null?void 0:r[s];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.slice(5).split("|").map(h=>h.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(n)).sort((r,o)=>r.localeCompare(o))}catch{return[]}}renderProperty(e,t,i,n){let r=t.toLowerCase(),o=r==="logic"||r==="logic_id"||r==="logicid",s=r==="id"&&n.toLowerCase().includes("logic");if((o||s)&&typeof i=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,i,n,u)}let c={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],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"],destroyEffect:["","effects_confetti_1"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]}[t];if(c&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,c);if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&typeof i=="string"){let u=this.getObjectIds();return this.selectRenderer.render(e,t,i,n,["",...u])}if(t==="spawnLogicId"&&typeof i=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,i,n,["",...u])}let p=this.getEnumOptionsFromSchemas(n);if(p)return this.selectRenderer.render(e,t,i,n,p);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function Bs(a,e){let t;return function(...n){let r=()=>{clearTimeout(t),a(...n)};clearTimeout(t),t=setTimeout(r,e)}}var Mi=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 _i,this.updateManager=new Ze,this.quickActions=new gi;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`
690
690
  <div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
691
691
  <div class="scene-panel-header" data-panel-handle>
692
692
  <div class="panel-title">
@@ -747,7 +747,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
747
747
  ${r.join("")}
748
748
  </div>
749
749
  </div>
750
- `}renderMotionSection(e,t,i){var g;let n=[],r=t!=null?t:{},o=(g=r.intro)!=null?g:{},s=o.enabled===!0&&(typeof o.duration!="number"||o.duration<=0)?'<div class="inspector-warning">\u26A0\uFE0F Duration must be > 0 to play.</div>':"",l=`
750
+ `}renderMotionSection(e,t,i){var h;let n=[],r=t!=null?t:{},o=(h=r.intro)!=null?h:{},s=o.enabled===!0&&(typeof o.duration!="number"||o.duration<=0)?'<div class="inspector-warning">\u26A0\uFE0F Duration must be > 0 to play.</div>':"",l=`
751
751
  <div class="inspector-motion-presets">
752
752
  <span class="inspector-subsection-title">Intro Motions</span>
753
753
  <div class="inspector-motion-buttons">
@@ -764,13 +764,13 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
764
764
  <button class="debug-btn debug-btn-sm ${this.motionSimpleMode?"primary":""}" data-motion-simple-toggle>
765
765
  ${this.motionSimpleMode?"Simple":"Advanced"}
766
766
  </button>
767
- `,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',d=m=>{let h=m.split(".").filter(Boolean),f=r;for(let v of h)f=f==null?void 0:f[v];let y=h[h.length-1],b=`${i}.${m}`;return this.rendererRegistry.renderProperty(e,y,f,b)};if(this.motionSimpleMode){let m=d("enabled");m&&n.push(m);let h=[],f=d("intro.enabled"),y=d("intro.type"),b=d("intro.duration"),v=d("intro.easing");f&&h.push(f),y&&h.push(y),b&&h.push(b),v&&h.push(v),h.length&&n.push(`
767
+ `,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',d=f=>{let g=f.split(".").filter(Boolean),m=r;for(let v of g)m=m==null?void 0:m[v];let y=g[g.length-1],b=`${i}.${f}`;return this.rendererRegistry.renderProperty(e,y,m,b)};if(this.motionSimpleMode){let f=d("enabled");f&&n.push(f);let g=[],m=d("intro.enabled"),y=d("intro.type"),b=d("intro.duration"),v=d("intro.easing");m&&g.push(m),y&&g.push(y),b&&g.push(b),v&&g.push(v),g.length&&n.push(`
768
768
  <div class="inspector-subsection">
769
769
  <div class="inspector-subsection-title">Intro</div>
770
770
  <div class="inspector-subsection-content">
771
771
  ${s}
772
772
  ${p}
773
- ${h.join("")}
773
+ ${g.join("")}
774
774
  </div>
775
775
  </div>
776
776
  `);let w=d("pulse.enabled"),E=d("swing.enabled"),x=[w,E].filter(Boolean).join("");x&&n.push(`
@@ -780,7 +780,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
780
780
  ${x}
781
781
  </div>
782
782
  </div>
783
- `)}else for(let m in r){let h=r[m],f=`${i}.${m}`,y=this.rendererRegistry.renderProperty(e,m,h,f);y&&n.push(y)}return n.length===0?"":`
783
+ `)}else for(let f in r){let g=r[f],m=`${i}.${f}`,y=this.rendererRegistry.renderProperty(e,f,g,m);y&&n.push(y)}return n.length===0?"":`
784
784
  <div class="inspector-section ${this.expandMotionOnNextRender?"":"collapsed"}" data-section="motion">
785
785
  <div class="inspector-section-header" data-section-toggle="motion">
786
786
  <span class="inspector-section-arrow">\u25BC</span>
@@ -793,7 +793,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
793
793
  ${n.join("")}
794
794
  </div>
795
795
  </div>
796
- `}attachEventListeners(){var m,h,f,y;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Bs((b,v,w)=>{var E,x;this.updateManager.updateProperty(b,v,w),(x=(E=this.options)==null?void 0:E.onPropertyChange)==null||x.call(E,b,v,w)},300);e.forEach(b=>{let v=E=>{var P,I;let x=E.target,A=x.dataset.propertyPath,S=x.dataset.objectId;if(A&&S){let L=x.value;if(x.type==="checkbox")L=x.checked;else if(x.type==="number"){if(L=parseFloat(x.value),isNaN(L))return}else if(x.dataset.json==="true")try{L=JSON.parse(x.value)}catch{return}x.type==="text"||x.type==="range"||x.tagName==="TEXTAREA"?t(S,A,L):(this.updateManager.updateProperty(S,A,L),(I=(P=this.options)==null?void 0:P.onPropertyChange)==null||I.call(P,S,A,L))}},w=b.dataset.propertyPath;w==="logic.id"||w!=null&&w.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",w),b.addEventListener("change",async E=>{var O;let x=E.target,A=x.dataset.propertyPath,S=x.dataset.objectId,P=x.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",P),!A||!S)return;await this.updateManager.updateProperty(S,A,P),console.log("[Inspector v1.0.0] Logic ID updated");let I=window,L=(O=I==null?void 0:I.__HANDLER_LOGIC_META)==null?void 0:O[P],T=this.getDefaultPropsForLogic(P,L);console.log("[Inspector v1.0.0] New logic default props:",T);let j=A.replace(".id",".props");await this.updateManager.updateProperty(S,j,T),console.log("[Inspector v1.0.0] Logic props updated to:",T),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(S)})):(b.addEventListener("change",v),(b.tagName==="INPUT"||b.tagName==="TEXTAREA")&&b.addEventListener("input",v))}),this.contentContainer.querySelectorAll("[data-action]").forEach(b=>{b.addEventListener("click",v=>{let w=v.target,E=w.dataset.action,x=w.dataset.path,A=w.dataset.object;E&&x&&A&&this.quickActions.handleAction(E,A,x)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(b=>{b.addEventListener("click",v=>{var x,A;let w=v.target,E=w.dataset.sectionToggle||((x=w.closest("[data-section-toggle]"))==null?void 0:x.getAttribute("data-section-toggle"));if(E){let S=(A=this.contentContainer)==null?void 0:A.querySelector(`[data-section="${E}"]`);S==null||S.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(b=>{b.addEventListener("click",async v=>{let E=v.currentTarget.dataset.motionPreset;!E||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,E)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(b=>{b.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let s=this.contentContainer.querySelector("[data-motion-simple-toggle]");s==null||s.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(b=>{b.addEventListener("click",async v=>{let w=v.target,E=w.dataset.objectId,x=w.dataset.propertyPath;if(!E||!x)return;let A=window.getEditableObjectConfig,S=A==null?void 0:A(E);if(!S)return;let P=this.updateManager.getNestedProperty(S,x),I=Array.isArray(P)?[...P]:[];I.push({x:0,y:0}),await this.updateManager.updateProperty(E,x,I),this.loadObject(E)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(b=>{b.addEventListener("click",async v=>{let w=v.target,E=w.dataset.objectId,x=w.dataset.propertyPath,A=Number(w.dataset.index||"-1");if(!E||!x||A<0)return;let S=window.getEditableObjectConfig,P=S==null?void 0:S(E);if(!P)return;let I=this.updateManager.getNestedProperty(P,x);if(!Array.isArray(I))return;let L=I.filter((T,j)=>j!==A);await this.updateManager.updateProperty(E,x,L),this.loadObject(E)})});let p=(m=this.root)==null?void 0:m.querySelector("[data-inspector-advanced]");p==null||p.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let d=(h=this.root)==null?void 0:h.querySelector("[data-convert-toggle]");d==null||d.addEventListener("click",()=>{var v;let b=(v=this.root)==null?void 0:v.querySelector("[data-convert-menu]");b==null||b.classList.toggle("hidden")});let u=(f=this.contentContainer)==null?void 0:f.querySelector("[data-inspector-add-component-btn]"),g=(y=this.contentContainer)==null?void 0:y.querySelector("[data-inspector-component-select]");u==null||u.addEventListener("click",async()=>{let b=g.value;b&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,b)})}getMotionDefaults(){var i,n,r,o;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"?(o=(r=t.motion)==null?void 0:r.defaults)!=null?o:{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 r=this.getMotionDefaults(),o={...(l=n.motion)!=null?l:r},s={...(c=o.intro)!=null?c:{}};o.enabled=!0,s.enabled=!0,s.type=t,s.duration=typeof s.duration=="number"&&s.duration>0?s.duration:500,s.delay=typeof s.delay=="number"?s.delay:0,s.easing=typeof s.easing=="string"?s.easing:"easeOut",o.intro=s,await this.updateManager.updateProperty(e,"motion",o),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var s,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),r={...(s=i.motion)!=null?s:n},o={...(l=r.intro)!=null?l:{}};r.enabled=!0,o.enabled=!0,r.intro=o,await this.updateManager.updateProperty(e,"motion",{...r,intro:{...o,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...r,intro:{...o,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 r=window.__editableConfig,o=r==null?void 0:r.schemas,s=null;o instanceof Map?s=o.get(t):o&&typeof o=="object"&&(s=o[t]),s||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(s==null?void 0:s.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var r,o;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((o=(r=i.render)==null?void 0:r.asset)==null?void 0:o.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=`
796
+ `}attachEventListeners(){var f,g,m,y;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Bs((b,v,w)=>{var E,x;this.updateManager.updateProperty(b,v,w),(x=(E=this.options)==null?void 0:E.onPropertyChange)==null||x.call(E,b,v,w)},300);e.forEach(b=>{let v=E=>{var P,I;let x=E.target,A=x.dataset.propertyPath,S=x.dataset.objectId;if(A&&S){let L=x.value;if(x.type==="checkbox")L=x.checked;else if(x.type==="number"){if(L=parseFloat(x.value),isNaN(L))return}else if(x.dataset.json==="true")try{L=JSON.parse(x.value)}catch{return}x.type==="text"||x.type==="range"||x.tagName==="TEXTAREA"?t(S,A,L):(this.updateManager.updateProperty(S,A,L),(I=(P=this.options)==null?void 0:P.onPropertyChange)==null||I.call(P,S,A,L))}},w=b.dataset.propertyPath;w==="logic.id"||w!=null&&w.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",w),b.addEventListener("change",async E=>{var O;let x=E.target,A=x.dataset.propertyPath,S=x.dataset.objectId,P=x.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",P),!A||!S)return;await this.updateManager.updateProperty(S,A,P),console.log("[Inspector v1.0.0] Logic ID updated");let I=window,L=(O=I==null?void 0:I.__HANDLER_LOGIC_META)==null?void 0:O[P],T=this.getDefaultPropsForLogic(P,L);console.log("[Inspector v1.0.0] New logic default props:",T);let j=A.replace(".id",".props");await this.updateManager.updateProperty(S,j,T),console.log("[Inspector v1.0.0] Logic props updated to:",T),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(S)})):(b.addEventListener("change",v),(b.tagName==="INPUT"||b.tagName==="TEXTAREA")&&b.addEventListener("input",v))}),this.contentContainer.querySelectorAll("[data-action]").forEach(b=>{b.addEventListener("click",v=>{let w=v.target,E=w.dataset.action,x=w.dataset.path,A=w.dataset.object;E&&x&&A&&this.quickActions.handleAction(E,A,x)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(b=>{b.addEventListener("click",v=>{var x,A;let w=v.target,E=w.dataset.sectionToggle||((x=w.closest("[data-section-toggle]"))==null?void 0:x.getAttribute("data-section-toggle"));if(E){let S=(A=this.contentContainer)==null?void 0:A.querySelector(`[data-section="${E}"]`);S==null||S.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(b=>{b.addEventListener("click",async v=>{let E=v.currentTarget.dataset.motionPreset;!E||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,E)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(b=>{b.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let s=this.contentContainer.querySelector("[data-motion-simple-toggle]");s==null||s.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(b=>{b.addEventListener("click",async v=>{let w=v.target,E=w.dataset.objectId,x=w.dataset.propertyPath;if(!E||!x)return;let A=window.getEditableObjectConfig,S=A==null?void 0:A(E);if(!S)return;let P=this.updateManager.getNestedProperty(S,x),I=Array.isArray(P)?[...P]:[];I.push({x:0,y:0}),await this.updateManager.updateProperty(E,x,I),this.loadObject(E)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(b=>{b.addEventListener("click",async v=>{let w=v.target,E=w.dataset.objectId,x=w.dataset.propertyPath,A=Number(w.dataset.index||"-1");if(!E||!x||A<0)return;let S=window.getEditableObjectConfig,P=S==null?void 0:S(E);if(!P)return;let I=this.updateManager.getNestedProperty(P,x);if(!Array.isArray(I))return;let L=I.filter((T,j)=>j!==A);await this.updateManager.updateProperty(E,x,L),this.loadObject(E)})});let p=(f=this.root)==null?void 0:f.querySelector("[data-inspector-advanced]");p==null||p.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let d=(g=this.root)==null?void 0:g.querySelector("[data-convert-toggle]");d==null||d.addEventListener("click",()=>{var v;let b=(v=this.root)==null?void 0:v.querySelector("[data-convert-menu]");b==null||b.classList.toggle("hidden")});let u=(m=this.contentContainer)==null?void 0:m.querySelector("[data-inspector-add-component-btn]"),h=(y=this.contentContainer)==null?void 0:y.querySelector("[data-inspector-component-select]");u==null||u.addEventListener("click",async()=>{let b=h.value;b&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,b)})}getMotionDefaults(){var i,n,r,o;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"?(o=(r=t.motion)==null?void 0:r.defaults)!=null?o:{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 r=this.getMotionDefaults(),o={...(l=n.motion)!=null?l:r},s={...(c=o.intro)!=null?c:{}};o.enabled=!0,s.enabled=!0,s.type=t,s.duration=typeof s.duration=="number"&&s.duration>0?s.duration:500,s.delay=typeof s.delay=="number"?s.delay:0,s.easing=typeof s.easing=="string"?s.easing:"easeOut",o.intro=s,await this.updateManager.updateProperty(e,"motion",o),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var s,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),r={...(s=i.motion)!=null?s:n},o={...(l=r.intro)!=null?l:{}};r.enabled=!0,o.enabled=!0,r.intro=o,await this.updateManager.updateProperty(e,"motion",{...r,intro:{...o,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...r,intro:{...o,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 r=window.__editableConfig,o=r==null?void 0:r.schemas,s=null;o instanceof Map?s=o.get(t):o&&typeof o=="object"&&(s=o[t]),s||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(s==null?void 0:s.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var r,o;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((o=(r=i.render)==null?void 0:r.asset)==null?void 0:o.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=`
797
797
  <div class="inspector-empty">
798
798
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
799
799
  <span class="inspector-empty-text">${e}</span>
@@ -803,7 +803,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
803
803
  <span class="inspector-empty-icon">\u{1F3AF}</span>
804
804
  <span class="inspector-empty-text">Select an object to inspect</span>
805
805
  </div>
806
- `)}};var Gr=qe(require("jszip"),1);function Dn(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function Mr(a){var n;let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Or(a){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=a})}async function Oi(a){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",a);let i=await fetch(a);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,a),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let r=await Dn(n),o=await Or(r),s=Mr(r);return console.log("[ImageUtils] Success resolution:",o==null?void 0:o.width,"x",o==null?void 0:o.height,"mime:",s.mimeType),{base64:s.base64,mimeType:s.mimeType,dataUrl:r,width:(e=o==null?void 0:o.width)!=null?e:0,height:(t=o==null?void 0:o.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Le(a){var e,t;try{let i=await Dn(a),n=await Or(i),r=Mr(i);return{base64:r.base64,mimeType:r.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function $n(a){return Dn(a).then(e=>e).catch(()=>null)}function Hn(a,e){var t;try{let[i,n]=a.split(","),r=i.match(/data:(.*?);base64/),o=(t=r==null?void 0:r[1])!=null?t:"image/png",s=atob(n),l=new Uint8Array(s.length);for(let c=0;c<s.length;c++)l[c]=s.charCodeAt(c);return new File([l],e,{type:o})}catch{return null}}async function Qe(a,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((d,u)=>{let g=new Image;g.onload=()=>d(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=a}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),a;n.drawImage(t,0,0);let r=n.getImageData(0,0,i.width,i.height),o=r.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(d=>({r:o[d.offset],g:o[d.offset+1],b:o[d.offset+2]})),c=0;for(let d=0;d<o.length;d+=4){let u=o[d],g=o[d+1],m=o[d+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&&(o[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(r,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),a}}function Ir(a,e){if(!a||!e)return"1:1";let t=a/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function ye(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function W(a){return typeof a=="string"?a:void 0}function jr(a){return a.toLowerCase().endsWith(".png")?a.slice(0,-4):a}function Us(a){var i,n,r;let e=(i=W(a.id))!=null?i:W(a.name);if(e)return e;let t=(n=W(a.file))!=null?n:W(a.asset);return t?jr((r=t.split("/").pop())!=null?r:t):void 0}function Gs(a,e,t){var i,n,r;if(typeof e=="string")return{id:a,file:e,role:t};if(ye(e)){let o=(i=W(e.file))!=null?i:W(e.asset);return o?{id:(n=W(e.id))!=null?n:a,file:o,role:(r=W(e.role))!=null?r:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function Nn(a,e){var t,i,n;if(!a)return[];if(Array.isArray(a)){let r=[];for(let o of a){if(typeof o=="string"){let s=jr((t=o.split("/").pop())!=null?t:o);r.push({id:s,file:o,role:e});continue}if(ye(o)){let s=Us(o),l=(i=W(o.file))!=null?i:W(o.asset);if(!s||!l)continue;r.push({id:s,file:l,role:(n=W(o.role))!=null?n:e,dataUrl:W(o.dataUrl),layout:o.layout})}}return r}if(ye(a)){let r=[];for(let[o,s]of Object.entries(a)){let l=Gs(o,s,e);l&&r.push(l)}return r}return[]}function qs(a){var e,t;return(t=(e=W(a.brand_name))!=null?e:W(a.brandName))!=null?t:W(a.name)}function Vs(a){if(ye(a.brand_dna)&&ye(a.brand_dna.colors))return a.brand_dna;if(ye(a.colors)){let e={colors:a.colors};return typeof a.style=="string"&&(e.style=a.style),ye(a.fonts)&&(e.fonts=a.fonts),e}}function Ws(a){var t;let e=new Map;for(let i of a){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Fn(a,e={}){var o,s,l;let t=a.filter(ye),i=(s=(o=t.map(qs).find(Boolean))!=null?o:e.defaultBrandName)!=null?s:"Imported Brand",n=(l=t.map(Vs).find(Boolean))!=null?l:{colors:{}},r=[];for(let c of t)"layers"in c&&r.push(...Nn(c.layers,"visual element")),"assets"in c&&r.push(...Nn(c.assets,"visual element")),ye(c.endgame)&&"assets"in c.endgame&&r.push(...Nn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:Ws(r)}}var Rr=require("@google/genai");async function Ii(a,e,t=[],i={}){var n,r,o,s,l,c,p;try{if(!(a!=null&&a.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let y=0;y<t.length;y++){let b=t[y];if(!b.base64||!b.mimeType)throw new Error(`Image ${y+1} is missing required data`);if(b.base64.length<1e3&&console.warn(`Image ${y+1} data appears very small, may be corrupted`),!b.mimeType.startsWith("image/"))throw new Error(`Image ${y+1} has invalid MIME type: ${b.mimeType}`)}let d=new Rr.GoogleGenAI({apiKey:a}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((y,b)=>{g.push({inlineData:{data:y.base64,mimeType:y.mimeType}}),console.log(`[Gemini] Added image ${b+1}: ${y.mimeType}, size: ${Math.round(y.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let m=await d.models.generateContent({model:u,contents:g}),h="",f=(o=(r=(n=m.candidates)==null?void 0:n[0])==null?void 0:r.content)==null?void 0:o.parts;if(f)for(let y of f)y.text&&(h+=y.text);if(!h.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${h.length}`),h}catch(d){throw console.error("[Gemini] API error:",d),(s=d.message)!=null&&s.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=d.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=d.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(p=d.message)!=null&&p.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):d}}var zr=require("@google/genai");async function et(a,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new zr.GoogleGenAI({apiKey:a}),r=[{text:e}];t.length>0&&t.forEach((s,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),r.push({inlineData:{mimeType:s.mimeType,data:s.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let o=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:r});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!o.candidates||!o.candidates[0]||!o.candidates[0].content||!o.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let s of o.candidates[0].content.parts)if(s.text)console.log(s.text);else if(s.inlineData){let l=s.inlineData.data,c=s.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 Dr(a){let e=a.brandAssets.map(r=>{let o=`- ${r.id}: ${r.role}`;return r.layout&&(o+=` [pos: ${r.layout.x.toFixed(0)},${r.layout.y.toFixed(0)}, size: ${r.layout.w.toFixed(0)}x${r.layout.h.toFixed(0)}, z: ${r.layout.z}, opacity: ${r.layout.opacity}]`),o}).join(`
806
+ `)}};var Gr=qe(require("jszip"),1);function Dn(a){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(a)})}function Mr(a){var n;let[e,t]=a.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Or(a){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=a})}async function Oi(a){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",a);let i=await fetch(a);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,a),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let r=await Dn(n),o=await Or(r),s=Mr(r);return console.log("[ImageUtils] Success resolution:",o==null?void 0:o.width,"x",o==null?void 0:o.height,"mime:",s.mimeType),{base64:s.base64,mimeType:s.mimeType,dataUrl:r,width:(e=o==null?void 0:o.width)!=null?e:0,height:(t=o==null?void 0:o.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Le(a){var e,t;try{let i=await Dn(a),n=await Or(i),r=Mr(i);return{base64:r.base64,mimeType:r.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function $n(a){return Dn(a).then(e=>e).catch(()=>null)}function Hn(a,e){var t;try{let[i,n]=a.split(","),r=i.match(/data:(.*?);base64/),o=(t=r==null?void 0:r[1])!=null?t:"image/png",s=atob(n),l=new Uint8Array(s.length);for(let c=0;c<s.length;c++)l[c]=s.charCodeAt(c);return new File([l],e,{type:o})}catch{return null}}async function Qe(a,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((d,u)=>{let h=new Image;h.onload=()=>d(h),h.onerror=()=>u(new Error("Failed to load image")),h.src=a}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),a;n.drawImage(t,0,0);let r=n.getImageData(0,0,i.width,i.height),o=r.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(d=>({r:o[d.offset],g:o[d.offset+1],b:o[d.offset+2]})),c=0;for(let d=0;d<o.length;d+=4){let u=o[d],h=o[d+1],f=o[d+2],g=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(h-m.g,2)+Math.pow(f-m.b,2))<e){g=!0;break}g&&(o[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(r,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),a}}function Ir(a,e){if(!a||!e)return"1:1";let t=a/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function ye(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function W(a){return typeof a=="string"?a:void 0}function jr(a){return a.toLowerCase().endsWith(".png")?a.slice(0,-4):a}function Us(a){var i,n,r;let e=(i=W(a.id))!=null?i:W(a.name);if(e)return e;let t=(n=W(a.file))!=null?n:W(a.asset);return t?jr((r=t.split("/").pop())!=null?r:t):void 0}function Gs(a,e,t){var i,n,r;if(typeof e=="string")return{id:a,file:e,role:t};if(ye(e)){let o=(i=W(e.file))!=null?i:W(e.asset);return o?{id:(n=W(e.id))!=null?n:a,file:o,role:(r=W(e.role))!=null?r:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function Nn(a,e){var t,i,n;if(!a)return[];if(Array.isArray(a)){let r=[];for(let o of a){if(typeof o=="string"){let s=jr((t=o.split("/").pop())!=null?t:o);r.push({id:s,file:o,role:e});continue}if(ye(o)){let s=Us(o),l=(i=W(o.file))!=null?i:W(o.asset);if(!s||!l)continue;r.push({id:s,file:l,role:(n=W(o.role))!=null?n:e,dataUrl:W(o.dataUrl),layout:o.layout})}}return r}if(ye(a)){let r=[];for(let[o,s]of Object.entries(a)){let l=Gs(o,s,e);l&&r.push(l)}return r}return[]}function qs(a){var e,t;return(t=(e=W(a.brand_name))!=null?e:W(a.brandName))!=null?t:W(a.name)}function Vs(a){if(ye(a.brand_dna)&&ye(a.brand_dna.colors))return a.brand_dna;if(ye(a.colors)){let e={colors:a.colors};return typeof a.style=="string"&&(e.style=a.style),ye(a.fonts)&&(e.fonts=a.fonts),e}}function Ws(a){var t;let e=new Map;for(let i of a){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Fn(a,e={}){var o,s,l;let t=a.filter(ye),i=(s=(o=t.map(qs).find(Boolean))!=null?o:e.defaultBrandName)!=null?s:"Imported Brand",n=(l=t.map(Vs).find(Boolean))!=null?l:{colors:{}},r=[];for(let c of t)"layers"in c&&r.push(...Nn(c.layers,"visual element")),"assets"in c&&r.push(...Nn(c.assets,"visual element")),ye(c.endgame)&&"assets"in c.endgame&&r.push(...Nn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:Ws(r)}}var Rr=require("@google/genai");async function Ii(a,e,t=[],i={}){var n,r,o,s,l,c,p;try{if(!(a!=null&&a.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let y=0;y<t.length;y++){let b=t[y];if(!b.base64||!b.mimeType)throw new Error(`Image ${y+1} is missing required data`);if(b.base64.length<1e3&&console.warn(`Image ${y+1} data appears very small, may be corrupted`),!b.mimeType.startsWith("image/"))throw new Error(`Image ${y+1} has invalid MIME type: ${b.mimeType}`)}let d=new Rr.GoogleGenAI({apiKey:a}),u="gemini-2.5-flash",h=[e];t.length>0&&t.forEach((y,b)=>{h.push({inlineData:{data:y.base64,mimeType:y.mimeType}}),console.log(`[Gemini] Added image ${b+1}: ${y.mimeType}, size: ${Math.round(y.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let f=await d.models.generateContent({model:u,contents:h}),g="",m=(o=(r=(n=f.candidates)==null?void 0:n[0])==null?void 0:r.content)==null?void 0:o.parts;if(m)for(let y of m)y.text&&(g+=y.text);if(!g.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${g.length}`),g}catch(d){throw console.error("[Gemini] API error:",d),(s=d.message)!=null&&s.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=d.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=d.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(p=d.message)!=null&&p.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):d}}var zr=require("@google/genai");async function et(a,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new zr.GoogleGenAI({apiKey:a}),r=[{text:e}];t.length>0&&t.forEach((s,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),r.push({inlineData:{mimeType:s.mimeType,data:s.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let o=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:r});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!o.candidates||!o.candidates[0]||!o.candidates[0].content||!o.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let s of o.candidates[0].content.parts)if(s.text)console.log(s.text);else if(s.inlineData){let l=s.inlineData.data,c=s.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 Dr(a){let e=a.brandAssets.map(r=>{let o=`- ${r.id}: ${r.role}`;return r.layout&&(o+=` [pos: ${r.layout.x.toFixed(0)},${r.layout.y.toFixed(0)}, size: ${r.layout.w.toFixed(0)}x${r.layout.h.toFixed(0)}, z: ${r.layout.z}, opacity: ${r.layout.opacity}]`),o}).join(`
807
807
  `)||"None",t=a.brandDna?`Colors: ${JSON.stringify(a.brandDna.colors)}, Style: ${a.brandDna.style||"not specified"}`:"Not provided",i=a.gameObjects.map(r=>typeof r=="string"?`- id: ${r}`:`- id: ${r.id}${r.category?`, category: ${r.category}`:""}${r.type?`, type: ${r.type}`:""}`).join(`
808
808
  `),n="";if(a.brandConfig){let r=a.brandConfig,o=[];r.splash&&o.push(`SPLASH: title="${r.splash.title||""}", subtitle="${r.splash.subtitle||""}", button="${r.splash.button_label||""}"`),r.endgame&&o.push(`ENDGAME: title="${r.endgame.title||""}", subtitle="${r.endgame.subtitle||""}", cta="${r.endgame.cta_label||""}"`),r.tutorial&&o.push(`TUTORIAL: text="${r.tutorial.label_text||""}", helper="${r.tutorial.helper_text||""}"`),o.length>0&&(n=`
809
809
  BRAND CONTENT:
@@ -1004,7 +1004,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1004
1004
  </div>
1005
1005
  <div class="panel-resize-handle" data-panel-resize></div>
1006
1006
  </div>
1007
- `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,r,o,s,l,c,p,d,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()}),(r=this.root.querySelector("[data-vision-upload-zip]"))==null||r.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||f.click()}),(o=this.root.querySelector("[data-vision-zip-input]"))==null||o.addEventListener("change",h=>{this.handleZipUpload(h)}),(s=this.root.querySelector("[data-vision-manifest-input]"))==null||s.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)}),(p=this.root.querySelector("[data-vision-upload-flat]"))==null||p.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||f.click()}),(d=this.root.querySelector("[data-vision-flat-input]"))==null||d.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(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 y=f.closest("[data-mapping-item]"),b=y==null?void 0:y.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",h=>{let f=h.target;if(!f||!this.mappingResult)return;let y=f.closest("[data-mapping-item]"),b=y==null?void 0:y.dataset.mappingItem;if(!b)return;let v=this.mappingResult.mappings.find(w=>w.game_object===b);v&&(f.matches("[data-mapping-action]")&&(v.action=String(f.value||"KEEP"),v.status="Edited",this.renderMappings()),f.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(f.value||""),v.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 y=f.closest("[data-mapping-item]"),b=y==null?void 0:y.dataset.mappingItem;if(!b)return;let v=this.mappingResult.mappings.find(w=>w.game_object===b);v&&(v.generation_prompt=String(f.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(r){console.error("[BrandVision] ZIP processing failed:",r),this.setStatus("zip",`Error: ${r instanceof Error?r.message:"Unknown error"}`)}}}async processZipFile(e){var o,s;let t=await Gr.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let p=l.toLowerCase();p.endsWith(".json")?i.push({name:l,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((o=t.file(l.name))==null?void 0:o.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let r=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),p=new Blob([c],{type:"image/png"}),d=l.name.split("/").pop()||l.name;console.log(`Processing ${d}, uint8array length: ${c.length}, blob size: ${p.size}`);let u;try{u=await this.blobToDataUrl(p)}catch(f){console.warn(`FileReader failed for ${d}, 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 ${d}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(d.replace(".png",""));console.log(`Saving ${d} to category: ${g}`);let h=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:g,filename:d,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${d}:`,h),h.success){console.log(`\u2705 Saved PNG to library: ${d} (${g}) at ${h.path}`);let f=new File([p],d,{type:"image/png"});r.set(d,f)}else console.warn(`\u274C Failed to save ${d}:`,h.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=r;try{this.normalizedManifest=Fn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[p,d]of r){let u=await this.fileToDataUrl(d);l.push({id:p.replace(".png",""),filename:p,dataUrl:u,category:this.inferAssetCategory(p.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
1007
+ `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,r,o,s,l,c,p,d,u,h,f;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let g="/dashboard";window.location.pathname!==g&&(window.location.href=g)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(g=>{g.addEventListener("click",()=>{let m=g.dataset.visionTab;this.switchTab(m)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",g=>{let m=g.target.value;this.switchUploadMethod(m)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var g,m;(m=(g=this.root)==null?void 0:g.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(r=this.root.querySelector("[data-vision-upload-zip]"))==null||r.addEventListener("click",()=>{var g,m;(m=(g=this.root)==null?void 0:g.querySelector("[data-vision-zip-input]"))==null||m.click()}),(o=this.root.querySelector("[data-vision-zip-input]"))==null||o.addEventListener("change",g=>{this.handleZipUpload(g)}),(s=this.root.querySelector("[data-vision-manifest-input]"))==null||s.addEventListener("change",g=>{this.handleManifestUpload(g)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var g,m;(m=(g=this.root)==null?void 0:g.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",g=>{this.handleAssetsUpload(g)}),(p=this.root.querySelector("[data-vision-upload-flat]"))==null||p.addEventListener("click",()=>{var g,m;(m=(g=this.root)==null?void 0:g.querySelector("[data-vision-flat-input]"))==null||m.click()}),(d=this.root.querySelector("[data-vision-flat-input]"))==null||d.addEventListener("change",g=>{this.handleFlatDesignUpload(g)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(h=this.root.querySelector("[data-vision-generate-all]"))==null||h.addEventListener("click",()=>{this.generateAllMissing()}),(f=this.root.querySelector("[data-vision-apply-all]"))==null||f.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",g=>{let m=g.target;if(!m)return;let y=m.closest("[data-mapping-item]"),b=y==null?void 0:y.dataset.mappingItem;b&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(b),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(b),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(b),m.closest("[data-mapping-generate-one]")&&this.generateOne(b),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",g=>{let m=g.target;if(!m||!this.mappingResult)return;let y=m.closest("[data-mapping-item]"),b=y==null?void 0:y.dataset.mappingItem;if(!b)return;let v=this.mappingResult.mappings.find(w=>w.game_object===b);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",g=>{let m=g.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let y=m.closest("[data-mapping-item]"),b=y==null?void 0:y.dataset.mappingItem;if(!b)return;let v=this.mappingResult.mappings.find(w=>w.game_object===b);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(r){console.error("[BrandVision] ZIP processing failed:",r),this.setStatus("zip",`Error: ${r instanceof Error?r.message:"Unknown error"}`)}}}async processZipFile(e){var o,s;let t=await Gr.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let p=l.toLowerCase();p.endsWith(".json")?i.push({name:l,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((o=t.file(l.name))==null?void 0:o.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let r=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),p=new Blob([c],{type:"image/png"}),d=l.name.split("/").pop()||l.name;console.log(`Processing ${d}, uint8array length: ${c.length}, blob size: ${p.size}`);let u;try{u=await this.blobToDataUrl(p)}catch(m){console.warn(`FileReader failed for ${d}, using fallback:`,m),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${d}:`,u.substring(0,100));continue}let h=this.inferAssetCategory(d.replace(".png",""));console.log(`Saving ${d} to category: ${h}`);let g=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:h,filename:d,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${d}:`,g),g.success){console.log(`\u2705 Saved PNG to library: ${d} (${h}) at ${g.path}`);let m=new File([p],d,{type:"image/png"});r.set(d,m)}else console.warn(`\u274C Failed to save ${d}:`,g.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=r;try{this.normalizedManifest=Fn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[p,d]of r){let u=await this.fileToDataUrl(d);l.push({id:p.replace(".png",""),filename:p,dataUrl:u,category:this.inferAssetCategory(p.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
1008
1008
  \u{1F3F7}\uFE0F Brand: ${((s=this.normalizedManifest)==null?void 0:s.brand_name)||"Imported Brand"}`),this.addAssetsToRegistry(l),this.refreshLibrary()}catch(l){console.error("[BrandVision] Failed to normalize ZIP manifest:",l),this.normalizedManifest=null,this.setStatus("zip","\u274C Failed to normalize manifest")}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let r=n.result;console.log("FileReader result type:",typeof r,"length:",r.length),console.log("Data URL prefix:",r.substring(0,30)),t(r)},n.onerror=r=>{console.error("FileReader error:",r),i(r)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let r of e){let o=r.category||"misc";n[o]||(n[o]=[]),i.libraryAssets[o]||(i.libraryAssets[o]=[]),i.libraryAssets[o].some(l=>l.filename===r.filename)||(i.libraryAssets[o].unshift({filename:r.filename,displayName:r.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${r.filename} to registry category ${o}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var r;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let o of Array.from(i))try{let s=await o.text(),l=JSON.parse(s);this.uploadedJsons.set(o.name,l),l.layers?n+=`\u2705 Layers: ${o.name}
1009
1009
  `:l.brand_dna||l.colors?n+=`\u2705 Brand: ${o.name}
1010
1010
  `:n+=`\u2705 Loaded: ${o.name}
@@ -1022,7 +1022,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1022
1022
  </div>
1023
1023
  `:"";e.innerHTML=`
1024
1024
  ${o}
1025
- ${this.mappingResult.mappings.map(l=>{var y;let c=i[l.game_object]||"",p=l.brand_asset||"",d=(y=t==null?void 0:t.assets)==null?void 0:y.find(b=>b.id===p),u=(d==null?void 0:d.dataUrl)||"",g=l.output_dataUrl||"",m=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",h=!!m,f=`
1025
+ ${this.mappingResult.mappings.map(l=>{var y;let c=i[l.game_object]||"",p=l.brand_asset||"",d=(y=t==null?void 0:t.assets)==null?void 0:y.find(b=>b.id===p),u=(d==null?void 0:d.dataUrl)||"",h=l.output_dataUrl||"",f=l.action==="GENERATE"?h:l.action==="APPLY"?u:"",g=!!f,m=`
1026
1026
  <select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
1027
1027
  <option value="">Select brand asset\u2026</option>
1028
1028
  ${r.replace(`value="${p}"`,`value="${p}" selected`)}
@@ -1040,7 +1040,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1040
1040
 
1041
1041
  ${l.action==="APPLY"?`
1042
1042
  <div class="inspector-row" style="margin-top:8px;">
1043
- ${f}
1043
+ ${m}
1044
1044
  <button class="inspector-btn inspector-btn-sm" type="button" data-mapping-edit-one>Edit/Crop\u2026</button>
1045
1045
  </div>
1046
1046
  `:""}
@@ -1063,7 +1063,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1063
1063
  </div>
1064
1064
  <div class="vision-mapping-preview">
1065
1065
  <div class="inspector-text-sm" style="opacity:0.8;">Preview</div>
1066
- ${h?`<img src="${m}">`:'<div class="inspector-text-sm" style="opacity:0.6;">None</div>'}
1066
+ ${g?`<img src="${f}">`:'<div class="inspector-text-sm" style="opacity:0.6;">None</div>'}
1067
1067
  </div>
1068
1068
  </div>
1069
1069
 
@@ -1143,7 +1143,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1143
1143
  <path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
1144
1144
  <path d="M5 14v4h14v-4h2v6H3v-6h2z" />
1145
1145
  </svg>
1146
- `;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var m;let g=(m=d.files)==null?void 0:m[0];g&&this.handleAssetUpload(g,s,i)}),p.addEventListener("click",()=>d.click()),l.appendChild(c),l.appendChild(p),l.appendChild(d),r.appendChild(o),r.appendChild(s),r.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(r)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Xs.forEach(t=>{var l,c,p;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let r=document.createElement("span");r.textContent=t.replace(/_/g," ");let o=document.createElement("input");o.type="color",o.value=i,o.dataset.colorKey=t;let s=document.createElement("input");s.type="text",s.value=i,s.className="customize-color-text",s.dataset.colorTextKey=t,o.addEventListener("input",()=>{s.value=o.value}),s.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(s.value)&&(o.value=s.value)}),n.appendChild(r),n.appendChild(o),n.appendChild(s),(p=this.colorsContainer)==null||p.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Zs.forEach(t=>{var o,s;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=e==null?void 0:e[t])!=null?o:t,r.className="customize-input",r.dataset.fontKey=t,i.appendChild(n),i.appendChild(r),(s=this.fontsContainer)==null||s.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",Js.forEach(t=>{var o,s;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.readUiValue(e,t))!=null?o:"",r.className="customize-input",r.dataset.textKey=t,i.appendChild(n),i.appendChild(r),(s=this.textsContainer)==null||s.appendChild(i)}),Vr.forEach(({key:t,objectId:i})=>{var s,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=t;let o=document.createElement("input");o.type="text",o.value=(s=this.getObjectTextValue(i))!=null?s:"",o.className="customize-input",o.dataset.objectTextKey=t,n.appendChild(r),n.appendChild(o),(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 s,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=i.replace("_"," ");let o=document.createElement("input");o.type=i.includes("volume")?"number":"text",o.min="0",o.max="1",o.step="0.1",o.value=String((s=e==null?void 0:e[i])!=null?s:""),o.className="customize-input",o.dataset.audioKey=i,i.includes("file")&&(o.placeholder="audio file path"),n.appendChild(r),n.appendChild(o),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),r=e;for(let o of n){if(r==null)return null;r=r[o]}return typeof r=="string"?r:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,r;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(r=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?r:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let r=t.split("."),o=n;for(let s of r){if(o==null)return null;o=o[s]}return typeof o=="string"?o: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(s=>{let l=s;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(s=>{let l=s,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(s=>{let l=s,c=l.dataset.fontKey;c&&(n[c]=l.value)});let r={};this.root.querySelectorAll("[data-text-key]").forEach(s=>{let l=s,c=l.dataset.textKey;c&&(r[c]=l.value)});let o={};this.root.querySelectorAll("[data-audio-key]").forEach(s=>{let l=s,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let p=parseFloat(l.value);o[c]=isNaN(p)?0:p}else o[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(s=>{let l=s,c=l.dataset.objectTextKey;if(!c)return;let p=Vr.find(d=>d.key===c);p&&this.applyObjectPropertyValue(p.objectId,p.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:r,fonts:n,audio:o}},{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 Oi(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,r,o;let t=(e==null?void 0:e.trim())||"";if(!t){let s=this.getSelectedAssetInput();t=(r=(n=s==null?void 0:s.value)==null?void 0:n.trim())!=null?r:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(o=i==null?void 0:i.dataUrl)!=null?o:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let r=document.createElement("img");r.className="ai-gallery-thumb",r.alt=t;let o=this.resolveAssetUrls(i);o[0]&&(r.src=o[0]);let s=document.createElement("span");s.className="ai-gallery-label",s.textContent=t,n.appendChild(r),n.appendChild(s),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 o,s;let i=t,n=i.dataset.assetKey,r=(s=(o=i.value)==null?void 0:o.trim())!=null?s:"";!n||!r||this.isAiGalleryImage(r)&&e.push({key:n,value:r})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var s,l,c,p,d,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=`
1146
+ `;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var f;let h=(f=d.files)==null?void 0:f[0];h&&this.handleAssetUpload(h,s,i)}),p.addEventListener("click",()=>d.click()),l.appendChild(c),l.appendChild(p),l.appendChild(d),r.appendChild(o),r.appendChild(s),r.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(r)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Xs.forEach(t=>{var l,c,p;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let r=document.createElement("span");r.textContent=t.replace(/_/g," ");let o=document.createElement("input");o.type="color",o.value=i,o.dataset.colorKey=t;let s=document.createElement("input");s.type="text",s.value=i,s.className="customize-color-text",s.dataset.colorTextKey=t,o.addEventListener("input",()=>{s.value=o.value}),s.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(s.value)&&(o.value=s.value)}),n.appendChild(r),n.appendChild(o),n.appendChild(s),(p=this.colorsContainer)==null||p.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Zs.forEach(t=>{var o,s;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=e==null?void 0:e[t])!=null?o:t,r.className="customize-input",r.dataset.fontKey=t,i.appendChild(n),i.appendChild(r),(s=this.fontsContainer)==null||s.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",Js.forEach(t=>{var o,s;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.readUiValue(e,t))!=null?o:"",r.className="customize-input",r.dataset.textKey=t,i.appendChild(n),i.appendChild(r),(s=this.textsContainer)==null||s.appendChild(i)}),Vr.forEach(({key:t,objectId:i})=>{var s,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=t;let o=document.createElement("input");o.type="text",o.value=(s=this.getObjectTextValue(i))!=null?s:"",o.className="customize-input",o.dataset.objectTextKey=t,n.appendChild(r),n.appendChild(o),(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 s,l;let n=document.createElement("div");n.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=i.replace("_"," ");let o=document.createElement("input");o.type=i.includes("volume")?"number":"text",o.min="0",o.max="1",o.step="0.1",o.value=String((s=e==null?void 0:e[i])!=null?s:""),o.className="customize-input",o.dataset.audioKey=i,i.includes("file")&&(o.placeholder="audio file path"),n.appendChild(r),n.appendChild(o),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),r=e;for(let o of n){if(r==null)return null;r=r[o]}return typeof r=="string"?r:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,r;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(r=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?r:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let r=t.split("."),o=n;for(let s of r){if(o==null)return null;o=o[s]}return typeof o=="string"?o: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(s=>{let l=s;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(s=>{let l=s,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(s=>{let l=s,c=l.dataset.fontKey;c&&(n[c]=l.value)});let r={};this.root.querySelectorAll("[data-text-key]").forEach(s=>{let l=s,c=l.dataset.textKey;c&&(r[c]=l.value)});let o={};this.root.querySelectorAll("[data-audio-key]").forEach(s=>{let l=s,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let p=parseFloat(l.value);o[c]=isNaN(p)?0:p}else o[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(s=>{let l=s,c=l.dataset.objectTextKey;if(!c)return;let p=Vr.find(d=>d.key===c);p&&this.applyObjectPropertyValue(p.objectId,p.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:r,fonts:n,audio:o}},{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 Oi(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,r,o;let t=(e==null?void 0:e.trim())||"";if(!t){let s=this.getSelectedAssetInput();t=(r=(n=s==null?void 0:s.value)==null?void 0:n.trim())!=null?r:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(o=i==null?void 0:i.dataUrl)!=null?o:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let r=document.createElement("img");r.className="ai-gallery-thumb",r.alt=t;let o=this.resolveAssetUrls(i);o[0]&&(r.src=o[0]);let s=document.createElement("span");s.className="ai-gallery-label",s.textContent=t,n.appendChild(r),n.appendChild(s),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 o,s;let i=t,n=i.dataset.assetKey,r=(s=(o=i.value)==null?void 0:o.trim())!=null?s:"";!n||!r||this.isAiGalleryImage(r)&&e.push({key:n,value:r})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var s,l,c,p,d,u,h,f,g,m;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
1147
1147
  <div class="ai-modal-card">
1148
1148
  <div class="ai-modal-header">
1149
1149
  <div>
@@ -1214,7 +1214,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1214
1214
  </div>
1215
1215
  </div>
1216
1216
  </div>
1217
- `;let r=n.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",y=>{y.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]"),(s=this.aiRemoveBgToggle)==null||s.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let o=n.querySelector("[data-ai-ref-button]");o==null||o.addEventListener("click",()=>{var y;return(y=this.aiReferenceInput)==null?void 0:y.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var b,v;let y=(v=(b=this.aiStrengthInput)==null?void 0:b.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=y)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var b,v;let y=(v=(b=this.aiBgToleranceInput)==null?void 0:b.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=y),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var b,v,w;let y=(w=(v=(b=this.aiReferenceInput)==null?void 0:b.files)==null?void 0:v[0])!=null?w:null;this.aiReferenceFile=y,this.aiReferenceName&&(this.aiReferenceName.textContent=y?`${y.name} (loaded)`:"Optional"),y&&this.setAiStatus(`Reference attached: ${y.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 p,d,u,g,m,h,f,y,b,v,w,E,x,A,S,P,I,L,T,j;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(m=(g=this.aiModelSelect)==null?void 0:g.value)!=null?m:"gemini-2.5-flash-image",i=(y=(f=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:f.trim())!=null?y:"",n=(v=(b=this.aiRemoveBgToggle)==null?void 0:b.checked)!=null?v:!1,r=n,o=n,s=Number((E=(w=this.aiStrengthInput)==null?void 0:w.value)!=null?E:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((x=l==null?void 0:l.value)==null?void 0:x.trim())||((A=this.aiBaseValue)==null?void 0:A.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let O=null,D=(S=this.getSelectedAssetKey())!=null?S:"unknown",R=(P=this.aiUseOutputToggle)!=null&&P.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((I=this.aiUseOutputToggle)!=null&&I.checked&&this.aiOutputDataUrl){let ne=Hn(this.aiOutputDataUrl,"ai-output.png");if(ne){let ae=await Le(ne);ae&&(O={input:{base64:ae.base64,mimeType:ae.mimeType},dataUrl:ae.dataUrl,width:ae.width,height:ae.height})}}if(O||(O=await this.getImageDataFromAsset(c)),!O){this.setAiStatus("Unable to load the base image.");return}let $=[O.input],C=!1;if(this.aiReferenceFile){let ne=await Le(this.aiReferenceFile);ne?($.push({base64:ne.base64,mimeType:ne.mimeType}),C=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let _=qr(i,{includeReference:C,includeMagenta:r,changeLevel:s}),M=(T=(L=this.aiReferenceFile)==null?void 0:L.name)!=null?T:"none";console.info("[AI] Final prompt:",_),console.info("[AI] Image sources:",{assetKey:D,base:R,reference:M});let q=Ir(O.width,O.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let V=await et(e,_,$,{aspectRatio:q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",V==null?void 0:V.length),this.aiRawOutputDataUrl=V,await this.refreshAiOutputFromRaw()}catch(O){console.error("[CustomizePanel] AI Generate Error:",O),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((j=this.aiStatusEl)==null?void 0:j.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,r,o,s;if(!this.aiRawOutputDataUrl)return;let e=(r=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?r:!1,t=Number((s=(o=this.aiBgToleranceInput)==null?void 0:o.value)!=null?s:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Qe(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let r=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),o=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(r&&o)console.log("[CustomizePanel] Applying AI output directly to object:",r,o),this.applyObjectPropertyValue(r,o,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var r,o,s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),p(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(y){console.warn("[CustomizePanel] Setup-library endpoint not available:",y)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),m=((o=this.aiContext)==null?void 0:o.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),h=this.getSelectedAssetInput();if(h&&(h.value=c.path,this.handleAssetValueChange((s=h.dataset.assetKey)!=null?s:"",h)),g&&m){console.log("[CustomizePanel] Applying saved asset to object:",g,m);let y=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(m)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof y=="function"&&b){let v=this.getFilenameFromPath(c.path);await y(g,v,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 o;let t=(o=this.aiContext)==null?void 0:o.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let s=n();if(s!=null&&s.slots){let l=s.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let r=i.toLowerCase();return r.includes("background")?"backgrounds":r.includes("character")?"characters":r.includes("key")?"collectedkeys":r.includes("draggable")?"draggables":r.includes("environment")||r.includes("env")||r.includes("hand")||r.includes("prop")||r.includes("item")||r.includes("decor")||r.includes("object")?"environment":r.includes("machine")?"machines":r.includes("tutorial")?"tutorial":r.includes("ui")||r.includes("button")||r.includes("label")||r.includes("icon")||r.includes("logo")||r.includes("cta")||r.includes("menu")||r.includes("overlay")?"ui":r.includes("effect")||r.includes("confetti")||r.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!n)return null;let r=n.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(s=e==null?void 0:e.value)!=null?s:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=Hn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let r=await this.showManualCropModal(n,i,t);if(!r)return;let o=await $n(r);o&&this.setAiOutput(o)}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,r=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(n);if(p){let d=await this.showManualCropModal(e,p,n);if(!d)return;r=d}}let o=await $n(r);if(!o){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:o,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(y){console.warn("[CustomizePanel] Setup-library not available:",y)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=d.path,this.handleAssetValueChange(i,t);let m=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(m&&h){let y=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof y=="function"&&b){let v=this.getFilenameFromPath(d.path);await y(m,v,c)}else this.applyObjectPropertyValue(m,h,d.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:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let r=this.resolveAssetUrls(t);if(r.length===0)return;let o=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,r,o)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
1217
+ `;let r=n.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",y=>{y.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]"),(s=this.aiRemoveBgToggle)==null||s.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let o=n.querySelector("[data-ai-ref-button]");o==null||o.addEventListener("click",()=>{var y;return(y=this.aiReferenceInput)==null?void 0:y.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var b,v;let y=(v=(b=this.aiStrengthInput)==null?void 0:b.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=y)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var b,v;let y=(v=(b=this.aiBgToleranceInput)==null?void 0:b.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=y),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var b,v,w;let y=(w=(v=(b=this.aiReferenceInput)==null?void 0:b.files)==null?void 0:v[0])!=null?w:null;this.aiReferenceFile=y,this.aiReferenceName&&(this.aiReferenceName.textContent=y?`${y.name} (loaded)`:"Optional"),y&&this.setAiStatus(`Reference attached: ${y.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(h=this.aiApplyBtn)==null||h.addEventListener("click",()=>this.handleAiApply()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(g=this.aiCropBtn)==null||g.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var p,d,u,h,f,g,m,y,b,v,w,E,x,A,S,P,I,L,T,j;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(f=(h=this.aiModelSelect)==null?void 0:h.value)!=null?f:"gemini-2.5-flash-image",i=(y=(m=(g=this.aiPromptInput)==null?void 0:g.value)==null?void 0:m.trim())!=null?y:"",n=(v=(b=this.aiRemoveBgToggle)==null?void 0:b.checked)!=null?v:!1,r=n,o=n,s=Number((E=(w=this.aiStrengthInput)==null?void 0:w.value)!=null?E:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((x=l==null?void 0:l.value)==null?void 0:x.trim())||((A=this.aiBaseValue)==null?void 0:A.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let O=null,D=(S=this.getSelectedAssetKey())!=null?S:"unknown",R=(P=this.aiUseOutputToggle)!=null&&P.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((I=this.aiUseOutputToggle)!=null&&I.checked&&this.aiOutputDataUrl){let ae=Hn(this.aiOutputDataUrl,"ai-output.png");if(ae){let re=await Le(ae);re&&(O={input:{base64:re.base64,mimeType:re.mimeType},dataUrl:re.dataUrl,width:re.width,height:re.height})}}if(O||(O=await this.getImageDataFromAsset(c)),!O){this.setAiStatus("Unable to load the base image.");return}let $=[O.input],C=!1;if(this.aiReferenceFile){let ae=await Le(this.aiReferenceFile);ae?($.push({base64:ae.base64,mimeType:ae.mimeType}),C=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let _=qr(i,{includeReference:C,includeMagenta:r,changeLevel:s}),M=(T=(L=this.aiReferenceFile)==null?void 0:L.name)!=null?T:"none";console.info("[AI] Final prompt:",_),console.info("[AI] Image sources:",{assetKey:D,base:R,reference:M});let q=Ir(O.width,O.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let V=await et(e,_,$,{aspectRatio:q,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",V==null?void 0:V.length),this.aiRawOutputDataUrl=V,await this.refreshAiOutputFromRaw()}catch(O){console.error("[CustomizePanel] AI Generate Error:",O),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((j=this.aiStatusEl)==null?void 0:j.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,r,o,s;if(!this.aiRawOutputDataUrl)return;let e=(r=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?r:!1,t=Number((s=(o=this.aiBgToleranceInput)==null?void 0:o.value)!=null?s:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await Qe(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let r=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),o=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(r&&o)console.log("[CustomizePanel] Applying AI output directly to object:",r,o),this.applyObjectPropertyValue(r,o,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var r,o,s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),p(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(y){console.warn("[CustomizePanel] Setup-library endpoint not available:",y)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let h=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),f=((o=this.aiContext)==null?void 0:o.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),g=this.getSelectedAssetInput();if(g&&(g.value=c.path,this.handleAssetValueChange((s=g.dataset.assetKey)!=null?s:"",g)),h&&f){console.log("[CustomizePanel] Applying saved asset to object:",h,f);let y=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof y=="function"&&b){let v=this.getFilenameFromPath(c.path);await y(h,v,n)}else this.applyObjectPropertyValue(h,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&h&&(console.log("[CustomizePanel] Highlighting slot in library:",h,n),setTimeout(()=>{m(h,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 o;let t=(o=this.aiContext)==null?void 0:o.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let s=n();if(s!=null&&s.slots){let l=s.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let r=i.toLowerCase();return r.includes("background")?"backgrounds":r.includes("character")?"characters":r.includes("key")?"collectedkeys":r.includes("draggable")?"draggables":r.includes("environment")||r.includes("env")||r.includes("hand")||r.includes("prop")||r.includes("item")||r.includes("decor")||r.includes("object")?"environment":r.includes("machine")?"machines":r.includes("tutorial")?"tutorial":r.includes("ui")||r.includes("button")||r.includes("label")||r.includes("icon")||r.includes("logo")||r.includes("cta")||r.includes("menu")||r.includes("overlay")?"ui":r.includes("effect")||r.includes("confetti")||r.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!n)return null;let r=n.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(s=e==null?void 0:e.value)!=null?s:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=Hn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let r=await this.showManualCropModal(n,i,t);if(!r)return;let o=await $n(r);o&&this.setAiOutput(o)}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,r=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(n);if(p){let d=await this.showManualCropModal(e,p,n);if(!d)return;r=d}}let o=await $n(r);if(!o){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:o,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(y){console.warn("[CustomizePanel] Setup-library not available:",y)}let h=window.refreshAssetLibrary;typeof h=="function"&&await h(),t.value=d.path,this.handleAssetValueChange(i,t);let f=this.inferObjectIdFromAssetKey(i),g=this.inferPathFromAssetKey(i);if(f&&g){let y=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(g)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof y=="function"&&b){let v=this.getFilenameFromPath(d.path);await y(f,v,c)}else this.applyObjectPropertyValue(f,g,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&f&&setTimeout(()=>{m(f,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let r=this.resolveAssetUrls(t);if(r.length===0)return;let o=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,r,o)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
1218
1218
  <div class="asset-preview-card">
1219
1219
  <div class="asset-preview-header">
1220
1220
  <div class="asset-preview-title">${e}</div>
@@ -1230,7 +1230,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1230
1230
  <img class="asset-preview-ai-image" alt="AI output preview">
1231
1231
  </div>
1232
1232
  </div>
1233
- `;let o=r.querySelector(".asset-preview-body"),s=r.querySelector(".asset-preview-close"),l=r.querySelector(".asset-preview-change"),c=r.querySelector(".asset-preview-ai"),p=r.querySelector("[data-asset-ai-preview]");if(s==null||s.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),r.addEventListener("click",d=>{d.target===r&&this.closePreviewModal()}),o)if(n==="image"){let d=document.createElement("img");this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="audio"){let d=document.createElement("audio");d.controls=!0,this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="json"){let d=document.createElement("pre");this.fetchWithFallback(i).then(u=>{d.textContent=u!=null?u:"Unable to load JSON."}),o.appendChild(d)}else{let d=document.createElement("a");d.href=i[0],d.target="_blank",d.rel="noreferrer",d.textContent="Open asset",o.appendChild(d)}document.body.appendChild(r),this.previewModal=r,this.updateAiModalPreview(p,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,r=window.applyEditableObjectConfig;if(typeof n!="function"||typeof r!="function")return;let o=n(e);if(!o)return;let s=JSON.parse(JSON.stringify(o)),l=t.split("."),c=s;for(let p=0;p<l.length-1;p++){let d=l[p];c[d]=c[d]||{},c=c[d]}c[l[l.length-1]]=i,r(e,s)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var r;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(r=this.activePreviewFileInput)!=null?r:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=r=>{var u,g;r.preventDefault();let o=r.clientX,s=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,p=m=>{let h=m.clientX-o,f=Math.min(c,Math.max(l,s+h));this.root&&(this.root.style.width=`${f}px`)},d=()=>{var h,f;window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d);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",p),window.addEventListener("pointerup",d)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,r=URL.createObjectURL(e),o=await this.loadImage(r);try{URL.revokeObjectURL(r)}catch{}if(!(o!=null&&o.naturalWidth)||!(o!=null&&o.naturalHeight))return null;let s=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let p=Math.min(860,window.innerWidth-60),m=Math.max(220,Math.floor((p-32-16)/2)),h=Math.min(520,window.innerHeight-240),f=m,y=f/n;y>h&&(y=h,f=y*n),c.innerHTML=`
1233
+ `;let o=r.querySelector(".asset-preview-body"),s=r.querySelector(".asset-preview-close"),l=r.querySelector(".asset-preview-change"),c=r.querySelector(".asset-preview-ai"),p=r.querySelector("[data-asset-ai-preview]");if(s==null||s.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),r.addEventListener("click",d=>{d.target===r&&this.closePreviewModal()}),o)if(n==="image"){let d=document.createElement("img");this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="audio"){let d=document.createElement("audio");d.controls=!0,this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="json"){let d=document.createElement("pre");this.fetchWithFallback(i).then(u=>{d.textContent=u!=null?u:"Unable to load JSON."}),o.appendChild(d)}else{let d=document.createElement("a");d.href=i[0],d.target="_blank",d.rel="noreferrer",d.textContent="Open asset",o.appendChild(d)}document.body.appendChild(r),this.previewModal=r,this.updateAiModalPreview(p,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,r=window.applyEditableObjectConfig;if(typeof n!="function"||typeof r!="function")return;let o=n(e);if(!o)return;let s=JSON.parse(JSON.stringify(o)),l=t.split("."),c=s;for(let p=0;p<l.length-1;p++){let d=l[p];c[d]=c[d]||{},c=c[d]}c[l[l.length-1]]=i,r(e,s)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var r;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(r=this.activePreviewFileInput)!=null?r:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=r=>{var u,h;r.preventDefault();let o=r.clientX,s=(h=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?h:0,l=260,c=620,p=f=>{let g=f.clientX-o,m=Math.min(c,Math.max(l,s+g));this.root&&(this.root.style.width=`${m}px`)},d=()=>{var g,m;window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d);let f=(m=(g=this.root)==null?void 0:g.getBoundingClientRect().width)!=null?m:0;f>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(f)))};window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,r=URL.createObjectURL(e),o=await this.loadImage(r);try{URL.revokeObjectURL(r)}catch{}if(!(o!=null&&o.naturalWidth)||!(o!=null&&o.naturalHeight))return null;let s=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let p=Math.min(860,window.innerWidth-60),f=Math.max(220,Math.floor((p-32-16)/2)),g=Math.min(520,window.innerHeight-240),m=f,y=m/n;y>g&&(y=g,m=y*n),c.innerHTML=`
1234
1234
  <div class="asset-crop-card" style="width:${p}px;">
1235
1235
  <div class="asset-crop-header">
1236
1236
  <div>
@@ -1242,11 +1242,11 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1242
1242
  <div class="asset-crop-body">
1243
1243
  <div class="asset-crop-column">
1244
1244
  <div class="asset-crop-label">Crop</div>
1245
- <canvas class="asset-crop-canvas" width="${Math.round(f)}" height="${Math.round(y)}"></canvas>
1245
+ <canvas class="asset-crop-canvas" width="${Math.round(m)}" height="${Math.round(y)}"></canvas>
1246
1246
  </div>
1247
1247
  <div class="asset-crop-column">
1248
1248
  <div class="asset-crop-label">Compare</div>
1249
- <canvas class="asset-crop-preview" width="${Math.round(f)}" height="${Math.round(y)}"></canvas>
1249
+ <canvas class="asset-crop-preview" width="${Math.round(m)}" height="${Math.round(y)}"></canvas>
1250
1250
  </div>
1251
1251
  </div>
1252
1252
  <div class="asset-crop-controls">
@@ -1260,7 +1260,7 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1260
1260
  <button class="asset-crop-apply" type="button">Apply Crop</button>
1261
1261
  </div>
1262
1262
  </div>
1263
- `;let b=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),w=c.querySelector(".asset-crop-zoom"),E=c.querySelector(".asset-crop-zoom-value"),x=c.querySelector(".asset-crop-close"),A=c.querySelector(".asset-crop-cancel"),S=c.querySelector(".asset-crop-apply"),P=c.querySelector(".asset-crop-reset");if(!b||!v||!w||!E){l(null);return}let I=b.getContext("2d"),L=v.getContext("2d");if(!I||!L){l(null);return}let T=o.naturalWidth,j=o.naturalHeight,O=Math.max(b.width/T,b.height/j),D=1,R=0,$=0,C=!1,_=0,M=0,q=0,V=0,ne=()=>{let z=O*D,Me=Math.max(0,(T*z-b.width)/2),Be=Math.max(0,(j*z-b.height)/2);R=Math.min(Me,Math.max(-Me,R)),$=Math.min(Be,Math.max(-Be,$))},ae=()=>{let z=O*D;I.clearRect(0,0,b.width,b.height);let Me=b.width/2-T*z/2+R,Be=b.height/2-j*z/2+$;if(I.drawImage(o,Me,Be,T*z,j*z),L.clearRect(0,0,v.width,v.height),s!=null&&s.naturalWidth&&(s!=null&&s.naturalHeight)){let Ge=Math.max(v.width/s.naturalWidth,v.height/s.naturalHeight),an=v.width/2-s.naturalWidth*Ge/2,gt=v.height/2-s.naturalHeight*Ge/2;L.drawImage(s,an,gt,s.naturalWidth*Ge,s.naturalHeight*Ge)}else L.fillStyle="rgba(255, 255, 255, 0.04)",L.fillRect(0,0,v.width,v.height),L.strokeStyle="rgba(255, 255, 255, 0.08)",L.strokeRect(4,4,v.width-8,v.height-8);let ut=v.width/b.width*(O*D),Ue=R*(v.width/b.width),Ft=$*(v.height/b.height),tn=v.width/2-T*ut/2+Ue,nn=v.height/2-j*ut/2+Ft;L.save(),L.globalAlpha=.7,L.drawImage(o,tn,nn,T*ut,j*ut),L.restore()},_a=()=>{R=0,$=0,ne(),ae()};w.addEventListener("input",()=>{D=Number(w.value),E.textContent=`${D.toFixed(2)}\xD7`,ne(),ae()}),b.addEventListener("pointerdown",z=>{C=!0,_=z.clientX,M=z.clientY,q=R,V=$,b.setPointerCapture(z.pointerId)}),b.addEventListener("pointermove",z=>{C&&(R=q+(z.clientX-_),$=V+(z.clientY-M),ne(),ae())}),b.addEventListener("pointerup",z=>{C=!1,b.releasePointerCapture(z.pointerId)}),b.addEventListener("pointerleave",()=>{C=!1});let Qi=()=>{c.remove()},en=()=>{Qi(),l(null)},zo=async()=>{let z=document.createElement("canvas");z.width=t.width,z.height=t.height;let Me=z.getContext("2d");if(!Me){Qi(),l(null);return}let Be=D,Ue=Math.max(z.width/T,z.height/j)*Be,Ft=z.width/b.width,tn=R*Ft,nn=$*Ft,Ge=z.width/2-T*Ue/2+tn,an=z.height/2-j*Ue/2+nn;Me.drawImage(o,Ge,an,T*Ue,j*Ue);let gt=await new Promise(Do=>{z.toBlob($o=>Do($o),e.type||"image/png")});if(Qi(),!gt){l(null);return}l(new File([gt],e.name,{type:gt.type}))};x==null||x.addEventListener("click",en),A==null||A.addEventListener("click",en),P==null||P.addEventListener("click",_a),S==null||S.addEventListener("click",()=>{zo()}),c.addEventListener("click",z=>{z.target===c&&en()}),document.body.appendChild(c),_a()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var zi=class{constructor(){this.root=null;this.options=null}render(){return`
1263
+ `;let b=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),w=c.querySelector(".asset-crop-zoom"),E=c.querySelector(".asset-crop-zoom-value"),x=c.querySelector(".asset-crop-close"),A=c.querySelector(".asset-crop-cancel"),S=c.querySelector(".asset-crop-apply"),P=c.querySelector(".asset-crop-reset");if(!b||!v||!w||!E){l(null);return}let I=b.getContext("2d"),L=v.getContext("2d");if(!I||!L){l(null);return}let T=o.naturalWidth,j=o.naturalHeight,O=Math.max(b.width/T,b.height/j),D=1,R=0,$=0,C=!1,_=0,M=0,q=0,V=0,ae=()=>{let z=O*D,Me=Math.max(0,(T*z-b.width)/2),Be=Math.max(0,(j*z-b.height)/2);R=Math.min(Me,Math.max(-Me,R)),$=Math.min(Be,Math.max(-Be,$))},re=()=>{let z=O*D;I.clearRect(0,0,b.width,b.height);let Me=b.width/2-T*z/2+R,Be=b.height/2-j*z/2+$;if(I.drawImage(o,Me,Be,T*z,j*z),L.clearRect(0,0,v.width,v.height),s!=null&&s.naturalWidth&&(s!=null&&s.naturalHeight)){let Ge=Math.max(v.width/s.naturalWidth,v.height/s.naturalHeight),an=v.width/2-s.naturalWidth*Ge/2,gt=v.height/2-s.naturalHeight*Ge/2;L.drawImage(s,an,gt,s.naturalWidth*Ge,s.naturalHeight*Ge)}else L.fillStyle="rgba(255, 255, 255, 0.04)",L.fillRect(0,0,v.width,v.height),L.strokeStyle="rgba(255, 255, 255, 0.08)",L.strokeRect(4,4,v.width-8,v.height-8);let ut=v.width/b.width*(O*D),Ue=R*(v.width/b.width),Bt=$*(v.height/b.height),tn=v.width/2-T*ut/2+Ue,nn=v.height/2-j*ut/2+Bt;L.save(),L.globalAlpha=.7,L.drawImage(o,tn,nn,T*ut,j*ut),L.restore()},_a=()=>{R=0,$=0,ae(),re()};w.addEventListener("input",()=>{D=Number(w.value),E.textContent=`${D.toFixed(2)}\xD7`,ae(),re()}),b.addEventListener("pointerdown",z=>{C=!0,_=z.clientX,M=z.clientY,q=R,V=$,b.setPointerCapture(z.pointerId)}),b.addEventListener("pointermove",z=>{C&&(R=q+(z.clientX-_),$=V+(z.clientY-M),ae(),re())}),b.addEventListener("pointerup",z=>{C=!1,b.releasePointerCapture(z.pointerId)}),b.addEventListener("pointerleave",()=>{C=!1});let Qi=()=>{c.remove()},en=()=>{Qi(),l(null)},zo=async()=>{let z=document.createElement("canvas");z.width=t.width,z.height=t.height;let Me=z.getContext("2d");if(!Me){Qi(),l(null);return}let Be=D,Ue=Math.max(z.width/T,z.height/j)*Be,Bt=z.width/b.width,tn=R*Bt,nn=$*Bt,Ge=z.width/2-T*Ue/2+tn,an=z.height/2-j*Ue/2+nn;Me.drawImage(o,Ge,an,T*Ue,j*Ue);let gt=await new Promise(Do=>{z.toBlob($o=>Do($o),e.type||"image/png")});if(Qi(),!gt){l(null);return}l(new File([gt],e.name,{type:gt.type}))};x==null||x.addEventListener("click",en),A==null||A.addEventListener("click",en),P==null||P.addEventListener("click",_a),S==null||S.addEventListener("click",()=>{zo()}),c.addEventListener("click",z=>{z.target===c&&en()}),document.body.appendChild(c),_a()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var zi=class{constructor(){this.root=null;this.options=null}render(){return`
1264
1264
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
1265
1265
  <div class="scene-panel-header" data-panel-handle>
1266
1266
  <div class="panel-title">
@@ -1326,18 +1326,38 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1326
1326
  </div>
1327
1327
  </div>
1328
1328
  </div>
1329
- `}initialize(e,t){var b,v,w,E,x,A,S,P,I,L,T,j,O,D,R,$;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var _;let C=window.getEditableEngineConfig;if(typeof C=="function"){let M=C();return(_=M==null?void 0:M.loading)!=null?_:{}}return{}})(),r=(b=this.root)==null?void 0:b.querySelector("#loading-screen-type");r&&(r.value=n.type==="image"?"image":"color",r.addEventListener("change",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{type:r.value}),this.updateFieldVisibility(r.value)}));let o=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");o&&(o.value=n.background_color||"#160a17",o.addEventListener("input",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{background_color:o.value})}));let s=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha"),l=(E=this.root)==null?void 0:E.querySelector("#loading-overlay-alpha-value");s&&(s.value=String((x=n.overlay_alpha)!=null?x:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var _,M;let C=Number(s.value);l&&(l.textContent=C.toFixed(2)),(M=(_=this.options)==null?void 0:_.onUpdateLoading)==null||M.call(_,{overlay_alpha:C})}));let c=(A=this.root)==null?void 0:A.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{text:c.value})}));let p=(S=this.root)==null?void 0:S.querySelector("#loading-text-scale"),d=(P=this.root)==null?void 0:P.querySelector("#loading-text-scale-value");p&&(p.value=String((I=n.text_scale)!=null?I:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var _,M;let C=Number(p.value);d&&(d.textContent=C.toFixed(2)),(M=(_=this.options)==null?void 0:_.onUpdateLoading)==null||M.call(_,{text_scale:C})}));let u=(L=this.root)==null?void 0:L.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{enabled:u.checked})}));let g=(T=this.root)==null?void 0:T.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{blur_enabled:g.checked})}));let m=(j=this.root)==null?void 0:j.querySelector("#loading-blur-strength"),h=(O=this.root)==null?void 0:O.querySelector("#loading-blur-strength-value");m&&(m.value=String((D=n.blur_strength)!=null?D:8),h&&(h.textContent=m.value),m.addEventListener("input",()=>{var C,_;h&&(h.textContent=m.value),(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{blur_strength:Number(m.value)})}));let f=(R=this.root)==null?void 0:R.querySelector("#loading-show-btn"),y=($=this.root)==null?void 0:$.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onShowLoadingScreen)==null||_.call(C)}),y==null||y.addEventListener("click",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onHideLoadingScreen)==null||_.call(C)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,r;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var Tt=require("pixi.js");Ke();K();async function Wr(a,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),s=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",s);let l=await Tt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load texture:",s);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of p)oe[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let d=window.gameObjectManager;if(d)for(let u of p){let g=d.get(u);if(g){let 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(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Yr(a,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,o=typeof r=="function"?r():null,s=(t=o==null?void 0:o.slots)==null?void 0:t.find(f=>f.category===e),l=s==null?void 0:s.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await Tt.Assets.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);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)oe[f]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let h=window.gameObjectManager;if(h)for(let f of m){let y=h.get(f);if(y){let b=((n=y.getDisplayObject)==null?void 0:n.call(y))||y.pixiObject||y;b!=null&&b.texture&&(b.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Kr(a,e,t,i){var n,r,o,s,l,c,p,d,u,g,m,h,f,y,b;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let w=Date.now(),E=`/raw/library/${i}/${t}?t=${w}`;console.log("[LIBRARY] Loading texture from:",E);let x=await Tt.Assets.load(E);if(!x){console.error("[LIBRARY] Failed to load texture:",E);return}console.log("[LIBRARY] \u2705 Texture loaded"),oe[v]=x,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let A=window.CustomAssets;A!=null&&A[v]&&(A[v].texture=x,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let S=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!S),S){let I=Array.from(((n=S.keys)==null?void 0:n.call(S))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",I);let L=S.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!L),L){let T=((r=L.getDisplayObject)==null?void 0:r.call(L))||L.pixiObject||L.pixi||L,j=(o=T==null?void 0:T.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",T),console.log("[LIBRARY] displayObject type:",j),console.log("[LIBRARY] has texture?",!!(T!=null&&T.texture)),T!=null&&T.texture)T.texture=x,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(j==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:O}=await import("pixi.js"),D=T.parent,R=(l=(s=D==null?void 0:D.getChildIndex)==null?void 0:s.call(D,T))!=null?l:0,$={x:T.x,y:T.y},C={x:(p=(c=T.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=T.anchor)==null?void 0:d.y)!=null?u:.5},_={x:(m=(g=T.scale)==null?void 0:g.x)!=null?m:1,y:(f=(h=T.scale)==null?void 0:h.y)!=null?f:1},M=(y=T.alpha)!=null?y:1,q=(b=T.visible)!=null?b:!0,V=new O(x);V.anchor.set(C.x,C.y),V.position.set($.x,$.y),V.scale.set(_.x,_.y),V.alpha=M,V.visible=q,D&&(D.removeChild(T),D.addChildAt(V,R),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),L.pixiObject&&(L.pixiObject=V),L.pixi&&(L.pixi=V),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(T!=null&&T.children){let O=T.children.find(D=>D.texture);O?(O.texture=x,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let P=`raw/library/${i}/${t}`;Ae({objectId:v,path:"render.asset.path",value:P}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",P)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function Xr(a,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let r=e.startsWith("json.")?e.replace("json.",""):e,o=Date.now(),s=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",s);let l=await Tt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load default texture:",s);return}oe[r]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+r);let c=window.CustomAssets;c!=null&&c[r]&&(c[r].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+r+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(r);if(d){let u=((n=d.getDisplayObject)==null?void 0:n.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}Ae({objectId:r,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",r)}catch(r){console.error("[LIBRARY] Error resetting slot asset:",r)}}var Pt=require("pixi.js");var Un=require("pixi.js"),ke=()=>window.debugConfig||{},Jr=()=>window.resolveAnchorVec2||(a=>({x:.5,y:.5})),Zr=()=>window.resolveScreenAnchorPoint||(()=>new Un.Point),Qr=()=>window.resolveScreenRatioPoint||(()=>new Un.Point);function eo(a){Di(a)&&(a.objectDebugRaf||(a.objectDebugRaf=window.requestAnimationFrame(()=>$i(a))))}function to(a){a.objectDebugRaf&&(window.cancelAnimationFrame(a.objectDebugRaf),a.objectDebugRaf=null),kt(a)}function Di(a){return a.isDebugOpen}function $i(a){var r,o,s;if(!Di(a)){a.objectDebugRaf=null;return}a.objectDebugRaf=window.requestAnimationFrame(()=>$i(a));let e=Gn(a);if(!e){Lt(a,null),kt(a);return}let t=qn(a,e);if(!t){Lt(a,null),kt(a);return}let i=new Pt.Point;(r=t.getGlobalPosition)==null||r.call(t,i);let n=Vn(a,t);Lt(a,{instanceId:e,worldX:i.x,worldY:i.y,configX:(o=n==null?void 0:n.x)!=null?o:null,configY:(s=n==null?void 0:n.y)!=null?s:null}),a.highlightObject?Xn(a,t):Zn(a),a.highlightAnchor&&n?Jn(a,n):Qn(a)}function Gn(a){var n;let e=a.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function qn(a,e){var n,r;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((r=i.getDisplayObject)==null?void 0:r.call(i))||i.pixiObject||i:null}function _t(a){let e=a.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Vn(a,e){var o,s;let t=_t(a);if(!t)return null;let i=(o=t.transform)!=null?o:{},n=Wn(a);if(!n)return null;if(i.position_ratio!=null)return Qr()(n.width,n.height,i.position_ratio);let r=(s=i.anchor)!=null?s:"center";return Zr()(n.width,n.height,r)}function Wn(a){var r;let e=(r=a.container)==null?void 0:r.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function Yn(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectBoundsGfx&&a.objectBoundsGfx.parent!==e.stage&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectBoundsGfx||(a.objectBoundsGfx=new Pt.Graphics,a.objectBoundsGfx.zIndex=999999,e.stage.addChild(a.objectBoundsGfx)),a.objectBoundsGfx):null}function Kn(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectAnchorGfx&&a.objectAnchorGfx.parent!==e.stage&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null),a.objectAnchorGfx||(a.objectAnchorGfx=new Pt.Graphics,a.objectAnchorGfx.zIndex=1e6,e.stage.addChild(a.objectAnchorGfx)),a.objectAnchorGfx):null}function Xn(a,e){var n;let t=Yn(a);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function Jn(a,e){let t=Kn(a);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function Zn(a){a.objectBoundsGfx&&a.objectBoundsGfx.clear()}function Qn(a){a.objectAnchorGfx&&a.objectAnchorGfx.clear()}function kt(a){a.objectBoundsGfx&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectAnchorGfx&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null)}function Lt(a,e){a.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function io(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function no(a,e,t){var o;let i=e.split("."),n=i.pop(),r=a;for(let s of i)r[s]=(o=r[s])!=null?o:{},r=r[s];r[n]=t}function ea(a){var i,n,r,o,s;if(!a)return!1;if((i=a.transform)!=null&&i.offset)return!0;let e=((r=(n=a.identity)==null?void 0:n.category)!=null?r:"").toString().toLowerCase(),t=((s=(o=a.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Ni(a){let e=ke();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 ao(a){window.location.reload()}function Fi(a){let e=JSON.stringify(ke(),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 ro(a,e){var t,i,n;if(!(!a.configViewer||!a.container))try{let r=window.getEditableObjectConfig,o=typeof r=="function"?r(e):null;if(!o){let{loadObjectCentricConfig:s,loadObjectConfig:l}=await Promise.resolve().then(()=>(pi(),Pr)),d=(((t=(await s("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!d)return;let u=await l(d.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),Hi(a,u),(i=a.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),Hi(a,o),(n=a.configViewer)==null||n.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function Hi(a,e){var d,u,g,m,h,f,y,b,v,w;if(!a.container)return;let t=a.container.querySelector("#config-pos-x"),i=a.container.querySelector("#config-pos-y"),n=a.container.querySelector("#config-scale"),r=a.container.querySelector("#config-anchor-x"),o=a.container.querySelector("#config-anchor-y"),l=ea(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((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=(w=(v=(y=e.transform)==null?void 0:y.anchor)!=null?v:(b=e.render)==null?void 0:b.anchor)!=null?w:{x:.5,y:.5},p=Jr()(c);r&&(r.value=String(p.x)),o&&(o.value=String(p.y))}function oo(a){var l,c,p,d,u,g,m,h,f,y;let e=a.selectedObjectId;if(!e||!a.container)return;let t=(c=(l=a.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=a.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(g=(u=a.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",r=(h=(m=a.container.querySelector("#config-anchor-x"))==null?void 0:m.value)!=null?h:"0.5",o=(y=(f=a.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?y:"0.5",s=`${e}:
1329
+ `}initialize(e,t){var b,v,w,E,x,A,S,P,I,L,T,j,O,D,R,$;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var _;let C=window.getEditableEngineConfig;if(typeof C=="function"){let M=C();return(_=M==null?void 0:M.loading)!=null?_:{}}return{}})(),r=(b=this.root)==null?void 0:b.querySelector("#loading-screen-type");r&&(r.value=n.type==="image"?"image":"color",r.addEventListener("change",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{type:r.value}),this.updateFieldVisibility(r.value)}));let o=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");o&&(o.value=n.background_color||"#160a17",o.addEventListener("input",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{background_color:o.value})}));let s=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha"),l=(E=this.root)==null?void 0:E.querySelector("#loading-overlay-alpha-value");s&&(s.value=String((x=n.overlay_alpha)!=null?x:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var _,M;let C=Number(s.value);l&&(l.textContent=C.toFixed(2)),(M=(_=this.options)==null?void 0:_.onUpdateLoading)==null||M.call(_,{overlay_alpha:C})}));let c=(A=this.root)==null?void 0:A.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{text:c.value})}));let p=(S=this.root)==null?void 0:S.querySelector("#loading-text-scale"),d=(P=this.root)==null?void 0:P.querySelector("#loading-text-scale-value");p&&(p.value=String((I=n.text_scale)!=null?I:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var _,M;let C=Number(p.value);d&&(d.textContent=C.toFixed(2)),(M=(_=this.options)==null?void 0:_.onUpdateLoading)==null||M.call(_,{text_scale:C})}));let u=(L=this.root)==null?void 0:L.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{enabled:u.checked})}));let h=(T=this.root)==null?void 0:T.querySelector("#loading-blur-enabled");h&&(h.checked=n.blur_enabled!==!1,h.addEventListener("change",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{blur_enabled:h.checked})}));let f=(j=this.root)==null?void 0:j.querySelector("#loading-blur-strength"),g=(O=this.root)==null?void 0:O.querySelector("#loading-blur-strength-value");f&&(f.value=String((D=n.blur_strength)!=null?D:8),g&&(g.textContent=f.value),f.addEventListener("input",()=>{var C,_;g&&(g.textContent=f.value),(_=(C=this.options)==null?void 0:C.onUpdateLoading)==null||_.call(C,{blur_strength:Number(f.value)})}));let m=(R=this.root)==null?void 0:R.querySelector("#loading-show-btn"),y=($=this.root)==null?void 0:$.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onShowLoadingScreen)==null||_.call(C)}),y==null||y.addEventListener("click",()=>{var C,_;(_=(C=this.options)==null?void 0:C.onHideLoadingScreen)==null||_.call(C)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,r;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var Lt=require("pixi.js");Ke();K();async function Wr(a,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),s=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",s);let l=await Lt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load texture:",s);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let h=e.replace(/s$/,"");return u.startsWith(h)||u.includes(h)});for(let u of p)se[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let d=window.gameObjectManager;if(d)for(let u of p){let h=d.get(u);if(h){let f=((n=h.getDisplayObject)==null?void 0:n.call(h))||h.pixiObject||h;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Yr(a,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,o=typeof r=="function"?r():null,s=(t=o==null?void 0:o.slots)==null?void 0:t.find(m=>m.category===e),l=s==null?void 0:s.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await Lt.Assets.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,h=e.replace(/s$/,""),f=Object.keys(u||{}).filter(m=>m.startsWith(h)||m.includes(h));for(let m of f)se[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let g=window.gameObjectManager;if(g)for(let m of f){let y=g.get(m);if(y){let b=((n=y.getDisplayObject)==null?void 0:n.call(y))||y.pixiObject||y;b!=null&&b.texture&&(b.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Kr(a,e,t,i){var n,r,o,s,l,c,p,d,u,h,f,g,m,y,b;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let w=Date.now(),E=`/raw/library/${i}/${t}?t=${w}`;console.log("[LIBRARY] Loading texture from:",E);let x=await Lt.Assets.load(E);if(!x){console.error("[LIBRARY] Failed to load texture:",E);return}console.log("[LIBRARY] \u2705 Texture loaded"),se[v]=x,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let A=window.CustomAssets;A!=null&&A[v]&&(A[v].texture=x,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let S=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!S),S){let I=Array.from(((n=S.keys)==null?void 0:n.call(S))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",I);let L=S.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!L),L){let T=((r=L.getDisplayObject)==null?void 0:r.call(L))||L.pixiObject||L.pixi||L,j=(o=T==null?void 0:T.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",T),console.log("[LIBRARY] displayObject type:",j),console.log("[LIBRARY] has texture?",!!(T!=null&&T.texture)),T!=null&&T.texture)T.texture=x,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(j==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:O}=await import("pixi.js"),D=T.parent,R=(l=(s=D==null?void 0:D.getChildIndex)==null?void 0:s.call(D,T))!=null?l:0,$={x:T.x,y:T.y},C={x:(p=(c=T.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=T.anchor)==null?void 0:d.y)!=null?u:.5},_={x:(f=(h=T.scale)==null?void 0:h.x)!=null?f:1,y:(m=(g=T.scale)==null?void 0:g.y)!=null?m:1},M=(y=T.alpha)!=null?y:1,q=(b=T.visible)!=null?b:!0,V=new O(x);V.anchor.set(C.x,C.y),V.position.set($.x,$.y),V.scale.set(_.x,_.y),V.alpha=M,V.visible=q,D&&(D.removeChild(T),D.addChildAt(V,R),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),L.pixiObject&&(L.pixiObject=V),L.pixi&&(L.pixi=V),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(T!=null&&T.children){let O=T.children.find(D=>D.texture);O?(O.texture=x,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let P=`raw/library/${i}/${t}`;Ae({objectId:v,path:"render.asset.path",value:P}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",P)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function Xr(a,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let r=e.startsWith("json.")?e.replace("json.",""):e,o=Date.now(),s=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",s);let l=await Lt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load default texture:",s);return}se[r]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+r);let c=window.CustomAssets;c!=null&&c[r]&&(c[r].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+r+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(r);if(d){let u=((n=d.getDisplayObject)==null?void 0:n.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}Ae({objectId:r,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",r)}catch(r){console.error("[LIBRARY] Error resetting slot asset:",r)}}var _t=require("pixi.js");var Un=require("pixi.js"),ke=()=>window.debugConfig||{},Jr=()=>window.resolveAnchorVec2||(a=>({x:.5,y:.5})),Zr=()=>window.resolveScreenAnchorPoint||(()=>new Un.Point),Qr=()=>window.resolveScreenRatioPoint||(()=>new Un.Point);function eo(a){Di(a)&&(a.objectDebugRaf||(a.objectDebugRaf=window.requestAnimationFrame(()=>$i(a))))}function to(a){a.objectDebugRaf&&(window.cancelAnimationFrame(a.objectDebugRaf),a.objectDebugRaf=null),Pt(a)}function Di(a){return a.isDebugOpen}function $i(a){var r,o,s;if(!Di(a)){a.objectDebugRaf=null;return}a.objectDebugRaf=window.requestAnimationFrame(()=>$i(a));let e=Gn(a);if(!e){kt(a,null),Pt(a);return}let t=qn(a,e);if(!t){kt(a,null),Pt(a);return}let i=new _t.Point;(r=t.getGlobalPosition)==null||r.call(t,i);let n=Vn(a,t);kt(a,{instanceId:e,worldX:i.x,worldY:i.y,configX:(o=n==null?void 0:n.x)!=null?o:null,configY:(s=n==null?void 0:n.y)!=null?s:null}),a.highlightObject?Xn(a,t):Zn(a),a.highlightAnchor&&n?Jn(a,n):Qn(a)}function Gn(a){var n;let e=a.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function qn(a,e){var n,r;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((r=i.getDisplayObject)==null?void 0:r.call(i))||i.pixiObject||i:null}function Mt(a){let e=a.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Vn(a,e){var o,s;let t=Mt(a);if(!t)return null;let i=(o=t.transform)!=null?o:{},n=Wn(a);if(!n)return null;if(i.position_ratio!=null)return Qr()(n.width,n.height,i.position_ratio);let r=(s=i.anchor)!=null?s:"center";return Zr()(n.width,n.height,r)}function Wn(a){var r;let e=(r=a.container)==null?void 0:r.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function Yn(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectBoundsGfx&&a.objectBoundsGfx.parent!==e.stage&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectBoundsGfx||(a.objectBoundsGfx=new _t.Graphics,a.objectBoundsGfx.zIndex=999999,e.stage.addChild(a.objectBoundsGfx)),a.objectBoundsGfx):null}function Kn(a){let e=window.gameApp;return e!=null&&e.stage?(a.objectAnchorGfx&&a.objectAnchorGfx.parent!==e.stage&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null),a.objectAnchorGfx||(a.objectAnchorGfx=new _t.Graphics,a.objectAnchorGfx.zIndex=1e6,e.stage.addChild(a.objectAnchorGfx)),a.objectAnchorGfx):null}function Xn(a,e){var n;let t=Yn(a);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function Jn(a,e){let t=Kn(a);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function Zn(a){a.objectBoundsGfx&&a.objectBoundsGfx.clear()}function Qn(a){a.objectAnchorGfx&&a.objectAnchorGfx.clear()}function Pt(a){a.objectBoundsGfx&&(a.objectBoundsGfx.destroy(),a.objectBoundsGfx=null),a.objectAnchorGfx&&(a.objectAnchorGfx.destroy(),a.objectAnchorGfx=null)}function kt(a,e){a.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function io(a,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,a)}function no(a,e,t){var o;let i=e.split("."),n=i.pop(),r=a;for(let s of i)r[s]=(o=r[s])!=null?o:{},r=r[s];r[n]=t}function ea(a){var i,n,r,o,s;if(!a)return!1;if((i=a.transform)!=null&&i.offset)return!0;let e=((r=(n=a.identity)==null?void 0:n.category)!=null?r:"").toString().toLowerCase(),t=((s=(o=a.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Ni(a){let e=ke();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 ao(a){window.location.reload()}function Fi(a){let e=JSON.stringify(ke(),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 ro(a,e){var t,i,n;if(!(!a.configViewer||!a.container))try{let r=window.getEditableObjectConfig,o=typeof r=="function"?r(e):null;if(!o){let{loadObjectCentricConfig:s,loadObjectConfig:l}=await Promise.resolve().then(()=>(pi(),Pr)),d=(((t=(await s("scene.main")).scene)==null?void 0:t.objects)||[]).find(h=>h.object_config===e||h.instance_id===e);if(!d)return;let u=await l(d.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),Hi(a,u),(i=a.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),Hi(a,o),(n=a.configViewer)==null||n.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function Hi(a,e){var d,u,h,f,g,m,y,b,v,w;if(!a.container)return;let t=a.container.querySelector("#config-pos-x"),i=a.container.querySelector("#config-pos-y"),n=a.container.querySelector("#config-scale"),r=a.container.querySelector("#config-anchor-x"),o=a.container.querySelector("#config-anchor-y"),l=ea(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((h=l==null?void 0:l.x)!=null?h:0)),i&&(i.value=String((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((m=(g=e.transform)==null?void 0:g.scale)!=null?m:1));let c=(w=(v=(y=e.transform)==null?void 0:y.anchor)!=null?v:(b=e.render)==null?void 0:b.anchor)!=null?w:{x:.5,y:.5},p=Jr()(c);r&&(r.value=String(p.x)),o&&(o.value=String(p.y))}function oo(a){var l,c,p,d,u,h,f,g,m,y;let e=a.selectedObjectId;if(!e||!a.container)return;let t=(c=(l=a.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=a.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(h=(u=a.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?h:"1",r=(g=(f=a.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?g:"0.5",o=(y=(m=a.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?y:"0.5",s=`${e}:
1330
1330
  position: (${t}, ${i})
1331
1331
  scale: ${n}
1332
- anchor: (${r}, ${o})`;navigator.clipboard.writeText(s).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(b=>console.error("[DEBUG] Failed to copy config values:",b))}async function ta(a,e){var d,u,g,m,h,f,y,b,v,w,E;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!a.container)return;let t=a.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=a.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((m=(g=a.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?m:0),r=Number((f=(h=a.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?f:1),o=Number((b=(y=a.container.querySelector("#config-anchor-x"))==null?void 0:y.value)!=null?b:.5),s=Number((w=(v=a.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?w:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:r,anchorX:o,anchorY:s});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Xe));l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:o,y:s}},{silent:e==null?void 0:e.silent});let c=_t(a);ea(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let x=(E=window.getEditableObjectConfig)==null?void 0:E.call(window,t);x?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,x)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function so(a,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),Xe));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([p,d])=>{var u;if(p)if(p.includes(".")){let g=p.split("."),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]]=d}else c[p]=d}),l.ui=c,n({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),o=(t==null?void 0:t.source)!=="auto"&&!r,s=window.__previewShell;o&&(s!=null&&s.refresh)&&s.refresh()}function lo(a){a.selectedObjectId&&(a.objectAutoApplyTimer&&window.clearTimeout(a.objectAutoApplyTimer),a.objectAutoApplyTimer=window.setTimeout(()=>{a.objectAutoApplyTimer=null,ta(a,{silent:!0})},150))}var Qs=3e3;function Mt(a,e,t){let i=t!=null?t:a.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,r=0,o=0,s=0,l=0,c=0,p=0,d=g=>{if(!n)return;let m=i.getBoundingClientRect();a.style.left=`${g.clientX-m.left-c}px`,a.style.top=`${g.clientY-m.top-p}px`},u=()=>{n&&(n=!1,a.classList.remove("dragging"),window.removeEventListener("pointermove",d),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=a.getBoundingClientRect(),f=i.getBoundingClientRect();console.log("[DRAG] Panel:",a.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,p=g.clientY-h.top,console.log("[DRAG] offset:",{x:c,y:p});let y=h.left-f.left,b=h.top-f.top;console.log("[DRAG] targetPosition:",{left:y,top:b}),a.style.left=`${y}px`,a.style.top=`${b}px`,a.style.right="auto",a.style.bottom="auto",a.style.zIndex=String(++Qs),n=!0,a.classList.add("dragging"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function co(a,e,t,i=280,n=200){e.style.cursor="nwse-resize";let r=0,o=0,s=0,l=0,c=!1,p=u=>{var b;if(!c)return;let g=u.clientX-s,m=u.clientY-l,h=Math.max(i,r+g),f=Math.max(n,o+m);a.style.width=`${h}px`,(b=a.closest(".preview-shell"))!=null&&b.classList.contains("layout-fixed")||(a.style.height=`${f}px`),t==null||t(h,f)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=a.getBoundingClientRect();r=g.width,o=g.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function ia(a,e){var h,f,y,b;let t=(y=(f=(h=a.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?f:a.debugOverlay)!=null?y:e.offsetParent;if(!t||(b=a.container)!=null&&b.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),r=12,o=Math.max(250,Math.floor(i.width-r*2)),s=Math.max(200,Math.floor(i.height-r*2));n.width>o&&(e.style.width=`${o}px`),n.height>s&&(e.style.height=`${s}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(r,i.width-l.width-r),u=Math.max(r,i.height-l.height-r),g=Math.min(Math.max(c,r),d),m=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(m)}px`,e.style.right="auto",e.style.bottom="auto"}function tt(a){var i,n;if(!a.container)return;let e=a.container.querySelector("#debug-workbench");if(!e)return;if(ia(a,e),(i=a.container)!=null&&i.classList.contains("layout-fixed")){let r=localStorage.getItem("preview_workbench_state"),o={activeTab:a.activeTab};if(r)try{o={...JSON.parse(r),activeTab:a.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(o));return}let t={activeTab:a.activeTab,width:e.style.width,height:(n=a.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 Bi(a){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(a.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,r;let i=(n=a.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let o=(r=a.container)==null?void 0:r.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!o?i.style.height=t.height:o&&(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"),ia(a,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function na(a,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",ia(a,e),tt(a))}function po(a){var n,r,o;if(!a.container)return;let e=a.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var s;console.log("[PREVIEW] Debug toggle clicked"),(s=a.toggleDebug)==null||s.call(a)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var s;return(s=a.toggleDebug)==null?void 0:s.call(a,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>Ni(a)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>Fi(a)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;a.activeTab=l,aa(a),tt(a)})}),oa(a,e),ra(a,e)}function aa(a){if(!a.container)return;let e=a.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let r=n.dataset.tab;n.classList.toggle("active",r===a.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let r=n.dataset.tabPanel;n.classList.toggle("active",r===a.activeTab)})}function ra(a,e){te(a,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),te(a,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),te(a,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),te(a,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),te(a,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),te(a,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),te(a,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),te(a,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),te(a,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=ke();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),r=parseInt(n,16),o=ke();o.layout&&(o.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function uo(a){if(!a.container||!a.debugOverlay)return;let e=a.container.querySelector("#debug-workbench"),t=a.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"),Mt(e,t,a.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{tt(a),na(a,e)},10)}));let i=a.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),r=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"),Mt(i,n,a.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{na(a,i)},10)})),i&&r&&co(i,r);let o=a.container.querySelector('[data-panel="scene-tools-corner"]'),s=o==null?void 0:o.querySelector("[data-panel-handle]");o&&s&&Mt(o,s,a.debugOverlay);let l=a.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Mt(l,c,a.debugOverlay),Bi(a)}function oa(a,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function te(a,e,t,i,n){let r=e.querySelector(`#${t}`),o=e.querySelector(n);if(!r||!o)return;let s=io(ke(),i);typeof s=="number"&&(r.value=String(s),o.textContent=String(s)),r.addEventListener("input",()=>{let l=Number(r.value);o.textContent=String(l),no(ke(),i,l)})}K();var Ui=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=ai(),{hasChanges:t,overrideCount:i,overrides:n}=e,r={};for(let l of n){let c=l.objectId||"Engine";r[c]||(r[c]=[]),r[c].push(l)}let o=localStorage.getItem("handler_last_applied"),s=o?new Date(parseInt(o)).toLocaleString():"Never";return`
1332
+ anchor: (${r}, ${o})`;navigator.clipboard.writeText(s).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(b=>console.error("[DEBUG] Failed to copy config values:",b))}async function ta(a,e){var d,u,h,f,g,m,y,b,v,w,E;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!a.container)return;let t=a.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=a.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(h=a.container.querySelector("#config-pos-y"))==null?void 0:h.value)!=null?f:0),r=Number((m=(g=a.container.querySelector("#config-scale"))==null?void 0:g.value)!=null?m:1),o=Number((b=(y=a.container.querySelector("#config-anchor-x"))==null?void 0:y.value)!=null?b:.5),s=Number((w=(v=a.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?w:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:r,anchorX:o,anchorY:s});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Xe));l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:o,y:s}},{silent:e==null?void 0:e.silent});let c=Mt(a);ea(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let x=(E=window.getEditableObjectConfig)==null?void 0:E.call(window,t);x?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,x)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function so(a,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),Xe));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([p,d])=>{var u;if(p)if(p.includes(".")){let h=p.split("."),f=c;for(let g=0;g<h.length-1;g++){let m=h[g];f[m]=(u=f[m])!=null?u:{},f=f[m]}f[h[h.length-1]]=d}else c[p]=d}),l.ui=c,n({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),o=(t==null?void 0:t.source)!=="auto"&&!r,s=window.__previewShell;o&&(s!=null&&s.refresh)&&s.refresh()}function lo(a){a.selectedObjectId&&(a.objectAutoApplyTimer&&window.clearTimeout(a.objectAutoApplyTimer),a.objectAutoApplyTimer=window.setTimeout(()=>{a.objectAutoApplyTimer=null,ta(a,{silent:!0})},150))}var Qs=3e3;function Ot(a,e,t){let i=t!=null?t:a.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,r=0,o=0,s=0,l=0,c=0,p=0,d=h=>{if(!n)return;let f=i.getBoundingClientRect();a.style.left=`${h.clientX-f.left-c}px`,a.style.top=`${h.clientY-f.top-p}px`},u=()=>{n&&(n=!1,a.classList.remove("dragging"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",h=>{if(h.button!==0)return;let f=h.target;if(f!=null&&f.closest("button, input, select, textarea"))return;h.preventDefault();let g=a.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",a.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:g.left,top:g.top,width:g.width,height:g.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:h.clientX,y:h.clientY}),c=h.clientX-g.left,p=h.clientY-g.top,console.log("[DRAG] offset:",{x:c,y:p});let y=g.left-m.left,b=g.top-m.top;console.log("[DRAG] targetPosition:",{left:y,top:b}),a.style.left=`${y}px`,a.style.top=`${b}px`,a.style.right="auto",a.style.bottom="auto",a.style.zIndex=String(++Qs),n=!0,a.classList.add("dragging"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function co(a,e,t,i=280,n=200){e.style.cursor="nwse-resize";let r=0,o=0,s=0,l=0,c=!1,p=u=>{var b;if(!c)return;let h=u.clientX-s,f=u.clientY-l,g=Math.max(i,r+h),m=Math.max(n,o+f);a.style.width=`${g}px`,(b=a.closest(".preview-shell"))!=null&&b.classList.contains("layout-fixed")||(a.style.height=`${m}px`),t==null||t(g,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let h=a.getBoundingClientRect();r=h.width,o=h.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function ia(a,e){var g,m,y,b;let t=(y=(m=(g=a.container)==null?void 0:g.querySelector("#debug-overlay"))!=null?m:a.debugOverlay)!=null?y:e.offsetParent;if(!t||(b=a.container)!=null&&b.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),r=12,o=Math.max(250,Math.floor(i.width-r*2)),s=Math.max(200,Math.floor(i.height-r*2));n.width>o&&(e.style.width=`${o}px`),n.height>s&&(e.style.height=`${s}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(r,i.width-l.width-r),u=Math.max(r,i.height-l.height-r),h=Math.min(Math.max(c,r),d),f=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(h)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function tt(a){var i,n;if(!a.container)return;let e=a.container.querySelector("#debug-workbench");if(!e)return;if(ia(a,e),(i=a.container)!=null&&i.classList.contains("layout-fixed")){let r=localStorage.getItem("preview_workbench_state"),o={activeTab:a.activeTab};if(r)try{o={...JSON.parse(r),activeTab:a.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(o));return}let t={activeTab:a.activeTab,width:e.style.width,height:(n=a.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 Bi(a){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(a.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,r;let i=(n=a.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let o=(r=a.container)==null?void 0:r.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!o?i.style.height=t.height:o&&(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"),ia(a,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function na(a,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",ia(a,e),tt(a))}function po(a){var n,r,o;if(!a.container)return;let e=a.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var s;console.log("[PREVIEW] Debug toggle clicked"),(s=a.toggleDebug)==null||s.call(a)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var s;return(s=a.toggleDebug)==null?void 0:s.call(a,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>Ni(a)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>Fi(a)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;a.activeTab=l,aa(a),tt(a)})}),oa(a,e),ra(a,e)}function aa(a){if(!a.container)return;let e=a.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let r=n.dataset.tab;n.classList.toggle("active",r===a.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let r=n.dataset.tabPanel;n.classList.toggle("active",r===a.activeTab)})}function ra(a,e){ie(a,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ie(a,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ie(a,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ie(a,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ie(a,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ie(a,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ie(a,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ie(a,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ie(a,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=ke();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),r=parseInt(n,16),o=ke();o.layout&&(o.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function uo(a){if(!a.container||!a.debugOverlay)return;let e=a.container.querySelector("#debug-workbench"),t=a.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"),Ot(e,t,a.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{tt(a),na(a,e)},10)}));let i=a.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),r=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"),Ot(i,n,a.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{na(a,i)},10)})),i&&r&&co(i,r);let o=a.container.querySelector('[data-panel="scene-tools-corner"]'),s=o==null?void 0:o.querySelector("[data-panel-handle]");o&&s&&Ot(o,s,a.debugOverlay);let l=a.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ot(l,c,a.debugOverlay),Bi(a)}function oa(a,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function ie(a,e,t,i,n){let r=e.querySelector(`#${t}`),o=e.querySelector(n);if(!r||!o)return;let s=io(ke(),i);typeof s=="number"&&(r.value=String(s),o.textContent=String(s)),r.addEventListener("input",()=>{let l=Number(r.value);o.textContent=String(l),no(ke(),i,l)})}K();var Ui=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=Et(),{hasChanges:t,overrideCount:i,overrides:n}=e,r={};for(let p of n){let d=p.objectId||"Engine";r[d]||(r[d]=[]),r[d].push(p)}let o=localStorage.getItem("handler_last_applied"),s=o?new Date(parseInt(o)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1333
1333
  <div class="config-persistence-panel">
1334
+ <!-- Status Footer (Always Visible) -->
1335
+ <div class="persistence-status-footer">
1336
+ <div class="status-footer-row">
1337
+ <span class="status-footer-label">Source:</span>
1338
+ <span class="status-footer-value">${l}</span>
1339
+ </div>
1340
+ <div class="status-footer-row">
1341
+ <span class="status-footer-label">Overrides:</span>
1342
+ <span class="status-footer-value">${i} staged</span>
1343
+ </div>
1344
+ <div class="status-footer-row">
1345
+ <span class="status-footer-label">Assets:</span>
1346
+ <span class="status-footer-value">${c}</span>
1347
+ </div>
1348
+ <div class="status-footer-row">
1349
+ <span class="status-footer-label">Last Applied:</span>
1350
+ <span class="status-footer-value">${s}</span>
1351
+ </div>
1352
+ </div>
1353
+
1334
1354
  <div class="persistence-status-bar ${t?"has-changes":"no-changes"}">
1335
1355
  ${t?`
1336
1356
  <div class="status-box">
1337
1357
  <span class="status-badge">UNAPPLIED</span>
1338
1358
  <span class="status-text">${i} staging changes</span>
1339
1359
  </div>
1340
- <div class="status-action-hint">Review below before applying to project</div>
1360
+ <div class="status-action-hint">You have staged changes (not saved).</div>
1341
1361
  `:`
1342
1362
  <div class="status-box">
1343
1363
  <span class="status-badge success">READY</span>
@@ -1351,35 +1371,33 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1351
1371
  id="create-version-btn"
1352
1372
  class="persistence-btn primary-action"
1353
1373
  ${t?"":"disabled"}
1354
- title="Creates a new version snapshot with backup. Safe for production use."
1374
+ title="Save As New Version - Creates a new version snapshot with backup. Safe for production use."
1355
1375
  >
1356
- \u{1F4DD} CREATE NEW VERSION
1376
+ \u{1F4DD} SAVE AS NEW VERSION
1357
1377
  </button>
1358
1378
 
1359
- ${this.currentVersion?`
1360
- <button
1361
- id="apply-current-btn"
1362
- class="persistence-btn secondary-action"
1363
- ${t?"":"disabled"}
1364
- title="Updates the currently active version: ${this.currentVersion}"
1365
- >
1366
- \u{1F4BE} APPLY TO CURRENT VERSION (${this.currentVersion})
1367
- </button>
1368
- `:""}
1379
+ <button
1380
+ id="apply-current-btn"
1381
+ class="persistence-btn secondary-action"
1382
+ ${t?"":"disabled"}
1383
+ title="Apply to Current Source - Writes to ${this.currentVersion?`version ${this.currentVersion}`:"Original configs"}"
1384
+ >
1385
+ \u{1F4BE} APPLY TO CURRENT SOURCE
1386
+ </button>
1369
1387
  </div>
1370
1388
 
1371
1389
  <div class="version-management-section">
1372
1390
  <div class="version-header">
1373
- <span class="version-label">\u{1F4E6} Version Management</span>
1391
+ <span class="version-label">\u{1F4E6} Switch Version</span>
1374
1392
  </div>
1375
1393
  <div class="version-controls">
1376
1394
  <div class="version-current">
1377
- <label>Current Version:</label>
1395
+ <label>Switch to:</label>
1378
1396
  <select id="version-selector" class="version-dropdown">
1379
- <option value="">original (pristine)</option>
1380
- ${this.availableVersions.map(l=>`
1381
- <option value="${l.name}" ${l.name===this.currentVersion?"selected":""}>
1382
- ${l.name} (${new Date(l.lastApplied).toLocaleDateString()})
1397
+ <option value="">Original</option>
1398
+ ${this.availableVersions.map(p=>`
1399
+ <option value="${p.name}" ${p.name===this.currentVersion?"selected":""}>
1400
+ ${p.name}${p.name===this.currentVersion?" (Current)":""} - ${new Date(p.lastApplied).toLocaleDateString()}
1383
1401
  </option>
1384
1402
  `).join("")}
1385
1403
  </select>
@@ -1409,20 +1427,20 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1409
1427
  <button class="staging-clear-all" id="clear-all-overrides">Discard All</button>
1410
1428
  </div>
1411
1429
  <div class="staging-list">
1412
- ${Object.entries(r).map(([l,c])=>`
1430
+ ${Object.entries(r).map(([p,d])=>`
1413
1431
  <div class="staging-group">
1414
1432
  <div class="staging-group-title">
1415
- <span class="group-icon">${l==="Engine"?"\u2699\uFE0F":"\u{1F4E6}"}</span>
1416
- <span class="group-id">${l}</span>
1433
+ <span class="group-icon">${p==="Engine"?"\u2699\uFE0F":"\u{1F4E6}"}</span>
1434
+ <span class="group-id">${p}</span>
1417
1435
  </div>
1418
1436
  <div class="staging-items">
1419
- ${c.map(p=>`
1437
+ ${d.map(u=>`
1420
1438
  <div class="staging-item">
1421
- <div class="item-path">${p.path}</div>
1422
- <div class="item-value" title="${JSON.stringify(p.value)}">
1423
- ${this.formatValue(p.value)}
1439
+ <div class="item-path">${u.path}</div>
1440
+ <div class="item-value" title="${JSON.stringify(u.value)}">
1441
+ ${this.formatValue(u.value)}
1424
1442
  </div>
1425
- <button class="item-remove" data-remove-path="${p.path}" data-remove-id="${p.objectId||""}" title="Discard this change">\xD7</button>
1443
+ <button class="item-remove" data-remove-path="${u.path}" data-remove-id="${u.objectId||""}" title="Discard this change">\xD7</button>
1426
1444
  </div>
1427
1445
  `).join("")}
1428
1446
  </div>
@@ -1458,7 +1476,17 @@ Generate the requested asset matching the brand style.${a.needsTransparency?" Ba
1458
1476
  </ul>
1459
1477
  </div>
1460
1478
  </div>
1461
- `}formatValue(e){return e===null?"null":typeof e=="string"?e.length>25?e.substring(0,22)+"...":e:typeof e=="object"?"{...}":String(e)}setupEventListeners(){if(!this.container)return;let e=this.container.querySelector("#create-version-btn");e==null||e.addEventListener("click",async()=>{var p;if(!(e.getAttribute("disabled")!==null||!confirm("Create a new version snapshot? This will save all changes with backup.")))try{let d=localStorage.getItem("handler_last_version_name")||"",g=((p=prompt("Version name (e.g. v1, test_2024):",d))!=null?p:"").trim();if(!g){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",g),e.textContent="\u23F3 Creating version...",e.setAttribute("disabled","true"),await ri(g),this.showSuccessNotification(),await this.loadVersionsList(),this.refreshPanel()}catch(d){console.error("[ConfigPersistence] Create version failed:",d),alert(`\u274C Failed to create version: ${d.message}`),e.textContent="\u{1F4DD} CREATE NEW VERSION",e.removeAttribute("disabled")}});let t=this.container.querySelector("#apply-current-btn");t==null||t.addEventListener("click",async()=>{if(!(t.getAttribute("disabled")!==null||!confirm(`Update current version "${this.currentVersion}"? This will overwrite the existing version.`)))try{t.textContent="\u23F3 Updating version...",t.setAttribute("disabled","true");let p=ze(),d={};for(let[g,m]of Object.entries(p.objects)){let h=m,f=g;/^(json\.|ui\.|effects\.|engine\.)/.test(f)||(f=`json.${g}`),h&&typeof h=="object"&&(h.identity||(h.identity={}),h.identity.id=f),d[`objects/${f}.json`]=h}p.engine&&(p.engine.runtime&&(d["engine/engine.runtime.json"]=p.engine.runtime),p.engine.assets&&(d["engine/engine.assets.json"]=p.engine.assets),p.engine.splash&&(d["engine/engine.splash.json"]=p.engine.splash),p.engine.loading&&(d["engine/engine.loading.json"]=p.engine.loading),p.engine.start&&(d["engine/engine.start.json"]=p.engine.start),p.engine.tutorial&&(d["engine/engine.tutorial.json"]=p.engine.tutorial),p.engine.endgame&&(d["engine/engine.endgame.json"]=p.engine.endgame),!p.engine.runtime&&!p.engine.assets&&(d["engine/engine.json"]=p.engine));for(let[g,m]of Object.entries(p.scenes)){let h=g.startsWith("scene.")?g:`scene.${g}`;d[`scenes/${h}.json`]=m}let u=await fetch("/api/apply-current",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:d,assets:{},hadCacheAtApply:!0})});if(!u.ok){let g=await u.json();throw new Error(g.error||"Apply to current version failed")}se(),this.showSuccessNotification(),this.refreshPanel()}catch(p){console.error("[ConfigPersistence] Apply current failed:",p),alert(`\u274C Apply to current version failed: ${p.message}`),t.textContent=`\u{1F4BE} APPLY TO CURRENT VERSION (${this.currentVersion})`,t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1479
+ `}formatValue(e){return e===null?"null":typeof e=="string"?e.length>25?e.substring(0,22)+"...":e:typeof e=="object"?"{...}":String(e)}setupEventListeners(){if(!this.container)return;let e=this.container.querySelector("#create-version-btn");e==null||e.addEventListener("click",async()=>{var d;if(e.getAttribute("disabled")!==null)return;if(!Et().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
1480
+
1481
+ This will:
1482
+ \u2022 Create a new version snapshot
1483
+ \u2022 Include all current changes
1484
+ \u2022 Clear staged overrides after save
1485
+ \u2022 Set the new version as active`))try{let u=localStorage.getItem("handler_last_version_name")||"",f=((d=prompt("Version name (e.g. v1.2.0, test_2024):",u))!=null?d:"").trim();if(!f){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",f),e.textContent="\u23F3 Creating version...",e.setAttribute("disabled","true"),await ri(f),te(),this.showSuccessNotification("Version created and set as active"),await this.loadVersionsList(),this.refreshPanel()}catch(u){console.error("[ConfigPersistence] Create version failed:",u),alert(`\u274C Failed to create version: ${u.message}`),e.textContent="\u{1F4DD} SAVE AS NEW VERSION",e.removeAttribute("disabled")}});let t=this.container.querySelector("#apply-current-btn");t==null||t.addEventListener("click",async()=>{if(t.getAttribute("disabled")!==null)return;let c=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
1486
+
1487
+ This will write all staged changes to ${c}.
1488
+
1489
+ After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let d=ze(),u={};for(let[g,m]of Object.entries(d.objects)){let y=m,b=g;/^(json\.|ui\.|effects\.|engine\.)/.test(b)||(b=`json.${g}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=b),u[`objects/${b}.json`]=y}d.engine&&(d.engine.runtime&&(u["engine/engine.runtime.json"]=d.engine.runtime),d.engine.assets&&(u["engine/engine.assets.json"]=d.engine.assets),d.engine.splash&&(u["engine/engine.splash.json"]=d.engine.splash),d.engine.loading&&(u["engine/engine.loading.json"]=d.engine.loading),d.engine.start&&(u["engine/engine.start.json"]=d.engine.start),d.engine.tutorial&&(u["engine/engine.tutorial.json"]=d.engine.tutorial),d.engine.endgame&&(u["engine/engine.endgame.json"]=d.engine.endgame),!d.engine.runtime&&!d.engine.assets&&(u["engine/engine.json"]=d.engine));for(let[g,m]of Object.entries(d.scenes)){let y=g.startsWith("scene.")?g:`scene.${g}`;u[`scenes/${y}.json`]=m}let h=this.currentVersion?"/api/apply-current":"/api/apply-direct",f=await fetch(h,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:u,assets:{},hadCacheAtApply:!0})});if(!f.ok){let g=await f.json();throw new Error(g.error||"Apply to current source failed")}te(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel()}catch(d){console.error("[ConfigPersistence] Apply current failed:",d),alert(`\u274C Apply to current source failed: ${d.message}`),t.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1462
1490
 
1463
1491
  This will DIRECTLY MODIFY base configuration files.
1464
1492
 
@@ -1468,21 +1496,21 @@ This is ONLY for active development.
1468
1496
 
1469
1497
  Make sure your project is under Git version control.
1470
1498
 
1471
- Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let p=ze(),d={};for(let[g,m]of Object.entries(p.objects)){let h=m,f=g;/^(json\.|ui\.|effects\.|engine\.)/.test(f)||(f=`json.${g}`),h&&typeof h=="object"&&(h.identity||(h.identity={}),h.identity.id=f),d[`objects/${f}.json`]=h}p.engine&&(p.engine.runtime&&(d["engine/engine.runtime.json"]=p.engine.runtime),p.engine.assets&&(d["engine/engine.assets.json"]=p.engine.assets),p.engine.splash&&(d["engine/engine.splash.json"]=p.engine.splash),p.engine.loading&&(d["engine/engine.loading.json"]=p.engine.loading),p.engine.start&&(d["engine/engine.start.json"]=p.engine.start),p.engine.tutorial&&(d["engine/engine.tutorial.json"]=p.engine.tutorial),p.engine.endgame&&(d["engine/engine.endgame.json"]=p.engine.endgame),!p.engine.runtime&&!p.engine.assets&&(d["engine/engine.json"]=p.engine));for(let[g,m]of Object.entries(p.scenes)){let h=g.startsWith("scene.")?g:`scene.${g}`;d[`scenes/${h}.json`]=m}let u=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:d,assets:{}})});if(!u.ok){let g=await u.json();throw new Error(g.error||"Apply to base failed")}se(),this.showSuccessNotification(),this.refreshPanel()}catch(p){console.error("[ConfigPersistence] Apply to base failed:",p),alert(`\u274C Apply to base failed: ${p.message}`),i.textContent="\u{1F527} APPLY TO BASE (No Version)",i.removeAttribute("disabled")}});let n=this.container.querySelector("#version-selector");n==null||n.addEventListener("change",async c=>{let d=c.target.value;await this.switchVersion(d)}),this.container.querySelectorAll(".item-remove").forEach(c=>{c.addEventListener("click",()=>{let p=c.dataset.removePath,d=c.dataset.removeId;ni(d||void 0,p)})});let o=this.container.querySelector("#clear-all-overrides");o==null||o.addEventListener("click",()=>{confirm("Discard all staged changes?")&&Et()});let s=this.container.querySelector("#reset-to-applied-btn");s==null||s.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&Et()});let l=this.container.querySelector("#reset-to-original-btn");l==null||l.addEventListener("click",async()=>{await oi()})}showSuccessNotification(){let e=document.createElement("div");e.className="persistence-notification success",e.innerHTML=`
1499
+ Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let p=ze(),d={};for(let[h,f]of Object.entries(p.objects)){let g=f,m=h;/^(json\.|ui\.|effects\.|engine\.)/.test(m)||(m=`json.${h}`),g&&typeof g=="object"&&(g.identity||(g.identity={}),g.identity.id=m),d[`objects/${m}.json`]=g}p.engine&&(p.engine.runtime&&(d["engine/engine.runtime.json"]=p.engine.runtime),p.engine.assets&&(d["engine/engine.assets.json"]=p.engine.assets),p.engine.splash&&(d["engine/engine.splash.json"]=p.engine.splash),p.engine.loading&&(d["engine/engine.loading.json"]=p.engine.loading),p.engine.start&&(d["engine/engine.start.json"]=p.engine.start),p.engine.tutorial&&(d["engine/engine.tutorial.json"]=p.engine.tutorial),p.engine.endgame&&(d["engine/engine.endgame.json"]=p.engine.endgame),!p.engine.runtime&&!p.engine.assets&&(d["engine/engine.json"]=p.engine));for(let[h,f]of Object.entries(p.scenes)){let g=h.startsWith("scene.")?h:`scene.${h}`;d[`scenes/${g}.json`]=f}let u=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:d,assets:{}})});if(!u.ok){let h=await u.json();throw new Error(h.error||"Apply to base failed")}te(),this.showSuccessNotification(),this.refreshPanel()}catch(p){console.error("[ConfigPersistence] Apply to base failed:",p),alert(`\u274C Apply to base failed: ${p.message}`),i.textContent="\u{1F527} APPLY TO BASE (No Version)",i.removeAttribute("disabled")}});let n=this.container.querySelector("#version-selector");n==null||n.addEventListener("change",async c=>{let d=c.target.value;await this.switchVersion(d)}),this.container.querySelectorAll(".item-remove").forEach(c=>{c.addEventListener("click",()=>{let p=c.dataset.removePath,d=c.dataset.removeId;ai(d||void 0,p)})});let o=this.container.querySelector("#clear-all-overrides");o==null||o.addEventListener("click",()=>{confirm("Discard all staged changes?")&&St()});let s=this.container.querySelector("#reset-to-applied-btn");s==null||s.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&St()});let l=this.container.querySelector("#reset-to-original-btn");l==null||l.addEventListener("click",async()=>{await oi()})}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=`
1472
1500
  <div class="notify-icon">\u2705</div>
1473
1501
  <div class="notify-content">
1474
- <strong>Changes Applied!</strong>
1502
+ <strong>${i}</strong>
1475
1503
  <span>Project files updated.</span>
1476
1504
  </div>
1477
- `,document.body.appendChild(e),setTimeout(()=>{e.classList.add("out"),setTimeout(()=>e.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){if(confirm(`Switch to version "${e||"original"}"?
1505
+ `,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){if(confirm(`Switch to version "${e||"original"}"?
1478
1506
 
1479
- All unsaved changes in the current version will be lost.`))try{let i=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!i.ok){let n=await i.json();throw new Error(n.error||"Failed to switch version")}se(),window.location.reload()}catch(i){alert(`\u274C Failed to switch version: ${i.message}`)}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
1507
+ All unsaved changes in the current version will be lost.`))try{let i=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!i.ok){let n=await i.json();throw new Error(n.error||"Failed to switch version")}te(),window.location.reload()}catch(i){alert(`\u274C Failed to switch version: ${i.message}`)}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
1480
1508
 
1481
1509
  This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snapshot.
1482
1510
 
1483
1511
  This cannot be undone unless you have git commits or backups.
1484
1512
 
1485
- Are you absolutely sure?`))try{let t=ze(),i={};for(let[r,o]of Object.entries(t.objects)){let s=o,l=r;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${r}`),s&&typeof s=="object"&&(s.identity||(s.identity={}),s.identity.id=l),i[`objects/${l}.json`]=s}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[r,o]of Object.entries(t.scenes)){let s=r.startsWith("scene.")?r:`scene.${r}`;i[`scenes/${s}.json`]=o}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let r=await n.json();throw new Error(r.error||"Direct apply failed")}se(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Ot=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 mi;this.sceneToolsPanel=new bi;this.nudgePanel=new yi;this.inspectorPanel=new Mi;this.libraryPanel=new Ct;this.libraryPanelDocked=new Ct;this.brandVisionPanel=new ji;this.customizeSettingsPanel=new Ri;this.configPersistencePanel=new Ui;this.loadingScreenPanel=new zi}applyAssetChange(e,t){return Wr(this,e,t)}resetAsset(e){return Yr(this,e)}applySlotAsset(e,t,i){return Kr(this,e,t,i)}resetSlotAsset(e,t,i){return Xr(this,e,t,i)}startObjectVisuals(){return eo(this)}stopObjectVisuals(){return to(this)}shouldRunObjectVisuals(){return Di(this)}updateObjectVisuals(){return $i(this)}getSelectedInstanceId(){return Gn(this)}getDisplayObjectById(e){return qn(this,e)}getSelectedObjectConfig(){return _t(this)}getConfigAnchorWorldPoint(e){return Vn(this,e)}getScreenSize(){return Wn(this)}ensureBoundsGfx(){return Yn(this)}ensureAnchorGfx(){return Kn(this)}drawBounds(e){return Xn(this,e)}drawAnchor(e){return Jn(this,e)}clearBounds(){return Zn(this)}clearAnchor(){return Qn(this)}clearObjectVisuals(){return kt(this)}updateObjectInfo(e){return Lt(this,e)}resetDebugConfig(){return Ni(this)}applyDebugConfig(){return ao(this)}exportDebugConfig(){return Fi(this)}loadObjectConfig(e){return ro(this,e)}fillConfigViewer(e){return Hi(this,e)}copyConfigValues(){return oo(this)}applyObjectConfig(e){return ta(this,e)}applyCustomizeSettings(e,t){return so(this,e,t)}scheduleObjectAutoApply(){return lo(this)}setupDebugEventListeners(){return po(this)}setupDebugInputListeners(e){return ra(this,e)}setupPanelLayout(){return uo(this)}setupCollapsiblePanels(e){return oa(this,e)}setupRangeInput(e,t,i,n){return te(this,e,t,i,n)}updateWorkbenchTabs(){return aa(this)}saveWorkbenchState(){return tt(this)}loadWorkbenchState(){return Bi(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let r=localStorage.getItem("preview_workbench_state");if(r){let o=JSON.parse(r);o.activeTab&&(this.activeTab=o.activeTab)}}catch(r){console.warn("[PREVIEW] Failed to load workbench tab state",r)}this.sceneObjectsPanel.initialize(e,{onSelect:r=>this.handleObjectSelect(r)}),this.libraryPanel.initialize(e,{onApply:(r,o,s)=>this.applySlotAsset(r,o,s),onReset:(r,o,s)=>this.resetSlotAsset(r,o,s)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(r,o,s)=>this.applySlotAsset(r,o,s),onReset:(r,o,s)=>this.resetSlotAsset(r,o,s)})),this.inspectorPanel.initialize(e,{onPropertyChange:(r,o,s)=>{console.log("[Inspector] Property changed:",r,o,s)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let r="/dashboard";window.location.pathname!==r&&(window.location.href=r)}),this.customizeSettingsPanel.initialize(e,{onApply:(r,o)=>this.applyCustomizeSettings(r,o)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:r=>{this.highlightObject=r,r?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:r=>{this.highlightAnchor=r,r?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(r,o)=>this.nudgeSelectedObject(r,o),onShowSplash:()=>{let r=window;typeof r.__previewShowSplash=="function"&&r.__previewShowSplash()},onUpdateSplash:r=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({splash:r})}}),this.nudgePanel.initialize(e,{onNudge:async(r,o)=>{var g,m,h,f,y,b;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let l=(g=s.transform)==null?void 0:g.position,c=((m=l==null?void 0:l.x)!=null?m:0)+r,p=((h=l==null?void 0:l.y)!=null?h:0)+o,{applyConfigOverride:d}=await Promise.resolve().then(()=>(K(),Xe));d({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:p}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let v=window.__editableConfig,w=(b=(y=(f=v==null?void 0:v.objects)==null?void 0:f.get)==null?void 0:y.call(f,this.selectedObjectId))!=null?b:s;await u(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async r=>{var d,u,g,m,h;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let s=(u=(d=o.transform)==null?void 0:d.scale)!=null?u:1,l=Math.max(.1,s+r),{applyConfigOverride:c}=await Promise.resolve().then(()=>(K(),Xe));c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let p=window.applyEditableObjectConfig;if(typeof p=="function"){let f=window.__editableConfig,y=(h=(m=(g=f==null?void 0:f.objects)==null?void 0:g.get)==null?void 0:m.call(g,this.selectedObjectId))!=null?h:o;await p(this.selectedObjectId,y)}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 r=window;typeof r.__previewShowLoading=="function"?r.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let r=window;typeof r.__previewHideLoading=="function"?r.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:r=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({loading:r}),typeof o.__previewUpdateLoading=="function"?o.__previewUpdateLoading(r):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(r,o,s,l)=>{this.customizeSettingsPanel.openAiEditor(r,o,s,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=r=>this.selectObject(r),window.addEventListener("config:changed",r=>{var o,s;((o=r.detail)==null?void 0:o.action)!=="remove"&&((s=r.detail)==null?void 0:s.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(r,o,s)=>this.applySlotAsset(r,o,s),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var o;let r=window.getActiveConfig;if(typeof r=="function"){let s=r();return((o=s==null?void 0:s.engine)==null?void 0:o.splash)||null}return null},window.addAssetToRegistry=(r,o)=>{let s=window.getEditableAssets;if(typeof s=="function"){let l=s();if(l!=null&&l.libraryAssets&&(l.libraryAssets[r]||(l.libraryAssets[r]=[]),!l.libraryAssets[r].some(p=>p.filename===o))){let p=o.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[r].unshift({filename:o,displayName:p}),console.log(`[DEBUG] Added ${o} to registry category ${r}`)}}},window.__highlightLibrarySlot=(r,o)=>{this.libraryPanel.highlightSlot(r,o)}}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`
1513
+ Are you absolutely sure?`))try{let t=ze(),i={};for(let[r,o]of Object.entries(t.objects)){let s=o,l=r;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${r}`),s&&typeof s=="object"&&(s.identity||(s.identity={}),s.identity.id=l),i[`objects/${l}.json`]=s}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[r,o]of Object.entries(t.scenes)){let s=r.startsWith("scene.")?r:`scene.${r}`;i[`scenes/${s}.json`]=o}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let r=await n.json();throw new Error(r.error||"Direct apply failed")}te(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var It=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 mi;this.sceneToolsPanel=new bi;this.nudgePanel=new yi;this.inspectorPanel=new Mi;this.libraryPanel=new Tt;this.libraryPanelDocked=new Tt;this.brandVisionPanel=new ji;this.customizeSettingsPanel=new Ri;this.configPersistencePanel=new Ui;this.loadingScreenPanel=new zi}applyAssetChange(e,t){return Wr(this,e,t)}resetAsset(e){return Yr(this,e)}applySlotAsset(e,t,i){return Kr(this,e,t,i)}resetSlotAsset(e,t,i){return Xr(this,e,t,i)}startObjectVisuals(){return eo(this)}stopObjectVisuals(){return to(this)}shouldRunObjectVisuals(){return Di(this)}updateObjectVisuals(){return $i(this)}getSelectedInstanceId(){return Gn(this)}getDisplayObjectById(e){return qn(this,e)}getSelectedObjectConfig(){return Mt(this)}getConfigAnchorWorldPoint(e){return Vn(this,e)}getScreenSize(){return Wn(this)}ensureBoundsGfx(){return Yn(this)}ensureAnchorGfx(){return Kn(this)}drawBounds(e){return Xn(this,e)}drawAnchor(e){return Jn(this,e)}clearBounds(){return Zn(this)}clearAnchor(){return Qn(this)}clearObjectVisuals(){return Pt(this)}updateObjectInfo(e){return kt(this,e)}resetDebugConfig(){return Ni(this)}applyDebugConfig(){return ao(this)}exportDebugConfig(){return Fi(this)}loadObjectConfig(e){return ro(this,e)}fillConfigViewer(e){return Hi(this,e)}copyConfigValues(){return oo(this)}applyObjectConfig(e){return ta(this,e)}applyCustomizeSettings(e,t){return so(this,e,t)}scheduleObjectAutoApply(){return lo(this)}setupDebugEventListeners(){return po(this)}setupDebugInputListeners(e){return ra(this,e)}setupPanelLayout(){return uo(this)}setupCollapsiblePanels(e){return oa(this,e)}setupRangeInput(e,t,i,n){return ie(this,e,t,i,n)}updateWorkbenchTabs(){return aa(this)}saveWorkbenchState(){return tt(this)}loadWorkbenchState(){return Bi(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let r=localStorage.getItem("preview_workbench_state");if(r){let o=JSON.parse(r);o.activeTab&&(this.activeTab=o.activeTab)}}catch(r){console.warn("[PREVIEW] Failed to load workbench tab state",r)}this.sceneObjectsPanel.initialize(e,{onSelect:r=>this.handleObjectSelect(r)}),this.libraryPanel.initialize(e,{onApply:(r,o,s)=>this.applySlotAsset(r,o,s),onReset:(r,o,s)=>this.resetSlotAsset(r,o,s)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(r,o,s)=>this.applySlotAsset(r,o,s),onReset:(r,o,s)=>this.resetSlotAsset(r,o,s)})),this.inspectorPanel.initialize(e,{onPropertyChange:(r,o,s)=>{console.log("[Inspector] Property changed:",r,o,s)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let r="/dashboard";window.location.pathname!==r&&(window.location.href=r)}),this.customizeSettingsPanel.initialize(e,{onApply:(r,o)=>this.applyCustomizeSettings(r,o)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:r=>{this.highlightObject=r,r?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:r=>{this.highlightAnchor=r,r?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(r,o)=>this.nudgeSelectedObject(r,o),onShowSplash:()=>{let r=window;typeof r.__previewShowSplash=="function"&&r.__previewShowSplash()},onUpdateSplash:r=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({splash:r})}}),this.nudgePanel.initialize(e,{onNudge:async(r,o)=>{var h,f,g,m,y,b;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let l=(h=s.transform)==null?void 0:h.position,c=((f=l==null?void 0:l.x)!=null?f:0)+r,p=((g=l==null?void 0:l.y)!=null?g:0)+o,{applyConfigOverride:d}=await Promise.resolve().then(()=>(K(),Xe));d({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:p}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let v=window.__editableConfig,w=(b=(y=(m=v==null?void 0:v.objects)==null?void 0:m.get)==null?void 0:y.call(m,this.selectedObjectId))!=null?b:s;await u(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async r=>{var d,u,h,f,g;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let s=(u=(d=o.transform)==null?void 0:d.scale)!=null?u:1,l=Math.max(.1,s+r),{applyConfigOverride:c}=await Promise.resolve().then(()=>(K(),Xe));c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let p=window.applyEditableObjectConfig;if(typeof p=="function"){let m=window.__editableConfig,y=(g=(f=(h=m==null?void 0:m.objects)==null?void 0:h.get)==null?void 0:f.call(h,this.selectedObjectId))!=null?g:o;await p(this.selectedObjectId,y)}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 r=window;typeof r.__previewShowLoading=="function"?r.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let r=window;typeof r.__previewHideLoading=="function"?r.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:r=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({loading:r}),typeof o.__previewUpdateLoading=="function"?o.__previewUpdateLoading(r):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(r,o,s,l)=>{this.customizeSettingsPanel.openAiEditor(r,o,s,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=r=>this.selectObject(r),window.addEventListener("config:changed",r=>{var o,s;((o=r.detail)==null?void 0:o.action)!=="remove"&&((s=r.detail)==null?void 0:s.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(r,o,s)=>this.applySlotAsset(r,o,s),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var o;let r=window.getActiveConfig;if(typeof r=="function"){let s=r();return((o=s==null?void 0:s.engine)==null?void 0:o.splash)||null}return null},window.addAssetToRegistry=(r,o)=>{let s=window.getEditableAssets;if(typeof s=="function"){let l=s();if(l!=null&&l.libraryAssets&&(l.libraryAssets[r]||(l.libraryAssets[r]=[]),!l.libraryAssets[r].some(p=>p.filename===o))){let p=o.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[r].unshift({filename:o,displayName:p}),console.log(`[DEBUG] Added ${o} to registry category ${r}`)}}},window.__highlightLibrarySlot=(r,o)=>{this.libraryPanel.highlightSlot(r,o)}}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`
1486
1514
  <div class="debug-overlay hidden" id="debug-overlay">
1487
1515
  <div class="debug-workbench" id="debug-workbench">
1488
1516
  <div class="workbench-header" id="workbench-handle">
@@ -1547,7 +1575,7 @@ ${a?`
1547
1575
  ADDITIONAL RULES/NOTES:
1548
1576
  ${a}`:""}
1549
1577
  `.trim()}function go(){let a=[],e="",t=null;return{async addSources(i){let n=[];for(let r of i){let o=await el(r),s=tl(o),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:r.name,base64:s.base64,mimeType:s.mimeType,dataUrl:o};a.push(l),n.push(l)}return n},getSources(){return a.slice()},async analyze(i,n,r){if(a.length===0)throw new Error("No screenshots to analyze.");let o=il(n),s=a.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await Ii(i,o,s,{model:r}),c=e,p=[],d=l.split(`
1550
- `);for(let u of d)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let g=u.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(m=>{p.includes(m.toUpperCase())||p.push(m.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
1578
+ `);for(let u of d)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let h=u.match(/#[0-9A-Fa-f]{6}/g);h&&h.forEach(f=>{p.includes(f.toUpperCase())||p.push(f.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
1551
1579
  Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Ne="handler_api_key_";var it=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},r=`${Ne}${e}`;localStorage.setItem(r,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Ne}${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=`${Ne}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Ne}${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(Ne)){let n=i.substring(Ne.length),r=localStorage.getItem(i);if(r){let o=JSON.parse(r);e.push({service:n,label:o.label,created:o.created,lastUsed:o.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(Ne)&&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}}},sa=()=>it.getKey("gemini"),la=(a,e)=>it.setKey("gemini",a,e),nl=()=>it.hasKey("gemini");window.ApiKeyStorage=it;window.getGeminiApiKey=sa;window.setGeminiApiKey=la;window.hasGeminiApiKey=nl;var da=class{constructor(){this.modal=null;this.options=null;this.analyzer=go();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=`
1552
1580
  <div class="ai-modal-card">
1553
1581
  <div class="ai-modal-header">
@@ -1712,7 +1740,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1712
1740
  <button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
1713
1741
  </div>
1714
1742
  </div>
1715
- `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+i-r,t],[e,t+n-r],[e+i-r,t+n-r]].forEach(([s,l])=>{var c;(c=this.ctx)==null||c.fillRect(s,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,r=i/this.cropHeight,o=Math.min(n,r),s=this.cropWidth*o,l=this.cropHeight*o,c=(i-s)/2,p=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,p,s,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(a){new ha().open(a)};var Gi=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[He("playable-portrait"),He("iphone-14"),He("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=He(e.defaultDevice||ui.id),this.debugPanel=new Ot,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,r;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=He(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(r=(n=this.options).onDeviceChange)==null||r.call(n,this.getEffectivePreset()),this.emitScreenChange()}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,r=s=>{let l=s.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",s=>{s.preventDefault(),i=s.clientY,n=e.offsetHeight,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,r,o=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,p=Math.max(200,Math.min(600,r+c));e.style.width=`${p}px`;let d=this.container.querySelector(".preview-main");if(d){let g=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",m=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${g} 1fr ${m}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},s=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,r=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",s),e.classList.add("resizing")})}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
1743
+ `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+i-r,t],[e,t+n-r],[e+i-r,t+n-r]].forEach(([s,l])=>{var c;(c=this.ctx)==null||c.fillRect(s,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,r=i/this.cropHeight,o=Math.min(n,r),s=this.cropWidth*o,l=this.cropHeight*o,c=(i-s)/2,p=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,p,s,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(a){new ha().open(a)};var Gi=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[He("playable-portrait"),He("iphone-14"),He("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=He(e.defaultDevice||ui.id),this.debugPanel=new It,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,r;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=He(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(r=(n=this.options).onDeviceChange)==null||r.call(n,this.getEffectivePreset()),this.emitScreenChange()}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,r=s=>{let l=s.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},o=()=>{document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",s=>{s.preventDefault(),i=s.clientY,n=e.offsetHeight,document.addEventListener("pointermove",r),document.addEventListener("pointerup",o),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,r,o=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,p=Math.max(200,Math.min(600,r+c));e.style.width=`${p}px`;let d=this.container.querySelector(".preview-main");if(d){let h=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${h} 1fr ${f}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},s=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,r=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",s),e.classList.add("resizing")})}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
1716
1744
  <div class="preview-toolbar">
1717
1745
  <div class="preview-toolbar-left">
1718
1746
  <span class="preview-logo">PREVIEWER</span>
@@ -1873,7 +1901,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1873
1901
  </div>
1874
1902
 
1875
1903
  </div>
1876
- `,this.setupEventListeners(e),e}setupEventListeners(e){var g,m,h,f,y,b,v,w;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",E=>{if(this.viewMode==="compare")return;let x=E.target.value;this.setDevice(x)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",E=>{let x=E.target.value;this.setTheme(x)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(E=>{E.addEventListener("click",()=>{let x=E.dataset.viewToggle;x&&this.setViewMode(x)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(E=>{E.addEventListener("click",()=>{let x=E.dataset.layoutToggle;x&&this.setLayoutMode(x)})}),(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 o=e.querySelector("#bottom-dock"),s=e.querySelector("#bottom-dock-resize");o&&s&&this.makeBottomDockResizable(o,s);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(E=>{E.addEventListener("click",()=>{let x=E.dataset.dockTab;if(!x)return;l.forEach(S=>S.classList.remove("active")),E.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(S=>{let P=S.dataset.dockPanel;S.classList.toggle("active",P===x)})})}),(y=e.querySelector("#console-clear"))==null||y.addEventListener("click",()=>this.clearConsole()),(b=e.querySelector("#corner-zoom-in-btn"))==null||b.addEventListener("click",()=>this.adjustUserZoom(.1)),(v=e.querySelector("#corner-zoom-out-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(-.1)),(w=e.querySelector("#corner-grab-btn"))==null||w.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),p=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&p&&this.makeSidebarResizable(c,p,"left");let d=e.querySelector(".debug-workbench"),u=d==null?void 0:d.querySelector("#workbench-resize-v");d&&u&&this.makeSidebarResizable(d,u,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),r=Math.max(0,i.height);if(n<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=n/t.width,s=r/t.height;if(this.autoScale=Math.max(.01,Math.min(o,s)),!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}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(o=>typeof o=="object"?this.safeStringify(o):String(o)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let r=this.container.querySelector("#console-badge");if(r){let o=this.consoleMessages.filter(s=>s.type==="error").length;r.textContent=o>0?`${o}!`:"0",r.classList.toggle("has-errors",o>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let r=t.querySelector("[data-compare-slot]"),o=t.querySelector("[data-compare-ghost]"),s=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!r||!o||!s||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:r,ghost:o,wrapper:s,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var r,o;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((s,l)=>{s.root.classList.toggle("is-active",l===e),s.ghost.classList.toggle("hidden",l===e),s.focus&&(s.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(o=(r=this.options).onDeviceChange)==null||o.call(r,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let r=i/e.preset.width,o=n/e.preset.height,s=Math.max(.01,Math.min(r,o));e.wrapper.style.transform=`scale(${s})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let r=t.canvas.width,o=t.canvas.height,s=Math.min(r/i.width,o/i.height),l=i.width*s,c=i.height*s,p=(r-l)/2,d=(o-c)/2;n.clearRect(0,0,r,o),n.drawImage(i,p,d,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function fa(a={}){let e=new Gi(a);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function ma(a){try{if(a&&typeof a.keys=="function")return Array.from(a.keys())}catch{}return[]}function fo(a){var e;return a?((e=a.getDisplayObject)==null?void 0:e.call(a))||a.pixiObject||a:null}function al(a,e){if(!a||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);a.eventMode=i?"static":"none",a.interactive=i,i&&(a.cursor=t.draggable?"move":"pointer")}function mo(a,e){var l,c,p;if(!a||!e)return;let t=e.transform||{};al(a,e);let i=t.position||{},n=t.offset||{},r=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),o=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=a.position)!=null&&l.set?a.position.set(r,o):(typeof a.x=="number"&&(a.x=r),typeof a.y=="number"&&(a.y=o)),typeof t.scale=="number"&&((c=a.scale)!=null&&c.set?a.scale.set(t.scale):a.scale&&(a.scale.x=t.scale,a.scale.y=t.scale));let s=t.anchor;if(s&&((p=a.anchor)!=null&&p.set)){let d=null;typeof window!="undefined"&&window.resolveAnchorVec2?d=window.resolveAnchorVec2(s):typeof s=="object"&&s.x!==void 0&&s.y!==void 0?d=s:Array.isArray(s)&&s.length===2&&(d={x:s[0],y:s[1]}),d&&typeof d.x=="number"&&typeof d.y=="number"&&a.anchor.set(d.x,d.y)}}function bo(a){if(typeof window=="undefined")return;let e=a==null?void 0:a.objects,t=ma(e),i=r=>{try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let s=window.__HANDLER_SCREEN_INDEX,l=s==null?void 0:s.instanceToScreen;return l?r.filter(c=>l[c]===o):r}catch{return r}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(r=>n.set(r,[r])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>bo(window.__editableConfig),window.getEditableObjectList=()=>{var r;return i(ma((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return ma((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,g,m;let o=(g=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,r))!=null?g:null,s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return o;let l=window.__HANDLER_SCREEN_INDEX,c=(m=l==null?void 0:l.instanceToScreen)==null?void 0:m[r];return c&&c===s?o:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let o={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(o.assets||{})),o}return r}}function rl(){if(typeof window=="undefined")return;let a=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var r,o,s;let n=a(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(Ke(),ur))]),p=Date.now(),d=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let g=window.CustomAssets;(r=g==null?void 0:g[t])!=null&&r.texture&&(g[t].texture=u);let m=window.gameObjectManager,h=(o=m==null?void 0:m.get)==null?void 0:o.call(m,t);if(h){let f=((s=h.getDisplayObject)==null?void 0:s.call(h))||h.pixiObject||h.pixi||h;if(f!=null&&f.texture)f.texture=u;else if(f!=null&&f.children){let y=f.children.find(b=>b==null?void 0:b.texture);y!=null&&y.texture&&(y.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ce(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ce(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[r,o]of Object.entries(t.runtime))n.push({path:`runtime.${r}`,value:o});if(t.assets)for(let[r,o]of Object.entries(t.assets))n.push({path:`assets.${r}`,value:o}),typeof o=="string"&&e(r,o);if(t.splash)for(let[r,o]of Object.entries(t.splash))n.push({path:`splash.${r}`,value:o});if(t.loading)for(let[r,o]of Object.entries(t.loading))n.push({path:`loading.${r}`,value:o});if(t.start)for(let[r,o]of Object.entries(t.start))n.push({path:`start.${r}`,value:o});n.length&&Ce(n,{silent:!0,persist:!0,emitEvent:!0})}}function qi(a){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=a;t&&(t.onObjectRebuildRequired=async(r,o)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let s=t.get(r),l=s==null?void 0:s.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);s?t.remove(r):l&&l.destroy();let d=window.gameApp,u=await Se.create(r,o,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),g}),typeof window!="undefined"&&(rl(),window.applyEditableObjectConfig=(r,o)=>{var s,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let p=window.__editableConfig;(s=p==null?void 0:p.objects)!=null&&s.set&&(p.objects.set(r,o),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,r);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(o);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=fo(d);mo(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(r,o){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let s=e();(p=s==null?void 0:s.objects)!=null&&p.set&&(s.objects.set(r,o),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,r);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(o);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=fo(l);mo(u,o)}let c=[r];i==null||i(r,o,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,bo(r))}};return n.rebuildIndexes(),n}K();var wo=qe(require("lottie-web"),1);pn(cn);typeof window!="undefined"&&!window.lottie&&(window.lottie=wo.default);var nt=null,ol=async()=>{if(!nt){let a=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(a==null?void 0:a["handler.config"])||(a==null?void 0:a["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);nt=JSON.parse(i)}else nt=JSON.parse(e);return nt}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}nt=await(await fetch("./handler.config.json")).json()}return nt},wa,jt,xo,at,ya,va;function sl(a){wa=a.initGame,jt=a.CustomAssets,xo=a.updateScreenState,at=a.globalResponsiveMultipliers,ya=a.layout,va=a.clearResponsiveElements}var Vi="web_embed",It="https://example.com",yo={profile_id:Vi},Pe=null,le=null,ba={width:0,height:0},ll=!0,cl=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let a=await ol();yo={...a.ids||{},profile_id:Vi},It=a.destination_url||((p=(c=a.export_profiles)==null?void 0:c[Vi])==null?void 0:p.destination_url)||It,Oe.init({ids:yo,profile:Vi,destinationUrl:It});let e=Oe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),le=fa({onDeviceChange:m=>{console.log(`[PREVIEW] Device switched to ${m.width}x${m.height}, restarting game...`),vo()},onRefresh:vo});let g=le.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",m=>{var v,w,E,x,A,S,P,I,L,T,j;let h=window.gameApp,f=window.gameObjectManager,{width:y,height:b}=m.detail;if(ba.width=y,ba.height=b,xo(y,b),!(!h||!h.renderer)){f&&s(h,f);try{h.renderer.resize(y,b);let O=h.view;O&&(O.style.width="100%",O.style.height="100%",O.style.display="block")}catch(O){console.warn("[SCREEN] Error resizing renderer:",O);return}if(t&&f&&ya)try{let O=(v=window.__mainContainer)!=null?v:h.stage,D=(P=(S=(x=window.__tutorialLabel)!=null?x:(E=(w=f.get("label_1"))==null?void 0:w.getDisplayObject)==null?void 0:E.call(w))!=null?S:(A=f.get("label_1"))==null?void 0:A.pixiObject)!=null?P:f.get("label_1"),R=f.get("background_1"),$=(j=(T=(L=window.__background)!=null?L:(I=R==null?void 0:R.getDisplayObject)==null?void 0:I.call(R))!=null?T:R==null?void 0:R.pixiObject)!=null?j:R;if(O){let C=O===h.stage;ya({mainContainer:O,label:D,background:$,backgroundTexture:($==null?void 0:$.texture)||null,app:h},t,0,ba,f,{skipMainContainerTransform:C})}}catch(O){console.warn("[SCREEN] Error in layout:",O)}}})}let t=await be("scene.main");window.__editableConfig=t,o(),window.__editableConfigBaseline||(window.__editableConfigBaseline=G(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await be("scene.main"));let i=await wa(e,t,It,le);Pe=i.app;let n=i.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=n;try{window.__liveEditBridge=qi({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:jt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}le&&le.notifyGameLoaded();let r=window.__debugScale;r&&typeof r=="number"&&(at.scale=r,console.log(`[DEBUG] Applied persisted debug scale: ${r}`)),s(Pe,n);async function o(){try{let g=async b=>{let v=b.startsWith("/")?b:`/${b}`,w=await fetch(v,{cache:"no-cache"});if(!w.ok)return null;let E=await w.text();try{return JSON.parse(E)}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={},y={};for(let[b,v]of Object.entries(h)){let w=v==null?void 0:v.source;if(typeof w!="string")continue;let E=await g(w),x=E==null?void 0:E.elements;if(!Array.isArray(x))continue;let A=x.map(S=>S==null?void 0:S.instance_id).filter(S=>typeof S=="string");f[b]=A;for(let S of A)y[S]||(y[S]=b)}window.__HANDLER_APP_FLOW=m,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:y},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function s(g,m){if(ll){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${at.scale.toFixed(3)}`),g.stage){let f=function(y,b=0){if(!y||!y.children)return;let v=" ".repeat(b);y.children.forEach((w,E)=>{if(w&&w.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(w&&w.scale){let x=w.scale.x||1,A=w.scale.y||1;w.__originalScale||(w.__originalScale={x,y:A},console.log(`${v}[RESPONSIVE] Stored original scale for child[${E}]: ${x.toFixed(3)}, ${A.toFixed(3)}`));let S=w.__originalScale.x*at.scale,P=w.__originalScale.y*at.scale;typeof w.scale.set=="function"?w.scale.set(S,P):(w.scale.x=S,w.scale.y=P),console.log(`${v}[RESPONSIVE] Child[${E}] scale: ${x.toFixed(3)}\u2192${w.scale.x.toFixed(3)} (type: ${w.constructor.name})`),f(w,b+1)}else w&&console.log(`${v}[RESPONSIVE] Child[${E}] has no scale (type: ${w.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){at.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let m=window.gameApp,h=window.gameObjectManager;m&&h?(s(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,Oe.start()},vo=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let a=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(a){let r=((t=a.getDisplayObject)==null?void 0:t.call(a))||a;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=r.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=r.scale.y)!=null?n:1).toFixed(3)}`)}if(le){le.notifyGameDestroyed();try{va&&va()}catch(r){console.warn("Failed to clear responsive elements",r)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let r=le.getGameContainer(),o=window.gameObjectManager;if(o&&typeof o.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),o.clear()),Pe){try{Pe.destroy(!0,{children:!0,texture:!1})}catch(s){console.warn("[PREVIEW] Destroy warning:",s)}Pe=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof jt.resetScene=="function"&&jt.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{be("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=G(s)),wa(r,s,It).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=qi({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:jt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}le&&le.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Oe.start()}catch{}})})},100)},1e3)}};pi();K();var ce={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Eo=1.25,So={fontFamily:"Inter, system-ui, sans-serif"};var Wi=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=`
1904
+ `,this.setupEventListeners(e),e}setupEventListeners(e){var h,f,g,m,y,b,v,w;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",E=>{if(this.viewMode==="compare")return;let x=E.target.value;this.setDevice(x)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",E=>{let x=E.target.value;this.setTheme(x)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(E=>{E.addEventListener("click",()=>{let x=E.dataset.viewToggle;x&&this.setViewMode(x)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(E=>{E.addEventListener("click",()=>{let x=E.dataset.layoutToggle;x&&this.setLayoutMode(x)})}),(h=e.querySelector("#rotate-btn"))==null||h.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(g=e.querySelector("#zoom-out-btn"))==null||g.addEventListener("click",()=>this.adjustUserZoom(-.1)),(m=e.querySelector("#refresh-btn"))==null||m.addEventListener("click",()=>this.refresh());let o=e.querySelector("#bottom-dock"),s=e.querySelector("#bottom-dock-resize");o&&s&&this.makeBottomDockResizable(o,s);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(E=>{E.addEventListener("click",()=>{let x=E.dataset.dockTab;if(!x)return;l.forEach(S=>S.classList.remove("active")),E.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(S=>{let P=S.dataset.dockPanel;S.classList.toggle("active",P===x)})})}),(y=e.querySelector("#console-clear"))==null||y.addEventListener("click",()=>this.clearConsole()),(b=e.querySelector("#corner-zoom-in-btn"))==null||b.addEventListener("click",()=>this.adjustUserZoom(.1)),(v=e.querySelector("#corner-zoom-out-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(-.1)),(w=e.querySelector("#corner-grab-btn"))==null||w.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),p=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&p&&this.makeSidebarResizable(c,p,"left");let d=e.querySelector(".debug-workbench"),u=d==null?void 0:d.querySelector("#workbench-resize-v");d&&u&&this.makeSidebarResizable(d,u,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),r=Math.max(0,i.height);if(n<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=n/t.width,s=r/t.height;if(this.autoScale=Math.max(.01,Math.min(o,s)),!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}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(o=>typeof o=="object"?this.safeStringify(o):String(o)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let r=this.container.querySelector("#console-badge");if(r){let o=this.consoleMessages.filter(s=>s.type==="error").length;r.textContent=o>0?`${o}!`:"0",r.classList.toggle("has-errors",o>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let r=t.querySelector("[data-compare-slot]"),o=t.querySelector("[data-compare-ghost]"),s=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!r||!o||!s||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:r,ghost:o,wrapper:s,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var r,o;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((s,l)=>{s.root.classList.toggle("is-active",l===e),s.ghost.classList.toggle("hidden",l===e),s.focus&&(s.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(o=(r=this.options).onDeviceChange)==null||o.call(r,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let r=i/e.preset.width,o=n/e.preset.height,s=Math.max(.01,Math.min(r,o));e.wrapper.style.transform=`scale(${s})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let r=t.canvas.width,o=t.canvas.height,s=Math.min(r/i.width,o/i.height),l=i.width*s,c=i.height*s,p=(r-l)/2,d=(o-c)/2;n.clearRect(0,0,r,o),n.drawImage(i,p,d,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function fa(a={}){let e=new Gi(a);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function ma(a){try{if(a&&typeof a.keys=="function")return Array.from(a.keys())}catch{}return[]}function fo(a){var e;return a?((e=a.getDisplayObject)==null?void 0:e.call(a))||a.pixiObject||a:null}function al(a,e){if(!a||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);a.eventMode=i?"static":"none",a.interactive=i,i&&(a.cursor=t.draggable?"move":"pointer")}function mo(a,e){var l,c,p;if(!a||!e)return;let t=e.transform||{};al(a,e);let i=t.position||{},n=t.offset||{},r=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),o=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=a.position)!=null&&l.set?a.position.set(r,o):(typeof a.x=="number"&&(a.x=r),typeof a.y=="number"&&(a.y=o)),typeof t.scale=="number"&&((c=a.scale)!=null&&c.set?a.scale.set(t.scale):a.scale&&(a.scale.x=t.scale,a.scale.y=t.scale));let s=t.anchor;if(s&&((p=a.anchor)!=null&&p.set)){let d=null;typeof window!="undefined"&&window.resolveAnchorVec2?d=window.resolveAnchorVec2(s):typeof s=="object"&&s.x!==void 0&&s.y!==void 0?d=s:Array.isArray(s)&&s.length===2&&(d={x:s[0],y:s[1]}),d&&typeof d.x=="number"&&typeof d.y=="number"&&a.anchor.set(d.x,d.y)}}function bo(a){if(typeof window=="undefined")return;let e=a==null?void 0:a.objects,t=ma(e),i=r=>{try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let s=window.__HANDLER_SCREEN_INDEX,l=s==null?void 0:s.instanceToScreen;return l?r.filter(c=>l[c]===o):r}catch{return r}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(r=>n.set(r,[r])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>bo(window.__editableConfig),window.getEditableObjectList=()=>{var r;return i(ma((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return ma((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,h,f;let o=(h=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,r))!=null?h:null,s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return o;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[r];return c&&c===s?o:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let o={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(o.assets||{})),o}return r}}function rl(){if(typeof window=="undefined")return;let a=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var r,o,s;let n=a(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(Ke(),ur))]),p=Date.now(),d=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let h=window.CustomAssets;(r=h==null?void 0:h[t])!=null&&r.texture&&(h[t].texture=u);let f=window.gameObjectManager,g=(o=f==null?void 0:f.get)==null?void 0:o.call(f,t);if(g){let m=((s=g.getDisplayObject)==null?void 0:s.call(g))||g.pixiObject||g.pixi||g;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let y=m.children.find(b=>b==null?void 0:b.texture);y!=null&&y.texture&&(y.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ce(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ce(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[r,o]of Object.entries(t.runtime))n.push({path:`runtime.${r}`,value:o});if(t.assets)for(let[r,o]of Object.entries(t.assets))n.push({path:`assets.${r}`,value:o}),typeof o=="string"&&e(r,o);if(t.splash)for(let[r,o]of Object.entries(t.splash))n.push({path:`splash.${r}`,value:o});if(t.loading)for(let[r,o]of Object.entries(t.loading))n.push({path:`loading.${r}`,value:o});if(t.start)for(let[r,o]of Object.entries(t.start))n.push({path:`start.${r}`,value:o});n.length&&Ce(n,{silent:!0,persist:!0,emitEvent:!0})}}function qi(a){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=a;t&&(t.onObjectRebuildRequired=async(r,o)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let s=t.get(r),l=s==null?void 0:s.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);s?t.remove(r):l&&l.destroy();let d=window.gameApp,u=await Se.create(r,o,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let h=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),h}),typeof window!="undefined"&&(rl(),window.applyEditableObjectConfig=(r,o)=>{var s,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let p=window.__editableConfig;(s=p==null?void 0:p.objects)!=null&&s.set&&(p.objects.set(r,o),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,r);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(o);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=fo(d);mo(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(r,o){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let s=e();(p=s==null?void 0:s.objects)!=null&&p.set&&(s.objects.set(r,o),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,r);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(o);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=fo(l);mo(u,o)}let c=[r];i==null||i(r,o,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,bo(r))}};return n.rebuildIndexes(),n}K();var wo=qe(require("lottie-web"),1);pn(cn);typeof window!="undefined"&&!window.lottie&&(window.lottie=wo.default);var nt=null,ol=async()=>{if(!nt){let a=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(a==null?void 0:a["handler.config"])||(a==null?void 0:a["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);nt=JSON.parse(i)}else nt=JSON.parse(e);return nt}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}nt=await(await fetch("./handler.config.json")).json()}return nt},wa,Rt,xo,at,ya,va;function sl(a){wa=a.initGame,Rt=a.CustomAssets,xo=a.updateScreenState,at=a.globalResponsiveMultipliers,ya=a.layout,va=a.clearResponsiveElements}var Vi="web_embed",jt="https://example.com",yo={profile_id:Vi},Pe=null,le=null,ba={width:0,height:0},ll=!0,cl=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let a=await ol();yo={...a.ids||{},profile_id:Vi},jt=a.destination_url||((p=(c=a.export_profiles)==null?void 0:c[Vi])==null?void 0:p.destination_url)||jt,Oe.init({ids:yo,profile:Vi,destinationUrl:jt});let e=Oe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),le=fa({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),vo()},onRefresh:vo});let h=le.getGameContainer();h&&(e=h),window.addEventListener("handler-preview:screen",f=>{var v,w,E,x,A,S,P,I,L,T,j;let g=window.gameApp,m=window.gameObjectManager,{width:y,height:b}=f.detail;if(ba.width=y,ba.height=b,xo(y,b),!(!g||!g.renderer)){m&&s(g,m);try{g.renderer.resize(y,b);let O=g.view;O&&(O.style.width="100%",O.style.height="100%",O.style.display="block")}catch(O){console.warn("[SCREEN] Error resizing renderer:",O);return}if(t&&m&&ya)try{let O=(v=window.__mainContainer)!=null?v:g.stage,D=(P=(S=(x=window.__tutorialLabel)!=null?x:(E=(w=m.get("label_1"))==null?void 0:w.getDisplayObject)==null?void 0:E.call(w))!=null?S:(A=m.get("label_1"))==null?void 0:A.pixiObject)!=null?P:m.get("label_1"),R=m.get("background_1"),$=(j=(T=(L=window.__background)!=null?L:(I=R==null?void 0:R.getDisplayObject)==null?void 0:I.call(R))!=null?T:R==null?void 0:R.pixiObject)!=null?j:R;if(O){let C=O===g.stage;ya({mainContainer:O,label:D,background:$,backgroundTexture:($==null?void 0:$.texture)||null,app:g},t,0,ba,m,{skipMainContainerTransform:C})}}catch(O){console.warn("[SCREEN] Error in layout:",O)}}})}let t=await be("scene.main");window.__editableConfig=t,o(),window.__editableConfigBaseline||(window.__editableConfigBaseline=G(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(h=>setTimeout(h,100)),t=await be("scene.main"));let i=await wa(e,t,jt,le);Pe=i.app;let n=i.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=n;try{window.__liveEditBridge=qi({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Rt})}catch(h){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",h)}le&&le.notifyGameLoaded();let r=window.__debugScale;r&&typeof r=="number"&&(at.scale=r,console.log(`[DEBUG] Applied persisted debug scale: ${r}`)),s(Pe,n);async function o(){try{let h=async b=>{let v=b.startsWith("/")?b:`/${b}`,w=await fetch(v,{cache:"no-cache"});if(!w.ok)return null;let E=await w.text();try{return JSON.parse(E)}catch{return null}},f=await h("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let g=f.screens;if(!g||typeof g!="object")return;let m={},y={};for(let[b,v]of Object.entries(g)){let w=v==null?void 0:v.source;if(typeof w!="string")continue;let E=await h(w),x=E==null?void 0:E.elements;if(!Array.isArray(x))continue;let A=x.map(S=>S==null?void 0:S.instance_id).filter(S=>typeof S=="string");m[b]=A;for(let S of A)y[S]||(y[S]=b)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:y},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function s(h,f){if(ll){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${at.scale.toFixed(3)}`),h.stage){let m=function(y,b=0){if(!y||!y.children)return;let v=" ".repeat(b);y.children.forEach((w,E)=>{if(w&&w.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(w&&w.scale){let x=w.scale.x||1,A=w.scale.y||1;w.__originalScale||(w.__originalScale={x,y:A},console.log(`${v}[RESPONSIVE] Stored original scale for child[${E}]: ${x.toFixed(3)}, ${A.toFixed(3)}`));let S=w.__originalScale.x*at.scale,P=w.__originalScale.y*at.scale;typeof w.scale.set=="function"?w.scale.set(S,P):(w.scale.x=S,w.scale.y=P),console.log(`${v}[RESPONSIVE] Child[${E}] scale: ${x.toFixed(3)}\u2192${w.scale.x.toFixed(3)} (type: ${w.constructor.name})`),m(w,b+1)}else w&&console.log(`${v}[RESPONSIVE] Child[${E}] has no scale (type: ${w.constructor.name})`)})};var g=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(h.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(h){if(h!==void 0){at.scale=h,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${h.toFixed(3)}`);let f=window.gameApp,g=window.gameObjectManager;f&&g?(s(f,g),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!g}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Oe.start()},vo=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let a=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(a){let r=((t=a.getDisplayObject)==null?void 0:t.call(a))||a;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=r.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=r.scale.y)!=null?n:1).toFixed(3)}`)}if(le){le.notifyGameDestroyed();try{va&&va()}catch(r){console.warn("Failed to clear responsive elements",r)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let r=le.getGameContainer(),o=window.gameObjectManager;if(o&&typeof o.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),o.clear()),Pe){try{Pe.destroy(!0,{children:!0,texture:!1})}catch(s){console.warn("[PREVIEW] Destroy warning:",s)}Pe=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof Rt.resetScene=="function"&&Rt.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{be("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=G(s)),wa(r,s,jt).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=qi({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Rt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}le&&le.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Oe.start()}catch{}})})},100)},1e3)}};pi();K();var ce={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Eo=1.25,So={fontFamily:"Inter, system-ui, sans-serif"};var Wi=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=`
1877
1905
  position: fixed;
1878
1906
  inset: 0;
1879
1907
  display: flex;
@@ -1948,11 +1976,11 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1948
1976
  margin-top: 8px;
1949
1977
  padding: 0 4px;
1950
1978
  opacity: 0.4;
1951
- `;for(let u=0;u<9;u++){let g=document.createElement("div");g.style.cssText=`
1979
+ `;for(let u=0;u<9;u++){let h=document.createElement("div");h.style.cssText=`
1952
1980
  width: 1.5px;
1953
1981
  background-color: black;
1954
1982
  height: ${u%4===0?"6px":"2px"};
1955
- `,c.appendChild(g)}n.appendChild(r),n.appendChild(s),n.appendChild(c);let p=document.createElement("div");return p.id="handler-load-centered",p.style.cssText=`
1983
+ `,c.appendChild(h)}n.appendChild(r),n.appendChild(s),n.appendChild(c);let p=document.createElement("div");return p.id="handler-load-centered",p.style.cssText=`
1956
1984
  position: absolute;
1957
1985
  top: 48px;
1958
1986
  width: 600px;
@@ -1961,7 +1989,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1961
1989
  left: 50%;
1962
1990
  transform: translateX(-50%);
1963
1991
  overflow: visible;
1964
- `,"HANDLER".split("").forEach((u,g)=>{let m=document.createElement("div");m.textContent=u,m.style.cssText=`
1992
+ `,"HANDLER".split("").forEach((u,h)=>{let f=document.createElement("div");f.textContent=u,f.style.cssText=`
1965
1993
  position: absolute;
1966
1994
  width: 28px;
1967
1995
  height: 40px;
@@ -1975,8 +2003,8 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1975
2003
  display: flex;
1976
2004
  align-items: center;
1977
2005
  justify-content: center;
1978
- animation-delay: ${[1.05,.875,.7,.525,.35,.175,0][g]}s;
1979
- `,p.appendChild(m)}),t.appendChild(n),t.appendChild(p),this.authSeq=document.createElement("div"),this.authSeq.style.cssText=`
2006
+ animation-delay: ${[1.05,.875,.7,.525,.35,.175,0][h]}s;
2007
+ `,p.appendChild(f)}),t.appendChild(n),t.appendChild(p),this.authSeq=document.createElement("div"),this.authSeq.style.cssText=`
1980
2008
  position: absolute;
1981
2009
  bottom: 48px;
1982
2010
  font-size: 8px;
@@ -2072,7 +2100,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2072
2100
  0%, 100% { opacity: 1; }
2073
2101
  50% { opacity: 0.3; }
2074
2102
  }
2075
- `,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 xa=Ba.version,dl=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"]);Fa();var _o={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"},Mo=Math.random().toString(36).slice(2),st=null,rt={..._o},Oo="web_embed",Ca={},zt,Ea=!1,Rt=!1,$t=!1,Io=!1,Pa=1,Ki=0,Zi=!1,ve=!1,ot="",lt=Math.floor(window.innerWidth),ct=Math.floor(window.innerHeight),Ta=lt>ct,we=!1,Dt=!1,Ao=!1,Co=!1,Sa=!1,Xi=null,Fe=null,La=!1,ka=!1,Yi=new Map;function jo(){if(!Fe)return null;let a=Date.now()-Fe;return!Number.isFinite(a)||a<0?null:a}function Aa(a){if(La)return;let e=jo();e!==null&&(La=!0,k("session_time",{duration_ms:e,reason:a}))}function To(){if(st)return st;let a=document.createElement("div");return a.id="handler-root",a.setAttribute("data-handler-root","true"),document.body.appendChild(a),st=a,a}function Ji(a){switch(a){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return a}}function Ro(a,e){return{event_name:a,ts:Date.now(),session_id:Mo,deployment_id:rt.deployment_id,variant_id:rt.variant_id,export_profile_id:rt.profile_id,instance_id:rt.instance_id||"default",env:Oo==="mraid"?"mraid":"web",attribution:zt,payload:e}}function k(a,e){let t=Ji(a),i=Ro(t,e);on(i,!!Ca.analytics),Gt(t,i),t!==a&&Gt(a,i)}function Ht(){Xi&&(Xi(lt,ct),Xi=null)}function dt(a){Pa=a,k("volume",a)}function pt(a){a&&(Io=!0),!$t&&($t=!0,k("pause"),dt(0))}function Nt(a){!a&&Io||$t&&($t=!1,k("resume"),dt(Pa))}function _e(a,e){lt=Math.floor(a||window.innerWidth),ct=Math.floor(e||window.innerHeight),Ta=lt>ct,k("resize",{width:lt,height:ct})}function pl(){if(er())try{let a=mraid.getMaxSize();_e(a.width,a.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Nt():pt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();_e(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();dt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&dt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Zi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")we=!0,k("boot"),k("view"),k("ready"),ve=!0,Ht();else{let t=()=>{we=!0,k("boot"),k("view"),k("ready"),ve=!0,Ht()};mraid.addEventListener("ready",t)}}catch(a){console.warn("MRAID hook skipped",a)}}function ul(){if(tr())try{let a=dapi.getScreenSize();_e(a.width,a.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Nt():pt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();_e(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(dt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>dt(t?1:0)),Zi=!0,dapi.isViewable())we=!0,k("boot"),k("view"),k("ready"),ve=!0,Ht();else{let t=()=>{we=!0,k("boot"),k("view"),k("ready"),ve=!0,Ht()};dapi.addEventListener("ready",t)}}catch(a){console.warn("DAPI hook skipped",a)}}function Lo(){let a=()=>{we||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(we=!0,k("boot"),k("view"),k("ready"),ve=!0,Ht(),Dt&&(Dt=!1,ie.start()))};window.addEventListener("resize",()=>_e()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Nt(),a()):pt()}),document.readyState==="complete"||document.readyState==="interactive"?a():window.addEventListener("load",a),Zi=!0}function gl(){let a=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Ao=!0),!(Ao&&e instanceof MouseEvent)&&(Ki+=1,ka||(ka=!0,k("first_interaction",{count:Ki})),k("interaction",Ki))};document.addEventListener("mousedown",a),document.addEventListener("touchstart",a)}function ko(a){var i,n,r,o,s,l,c,p,d,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(a||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ye())(r=(n=window.TJ_API)==null?void 0:n.click)==null||r.call(n);else if(ir())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if(or())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(rr())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(nr()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(a||ot||""):a&&window.open(a)}else We()?(u=window.install)==null||u.call(window):ar()?(g=window.openAppStore)==null||g.call(window):sn()?(m=parent==null?void 0:parent.postMessage)==null||m.call(parent,"download","*"):a&&window.open(a)}function hl(){let a=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(a==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;X("view",()=>e(t.mraid_viewable)),X("start",()=>e(t.game_viewable)),X("engagement",()=>e(t.engagement));let i=()=>e(t.complete);X("complete",i),Ut("engagement",n=>{var r;((r=n==null?void 0:n.payload)==null?void 0:r.count)>3&&i()}),X("cta_click",()=>e(t.click))}else if(a==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;X("view",()=>e(t.Ad_Load_Start)),X("start",()=>e(t.Ad_Viewable)),X("engagement",()=>e(t.First_Engagement)),X("complete",()=>e(t.Gameplay_Complete)),X("cta_click",()=>e(t.DSP_Click)),X("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function fl(){if(!Ye())return;let a=window.TJ_API;a&&a.setPlayableAPI&&a.setPlayableAPI({skipAd:()=>{try{ie.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Po(){var e,t,i;let a=window.TJ_API;(e=a==null?void 0:a.objectiveComplete)==null||e.call(a),(t=a==null?void 0:a.playableFinished)==null||t.call(a),(i=a==null?void 0:a.gameplayFinished)==null||i.call(a)}function ml(){We()&&(window.mintGameStart=()=>{Nt(!0),_e()},window.mintGameClose=()=>{pt(!0)})}function bl(){if(!ln())return;let a=window.NUC;!a||!a.trigger||(ie.on("cta_click",()=>{var e,t;return(t=(e=a.trigger).convert)==null?void 0:t.call(e,ot)}),ie.on("complete",()=>{var e,t;return(t=(e=a.trigger).tryAgain)==null?void 0:t.call(e)}))}var ie={init(a={},e){var t;if(Oo=a.profile||"web_embed",Ca=a.consent||{},rt={..._o,...a.ids||{}},st=a.rootEl||st,zt=void 0,ja((t=a.telemetry)!=null&&t.endpoint?a.telemetry:null),Fe=null,La=!1,ka=!1,Yi.clear(),ot=a.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Xi=e),k("init"),document.body.oncontextmenu=()=>!1,To(),vl(st),sr(),pl(),ul(),!Zi){if(document.readyState==="complete")Lo();else if(!Co){Co=!0;let i=()=>{Lo(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}gl(),hl(),fl(),ml(),bl(),console.log(`%c @handler/playable-sdk %c v${xa} `,"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;"),we&&!ve&&(k("boot"),k("view"),k("ready"),Dt&&(Dt=!1,ie.start()),ve=!0),ve=we},getRoot(){return To()},get version(){return xa},get maxWidth(){return lt},get maxHeight(){return ct},get isLandscape(){return Ta},get isReady(){return ve},get isStarted(){return Ea},get isPaused(){return $t},get isFinished(){return Rt},get volume(){return Pa},get interactions(){return Ki},on(a,e){Ut(Ji(a),e)},off(a,e){rn(Ji(a),e)},start(){var a,e;if(!Ea){if(!we){Dt=!0;return}if(Ea=!0,Fe||(Fe=Date.now()),k("start"),_e(),We())pt(),(a=window.gameReady)==null||a.call(window);else if(Ye()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Ta?"landscape":"portrait",buildID:xa})}}},finish(){var a,e;Rt||(Rt=!0,k("complete"),Aa("complete"),We()?(a=window.gameEnd)==null||a.call(window):sn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ye()&&Po())},install(a){if(!Rt){Rt=!0,Ye()?(Po(),setTimeout(()=>ie.install(a),300)):(k("complete"),setTimeout(()=>ie.install(a),0));return}Sa||(Sa=!0,setTimeout(()=>Sa=!1,500),k("cta_click"),k("conversion"),Aa("cta"),ko(a||ot))},emit(a,e){let t=Ji(a);if(!dl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${a} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Ro(t,e);on(i,!!Ca.analytics),Gt(t,i)},gameStart(){ie.start()},gameEnd(){ie.finish()},ctaClick(a,e){k("cta_click",{url:a||ot,manual:!0}),(e==null?void 0:e.open)!==!1&&ko(a||ot)},ctaShow(a){k("cta_show",a)},ctaDismiss(a){k("cta_dismiss",a)},getGameTimeMs(){return jo()},endSession(a="manual"){Aa(a)},setAttribution(a){zt=a},abTest(a,e){if(!a)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(yl(`${Mo}:${a}`))%e.length,i=e[t];return zt={...zt||{},experiment_id:a},rt.variant_id=i,k("ab_assign",{experiment_id:a,variant_id:i}),i},levelStart(a,e){Fe||(Fe=Date.now()),k("level_start",{level_id:a,...e})},levelComplete(a,e){k("level_complete",{level_id:a,...e})},levelFail(a,e){k("level_fail",{level_id:a,...e})},checkpoint(a,e){k("checkpoint",{checkpoint_id:a,...e})},reward(a,e){k("reward",{reward_id:a,...e})},tutorialStart(a,e){k("tutorial_start",{step_id:a,...e})},tutorialComplete(a,e){k("tutorial_complete",{step_id:a,...e})},tutorialSkip(a,e){k("tutorial_skip",{step_id:a,...e})},timerStart(a){a&&Yi.set(a,Date.now())},timerEnd(a,e="custom",t){if(!a)return;let i=Yi.get(a);if(!i)return;Yi.delete(a);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){k("engagement",{action:"timer",key:a,duration_ms:n,...t});return}k(e,{key:a,duration_ms:n,...t})}},fps(a,e){k("fps",{value:a,...e})},memory(a,e){k("memory",{bytes:a,...e})},assetLoadStart(a,e){k("asset_load_start",{asset_id:a,...e})},assetLoadComplete(a,e){k("asset_load_complete",{asset_id:a,...e})},reportError(a,e,t){k("error",{code:a,message:e,...t})},retry(){var a,e,t;if(We())(a=window.gameRetry)==null||a.call(window);else if(ln()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}k("engagement",{action:"retry"})},pause(){pt(!0)},resume(){Nt(!0)},resize(a,e){_e(a,e)}},Oe=ie;function yl(a){let e=2166136261;for(let t=0;t<a.length;t++)e^=a.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function vl(a){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2103
+ `,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 xa=Ba.version,dl=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"]);Fa();var _o={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"},Mo=Math.random().toString(36).slice(2),st=null,rt={..._o},Oo="web_embed",Ca={},Dt,Ea=!1,zt=!1,Ht=!1,Io=!1,Pa=1,Ki=0,Zi=!1,ve=!1,ot="",lt=Math.floor(window.innerWidth),ct=Math.floor(window.innerHeight),Ta=lt>ct,we=!1,$t=!1,Ao=!1,Co=!1,Sa=!1,Xi=null,Fe=null,La=!1,ka=!1,Yi=new Map;function jo(){if(!Fe)return null;let a=Date.now()-Fe;return!Number.isFinite(a)||a<0?null:a}function Aa(a){if(La)return;let e=jo();e!==null&&(La=!0,k("session_time",{duration_ms:e,reason:a}))}function To(){if(st)return st;let a=document.createElement("div");return a.id="handler-root",a.setAttribute("data-handler-root","true"),document.body.appendChild(a),st=a,a}function Ji(a){switch(a){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return a}}function Ro(a,e){return{event_name:a,ts:Date.now(),session_id:Mo,deployment_id:rt.deployment_id,variant_id:rt.variant_id,export_profile_id:rt.profile_id,instance_id:rt.instance_id||"default",env:Oo==="mraid"?"mraid":"web",attribution:Dt,payload:e}}function k(a,e){let t=Ji(a),i=Ro(t,e);on(i,!!Ca.analytics),qt(t,i),t!==a&&qt(a,i)}function Nt(){Xi&&(Xi(lt,ct),Xi=null)}function dt(a){Pa=a,k("volume",a)}function pt(a){a&&(Io=!0),!Ht&&(Ht=!0,k("pause"),dt(0))}function Ft(a){!a&&Io||Ht&&(Ht=!1,k("resume"),dt(Pa))}function _e(a,e){lt=Math.floor(a||window.innerWidth),ct=Math.floor(e||window.innerHeight),Ta=lt>ct,k("resize",{width:lt,height:ct})}function pl(){if(er())try{let a=mraid.getMaxSize();_e(a.width,a.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Ft():pt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();_e(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();dt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&dt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),Zi=!0,mraid.isViewable()&&mraid.getState()!=="hidden")we=!0,k("boot"),k("view"),k("ready"),ve=!0,Nt();else{let t=()=>{we=!0,k("boot"),k("view"),k("ready"),ve=!0,Nt()};mraid.addEventListener("ready",t)}}catch(a){console.warn("MRAID hook skipped",a)}}function ul(){if(tr())try{let a=dapi.getScreenSize();_e(a.width,a.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Ft():pt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();_e(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(dt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>dt(t?1:0)),Zi=!0,dapi.isViewable())we=!0,k("boot"),k("view"),k("ready"),ve=!0,Nt();else{let t=()=>{we=!0,k("boot"),k("view"),k("ready"),ve=!0,Nt()};dapi.addEventListener("ready",t)}}catch(a){console.warn("DAPI hook skipped",a)}}function Lo(){let a=()=>{we||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(we=!0,k("boot"),k("view"),k("ready"),ve=!0,Nt(),$t&&($t=!1,ne.start()))};window.addEventListener("resize",()=>_e()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Ft(),a()):pt()}),document.readyState==="complete"||document.readyState==="interactive"?a():window.addEventListener("load",a),Zi=!0}function gl(){let a=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Ao=!0),!(Ao&&e instanceof MouseEvent)&&(Ki+=1,ka||(ka=!0,k("first_interaction",{count:Ki})),k("interaction",Ki))};document.addEventListener("mousedown",a),document.addEventListener("touchstart",a)}function ko(a){var i,n,r,o,s,l,c,p,d,u,h,f;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(a||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ye())(r=(n=window.TJ_API)==null?void 0:n.click)==null||r.call(n);else if(ir())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if(or())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(rr())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(g){console.warn("Smadex redirect failed",g)}else if(nr()){let g=window.ExitApi;g&&typeof g.exit=="function"?g.exit(a||ot||""):a&&window.open(a)}else We()?(u=window.install)==null||u.call(window):ar()?(h=window.openAppStore)==null||h.call(window):sn()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):a&&window.open(a)}function hl(){let a=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(a==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;X("view",()=>e(t.mraid_viewable)),X("start",()=>e(t.game_viewable)),X("engagement",()=>e(t.engagement));let i=()=>e(t.complete);X("complete",i),Gt("engagement",n=>{var r;((r=n==null?void 0:n.payload)==null?void 0:r.count)>3&&i()}),X("cta_click",()=>e(t.click))}else if(a==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;X("view",()=>e(t.Ad_Load_Start)),X("start",()=>e(t.Ad_Viewable)),X("engagement",()=>e(t.First_Engagement)),X("complete",()=>e(t.Gameplay_Complete)),X("cta_click",()=>e(t.DSP_Click)),X("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function fl(){if(!Ye())return;let a=window.TJ_API;a&&a.setPlayableAPI&&a.setPlayableAPI({skipAd:()=>{try{ne.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Po(){var e,t,i;let a=window.TJ_API;(e=a==null?void 0:a.objectiveComplete)==null||e.call(a),(t=a==null?void 0:a.playableFinished)==null||t.call(a),(i=a==null?void 0:a.gameplayFinished)==null||i.call(a)}function ml(){We()&&(window.mintGameStart=()=>{Ft(!0),_e()},window.mintGameClose=()=>{pt(!0)})}function bl(){if(!ln())return;let a=window.NUC;!a||!a.trigger||(ne.on("cta_click",()=>{var e,t;return(t=(e=a.trigger).convert)==null?void 0:t.call(e,ot)}),ne.on("complete",()=>{var e,t;return(t=(e=a.trigger).tryAgain)==null?void 0:t.call(e)}))}var ne={init(a={},e){var t;if(Oo=a.profile||"web_embed",Ca=a.consent||{},rt={..._o,...a.ids||{}},st=a.rootEl||st,Dt=void 0,ja((t=a.telemetry)!=null&&t.endpoint?a.telemetry:null),Fe=null,La=!1,ka=!1,Yi.clear(),ot=a.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Xi=e),k("init"),document.body.oncontextmenu=()=>!1,To(),vl(st),sr(),pl(),ul(),!Zi){if(document.readyState==="complete")Lo();else if(!Co){Co=!0;let i=()=>{Lo(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}gl(),hl(),fl(),ml(),bl(),console.log(`%c @handler/playable-sdk %c v${xa} `,"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;"),we&&!ve&&(k("boot"),k("view"),k("ready"),$t&&($t=!1,ne.start()),ve=!0),ve=we},getRoot(){return To()},get version(){return xa},get maxWidth(){return lt},get maxHeight(){return ct},get isLandscape(){return Ta},get isReady(){return ve},get isStarted(){return Ea},get isPaused(){return Ht},get isFinished(){return zt},get volume(){return Pa},get interactions(){return Ki},on(a,e){Gt(Ji(a),e)},off(a,e){rn(Ji(a),e)},start(){var a,e;if(!Ea){if(!we){$t=!0;return}if(Ea=!0,Fe||(Fe=Date.now()),k("start"),_e(),We())pt(),(a=window.gameReady)==null||a.call(window);else if(Ye()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Ta?"landscape":"portrait",buildID:xa})}}},finish(){var a,e;zt||(zt=!0,k("complete"),Aa("complete"),We()?(a=window.gameEnd)==null||a.call(window):sn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ye()&&Po())},install(a){if(!zt){zt=!0,Ye()?(Po(),setTimeout(()=>ne.install(a),300)):(k("complete"),setTimeout(()=>ne.install(a),0));return}Sa||(Sa=!0,setTimeout(()=>Sa=!1,500),k("cta_click"),k("conversion"),Aa("cta"),ko(a||ot))},emit(a,e){let t=Ji(a);if(!dl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${a} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Ro(t,e);on(i,!!Ca.analytics),qt(t,i)},gameStart(){ne.start()},gameEnd(){ne.finish()},ctaClick(a,e){k("cta_click",{url:a||ot,manual:!0}),(e==null?void 0:e.open)!==!1&&ko(a||ot)},ctaShow(a){k("cta_show",a)},ctaDismiss(a){k("cta_dismiss",a)},getGameTimeMs(){return jo()},endSession(a="manual"){Aa(a)},setAttribution(a){Dt=a},abTest(a,e){if(!a)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(yl(`${Mo}:${a}`))%e.length,i=e[t];return Dt={...Dt||{},experiment_id:a},rt.variant_id=i,k("ab_assign",{experiment_id:a,variant_id:i}),i},levelStart(a,e){Fe||(Fe=Date.now()),k("level_start",{level_id:a,...e})},levelComplete(a,e){k("level_complete",{level_id:a,...e})},levelFail(a,e){k("level_fail",{level_id:a,...e})},checkpoint(a,e){k("checkpoint",{checkpoint_id:a,...e})},reward(a,e){k("reward",{reward_id:a,...e})},tutorialStart(a,e){k("tutorial_start",{step_id:a,...e})},tutorialComplete(a,e){k("tutorial_complete",{step_id:a,...e})},tutorialSkip(a,e){k("tutorial_skip",{step_id:a,...e})},timerStart(a){a&&Yi.set(a,Date.now())},timerEnd(a,e="custom",t){if(!a)return;let i=Yi.get(a);if(!i)return;Yi.delete(a);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){k("engagement",{action:"timer",key:a,duration_ms:n,...t});return}k(e,{key:a,duration_ms:n,...t})}},fps(a,e){k("fps",{value:a,...e})},memory(a,e){k("memory",{bytes:a,...e})},assetLoadStart(a,e){k("asset_load_start",{asset_id:a,...e})},assetLoadComplete(a,e){k("asset_load_complete",{asset_id:a,...e})},reportError(a,e,t){k("error",{code:a,message:e,...t})},retry(){var a,e,t;if(We())(a=window.gameRetry)==null||a.call(window);else if(ln()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}k("engagement",{action:"retry"})},pause(){pt(!0)},resume(){Ft(!0)},resize(a,e){_e(a,e)}},Oe=ne;function yl(a){let e=2166136261;for(let t=0;t<a.length;t++)e^=a.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function vl(a){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2076
2104
  (function(){
2077
2105
  var events = ['touchstart','touchend','mousedown','keydown'];
2078
2106
  function unlock(){