handler-playable-sdk 0.3.61 → 0.3.62

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 Os=Object.create;var Ht=Object.defineProperty;var Is=Object.getOwnPropertyDescriptor;var js=Object.getOwnPropertyNames;var Rs=Object.getPrototypeOf,Ds=Object.prototype.hasOwnProperty;var de=(i,e)=>()=>(i&&(e=i(i=0)),e);var ft=(i,e)=>{for(var t in e)Ht(i,t,{get:e[t],enumerable:!0})},Sa=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of js(e))!Ds.call(i,a)&&a!==t&&Ht(i,a,{get:()=>e[a],enumerable:!(n=Is(e,a))||n.enumerable});return i};var Ve=(i,e,t)=>(t=i!=null?Os(Rs(i)):{},Sa(e||!i||!i.__esModule?Ht(t,"default",{value:i,enumerable:!0}):t,i)),$s=i=>Sa(Ht({},"__esModule",{value:!0}),i);var pe,oi=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 qs(){var i,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(i=document.querySelector("script"))==null?void 0:i.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),n=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(t&&!n)}catch{return!1}}async function Vs(){try{if(typeof window!="undefined"){let i=await fetch("./build-settings.json");if(i.ok){let e=await i.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function Ws(){try{if(typeof window!="undefined"){let i=new XMLHttpRequest;if(i.open("GET","./build-settings.json",!1),i.send(),i.status===200&&i.responseText){let e=JSON.parse(i.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function Ys(){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(!li){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),li=(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 n=await t.text();console.log("[AssetLoader] Received JS code, length:",n.length);let a=n.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(a)try{let r=a[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let s=new Function("return "+r)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(s)),s}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:",n.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ue=await li,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ue)),ue}function ci(i){return i===null||typeof i!="object"||(Object.freeze(i),Object.values(i).forEach(e=>ci(e))),i}function Ks(i=64,e=64,t=16711680){let n=document.createElement("canvas");n.width=i,n.height=e;let a=n.getContext("2d");return a.fillStyle=`#${t.toString(16).padStart(6,"0")}`,a.fillRect(0,0,i,e),a.strokeStyle="#000",a.strokeRect(0,0,i,e),a.fillStyle="#fff",a.font="10px sans-serif",a.textAlign="center",a.fillText("MISSING",i/2,e/2),ge.Texture.from(n)}function di(i,e){ir.set(i,e)}var ge,tr,nr,Ie,N,re,Ee,ue,li,ir,je,Gt=de(()=>{"use strict";ge=require("pixi.js");oi();tr=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",nr=qs(),Ie=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,N=nr?"publish":tr,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=Ws();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);Vs().then(i=>{i!=null&&i.buildMode&&i.buildMode!==N&&(N=i.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${N}`)),(i==null?void 0:i.assetsInlined)!==void 0&&(re=i.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${tr}, Runtime: ${nr?"publish":"dev"}, Effective: ${N}`);ue={},li=null;ir=new Map;je=class{static async load(e,t,n,a){let r=`${e}:${t.path}`,s=pe.get(r);if(s!==void 0)return s;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 o=await Ys(),l=o[e];if(!l&&a&&(l=o[a],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${a}`)),!l&&t.path){let d=t.path.split("/");if(d.length>=2){let u=d[d.length-1].split(".")[0];o[u]&&(l=o[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=ir.get(t.type);if(p)try{let d=await p(t.path,l,e,n);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=ci(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 n=N==="publish",a=n&&re!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${N}, isPublishMode: ${n}, inlineData: ${t?"EXISTS":"MISSING"}`),a){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 n=N==="publish",a=n&&re!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${N}, isPublishMode: ${n}, inlineData: ${t?"EXISTS":"MISSING"}`),a){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 s=atob(t.split(",")[1]);return JSON.parse(s)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let s=atob(t.split(",")[1]);return JSON.parse(s)}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,n){if(N==="dev"){let r=t==="image"?Ks():ci({__placeholder:!0,type:t});return pe.set(e+":"+((n==null?void 0:n.path)||"missing"),r),r}throw n}};di("image",async(i,e)=>{let t=N==="publish",n=t&&re!==!1,a=N==="brand",r=t&&re===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${a}, inlineData: ${e?"EXISTS":"MISSING"}`),n){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: ${i}`);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 s=i;return(a||r)&&i&&!i.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(s=i,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${i}" as-is`)):(s=`assets/${i}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${i}" -> "${s}"`))),ge.Assets.load(e||s)});di("json",async(i,e)=>{let t=N==="publish",n=t&&re!==!1,a=N==="brand",r=t&&re===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${a}, inlineData: ${e?"EXISTS":"MISSING"}`),n){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: ${i}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let s=i;if((a||r)&&i&&!i.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(s=i,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${i}" as-is`)):(s=`assets/${i}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${i}" -> "${s}"`))),e)return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e);let o=await fetch(s);if(!o.ok)throw new Error(`JSON fetch failed: ${i}`);return o.json()})});var rr={};ft(rr,{AssetTextures:()=>se,initAssetTextures:()=>gi});function gi(i,e){ar.init(i,e),typeof window!="undefined"&&(window.__AssetTextures=se)}var ui,ar,se,Xe=de(()=>{"use strict";Gt();ui=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(n=>{this.priorityReadyResolve=n}),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 s;console.log("[AssetTextures] Loading all assets...");let n=new Set(["background_loading_1"]),a=[],r=[];for(let[o,l]of e.objects.entries()){let c=(s=l.render)==null?void 0:s.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}: ${o} (${u})`);let g=await je.load(o,c,t,u);this.textures.set(o,g),console.log(`[AssetTextures] \u2713 Loaded: ${o}`)}catch(u){console.error(`[AssetTextures] \u2717 Failed to load: ${o}`,u)}finally{this.attempted.add(o);try{for(let u of Array.from(this.waiters))u()}catch{}}};n.has(o)?a.push(p()):r.push(p())}a.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(a),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 a=Array.from(new Set((e||[]).filter(o=>typeof o=="string"&&o))).filter(o=>{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,o);return!!((d=u==null?void 0:u.render)!=null&&d.asset)}catch{return!1}});if(a.length===0)return;this.ready().catch(()=>{});let r=()=>a.every(o=>this.textures.has(o)||this.attempted.has(o));if(r())return;let s=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(o=>{let l=!1,c=()=>{l||r()&&(l=!0,this.waiters.delete(c),o())};this.waiters.add(c),c(),s>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:a}),o())},s)})}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())}},ar=new ui,se=new Proxy(ar,{get(i,e){return e in i&&typeof i[e]=="function"?i[e].bind(i):i.get(e)},set(i,e,t){return i.set(e,t),!0}})});var Je={};ft(Je,{applyConfigOverride:()=>Se,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>an,clearConfigOverrides:()=>oe,clearConfigOverridesForObject:()=>br,configOverrideManager:()=>yr,deepClone:()=>G,exportConfigsAsJSON:()=>De,getConfigOverrides:()=>Y,getConfigStateSummary:()=>nn,getOverrideMode:()=>wt,removeConfigOverride:()=>tn,resetToApplied:()=>Et,resetToOriginal:()=>rn,setOverrideMode:()=>bi});function Qt(){return typeof window=="undefined"?null:window.__editableConfig||null}function ur(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function dr(i,e){var t,n;if(!i)return null;try{if(i instanceof Map)return(t=i.get(e))!=null?t:null;if(typeof i=="object")return(n=i[e])!=null?n:null}catch{}return null}function Eo(i,e,t){if(i){if(i instanceof Map){i.set(e,t);return}typeof i=="object"&&(i[e]=t)}}function gr(i,e){for(let t of e)xt(i,t.path,t.value)}function fr(i){var o;if(typeof window=="undefined")return;let e=Qt();if(!e)return;let t=ur(),n=(o=t?dr(t.objects,i):null)!=null?o:dr(e.objects,i);if(!n)return;let a=G(n),r=Y().filter(l=>l.objectId===i);try{gr(a,r)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",i,l);return}Eo(e.objects,i,a);let s=window.applyEditableObjectConfig;if(typeof s=="function")try{s(i,a)}catch{}}function Ao(){var a;if(typeof window=="undefined")return;let i=Qt();if(!(i!=null&&i.engine))return;let e=ur(),t=G(((a=e==null?void 0:e.engine)!=null?a:i.engine)||{}),n=Y().filter(r=>!r.objectId&&!r.sceneId);try{gr(t,n)}catch(r){console.error("[CONFIG] Failed to reapply engine overrides",r);return}try{let r=i.engine;for(let s of Object.keys(r))s in t||delete r[s];for(let[s,o]of Object.entries(t))r[s]=o}catch{i.engine=t}}function So(){if(typeof window=="undefined")return"unknown";let i=window;return typeof i.__HANDLER_PROJECT_ID=="string"?i.__HANDLER_PROJECT_ID:"handler-default"}function hr(){return`handler_preview_config_overrides::${So()}`}function Co(){if(typeof window=="undefined")return[];try{let i=window.localStorage.getItem(hr());if(!i)return[];let e=JSON.parse(i);return Array.isArray(e)?e:[]}catch{return[]}}function en(i){if(typeof window!="undefined")try{window.localStorage.setItem(hr(),JSON.stringify(i))}catch{}}function wt(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function bi(i){if(typeof window!="undefined"){window.__enableConfigOverrides=i;try{window.localStorage.setItem(mr,i?"true":"false")}catch{}}}function Se(i,e={}){var u,g;let{objectId:t,path:n,value:a}=i,{silent:r=!1,persist:s=!0,emitEvent:o=!0}=e,l=Qt();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:n,hasObjects:!!l.objects});return}r||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:n,value:a});let p;try{p=To(c,n),xt(c,n,a)}catch(h){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:n,value:a},h);return}window.__configChanges=window.__configChanges||[];let d=window.__configChanges;if(d.push({objectId:t,path:n,oldValue:p,newValue:a,ts:Date.now()}),d.length>Lo&&d.shift(),s){let h=Y(),f=h.findIndex(m=>m.objectId===t&&m.sceneId===i.sceneId&&m.path===n);f>=0?h[f].value=a:h.push(i),window.__configOverrides=h,en(h),wt()||bi(!0)}r||console.log("[CONFIG] Applied override:",i),o&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:i}))}function Ce(i,e={}){let t=e.emitEvent!==!1,n=[];for(let a of i)a!=null&&a.objectId&&typeof a.objectId=="string"&&n.push(a.objectId),Se(a,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let a=Array.from(new Set(n));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:a,count:i.length}}))}}function oe(){window.__configOverrides=[],window.__configChanges=[],en([]),console.log("[CONFIG] Cleared all overrides")}function br(i){let e=Y().filter(n=>n.objectId!==i);window.__configOverrides=e,en(e);let t=window.__configChanges||[];window.__configChanges=t.filter(n=>n.objectId!==i),fr(i),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:i}}))}function tn(i,e){let t=Y().filter(a=>a.objectId!==i||a.path!==e);window.__configOverrides=t,en(t);let n=window.__configChanges||[];window.__configChanges=n.filter(a=>a.objectId!==i||a.path!==e),i?fr(i):Ao(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:i,path:e}}))}function Y(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Co()),window.__configOverrides||[])}function xt(i,e,t){var s;let n=e.split("."),a=n.pop(),r=i;for(let o of n){if(r[o]!==void 0&&typeof r[o]!="object")throw new Error(`Invalid override path: ${e} (hit primitive at ${o})`);r[o]=(s=r[o])!=null?s:{},r=r[o]}r[a]=t}function To(i,e){return e.split(".").reduce((t,n)=>t?t[n]:void 0,i)}function G(i){if(i===null||typeof i!="object")return i;if(i instanceof Date)return new Date(i.getTime());if(i instanceof Set)return new Set([...i].map(t=>G(t)));if(ArrayBuffer.isView(i))return i.slice();if(i instanceof Array)return i.map(t=>G(t));if(i instanceof Map){let t=new Map;return i.forEach((n,a)=>t.set(a,G(n))),t}let e={};for(let t in i)Object.prototype.hasOwnProperty.call(i,t)&&(e[t]=G(i[t]));return e}function De(){let i=window.__editableConfigBaseline;if(!i){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return pr(e)}return pr(i)}function pr(i){let e={objects:{},scenes:{},engine:G(i.engine||{})},t=i.objects;if(t instanceof Map)t.forEach((r,s)=>{e.objects[s]=G(r)});else if(t&&typeof t=="object")for(let r in t)e.objects[r]=G(t[r]);let n=i.scenes;if(n instanceof Map)n.forEach((r,s)=>{e.scenes[s]=G(r)});else if(n&&typeof n=="object")for(let r in n)e.scenes[r]=G(n[r]);let a=Y();for(let r of a)r.objectId?(e.objects[r.objectId]||(e.objects[r.objectId]={}),xt(e.objects[r.objectId],r.path,r.value)):r.sceneId?(e.scenes[r.sceneId]||(e.scenes[r.sceneId]={}),xt(e.scenes[r.sceneId],r.path,r.value)):xt(e.engine,r.path,r.value);return e}function nn(){let i=Y(),e=new Set;for(let t of i)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:i.length,hasChanges:i.length>0,overrides:i}}async function an(i){let e=De(),t={};for(let[a,r]of Object.entries(e.objects)){let s=r,o=a;/^(json\.|ui\.|effects\.|engine\.)/.test(o)||(o=`json.${a}`),s&&typeof s=="object"&&(s.identity||(s.identity={}),s.identity.id=o),t[`objects/${o}.json`]=s}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[a,r]of Object.entries(e.scenes)){let s=a.startsWith("scene.")?a:`scene.${a}`;t[`scenes/${s}.json`]=r}let n=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Y().length>0,versionName:i})});if(!n.ok){let a=await n.json();throw new Error(`Apply failed: ${a.error||"Unknown error"}`)}oe();try{let a=Qt();a&&(window.__editableConfigBaseline=G(a))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function Et(){oe(),window.location.reload()}async function rn(){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"}`)}oe(),window.location.reload()}var mr,Lo,yr,K=de(()=>{"use strict";mr="handler_preview_override_mode";if(typeof window!="undefined"){let i=window.localStorage.getItem(mr);window.__enableConfigOverrides=i===null?!0:i==="true"}Lo=500;yr={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[]}}});function _o(i,e){try{if(typeof i=="object"&&i!==null)return i;if(typeof i!="string")return null;if(i.startsWith("data:")){let n=i.indexOf(",");if(n===-1)return null;let a=i.slice(0,n);if(!a.includes("application/json")&&!a.includes("text/plain"))return null;let r=i.slice(n+1),s=a.includes("base64")?typeof atob=="function"?atob(r):r:decodeURIComponent(r);return JSON.parse(s)}let t=i.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(i):null}catch{return null}}function Po(i){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=i.replace(/^\.\/+/,""),n=t.split("/").pop()||t,a=[t,n,t.replace(/\.json$/,""),n.replace(/\.json$/,"")];for(let r of a){let s=e[r];if(s){let o=_o(s,r);if(o!==null)return o}}return null}async function At(i){if(yi.has(i)&&!vi)return console.log(`[CONFIG] Using cached config for: "${i}"`),yi.get(i);if(console.log(`[CONFIG] loadConfigFile called with: "${i}", MODE: ${z.toUpperCase()}, CACHE: ${vi?"DISABLED":"ENABLED"}`),z==="publish"){let n=Po(i);return n?(console.log(`[CONFIG] \u2713 Loaded ${i} via INLINE_ASSETS`),n):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${i} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}z==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${i}"`);let e;z==="brand"?e=[`./${i.split("/").pop()||i}`,`./${i}`,`./${i.replace(/^configs\//,"")}`,`./${i.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${i}`,`./${i.replace(/^configs\//,"")}`,`./${i.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(n=>n.startsWith("./")?[n,`/${n.slice(2)}`]:n.startsWith("/")?[n]:[n,`/${n}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let n=vi?"no-store":"force-cache";for(let a of e)try{let r=await fetch(a,{cache:n});if(!r.ok)continue;let s=await r.json();return console.log(`[CONFIG] \u2713 Loaded ${i} via ${a}`,s),s}catch(r){console.warn(`[CONFIG] \u2717 Failed to load ${a} (mode: ${z}):`,r)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${i}; using defaults`),{}})();return yi.set(i,t),t}async function sn(){console.log("[CONFIG] Loading component schemas...");let i=["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 i)try{let n=z==="publish"||z==="brand"?t.split("/").pop()||t:`configs/${t}`,a=await At(n);a.component&&(e.set(a.component,a),console.log(`[CONFIG] \u2713 Schema loaded: ${a.component} ${z==="publish"||z==="brand"?"(flattened)":"(nested)"}`))}catch(n){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,n)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function Le(i){console.log(`[CONFIG] Loading object config: ${i}`);let e=z==="publish"||z==="brand"?`${i}.json`:`configs/objects/${i}.json`;return await At(e)}async function on(i){let e=new Map;if(i.objects&&Array.isArray(i.objects)){for(let t of i.objects)if(t.enabled&&t.object_config)try{let n=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(n)||(n=`json.${n}`);let a=await Le(n);(!a||Object.keys(a).length===0)&&n!==t.instance_id&&(a=await Le(t.instance_id)),!a||Object.keys(a).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),a=await Le(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...a,instance_id:t.instance_id,object_config:t.object_config})}catch(n){console.warn(`Failed to load object ${t.object_config}:`,n)}}return e}async function ln(){console.log("[CONFIG] Loading engine configs...");let i=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(i.map(n=>{let a=`engine.${n}.json`,r=z==="publish"||z==="brand"?a:`configs/engine/${a}`;return At(r)})),t=Object.fromEntries(i.map((n,a)=>[n,e[a]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(i.map(n=>{var s;let a=(s=t[n])!=null?s:{},r=Object.keys(a);return[n,r.length>0?r:"empty"]}))),t}async function xi(){return await At(z==="publish"||z==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function cn(i="scene.main"){console.log(`[CONFIG] Loading scene config: ${i}`);let e=z==="publish"||z==="brand"?`${i}.json`:`configs/scenes/${i}.json`;return await At(e)}function Ze(i,e){let t=[];if(!i.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let n=e.get("identity");if(n)for(let a of n.required||[])i.identity[a]||t.push(`Missing required identity field: ${a}`);for(let[a,r]of Object.entries(i)){if(a==="identity")continue;let s=e.get(a);if(s&&r&&typeof r=="object"){let o=r;for(let l of s.required||[])o[l]===void 0&&t.push(`Missing required field in ${a}: ${l}`);if(s.constraints&&typeof s.constraints=="object")for(let[l,c]of Object.entries(s.constraints)){let p=o[l];if(p!==void 0&&c&&typeof c=="object"){let d=c;typeof p=="number"&&(d.min!==void 0&&p<d.min&&t.push(`${a}.${l} value ${p} is below minimum ${d.min}`),d.max!==void 0&&p>d.max&&t.push(`${a}.${l} value ${p} is above maximum ${d.max}`))}}}}return{valid:t.length===0,errors:t}}function $e(i,e){let t={...i},n=["identity","transform","render"];for(let[a,r]of e.entries())r.defaults&&Object.keys(r.defaults).length>0&&(n.includes(a)||t[a])&&(t[a]||(t[a]={}),t[a]={...r.defaults,...t[a]});return t}function Q(i,e,t,n){return typeof i!="number"||!Number.isFinite(i)?e:Math.min(Math.max(i,t),n)}function xr(i,e){if(Array.isArray(i))return{x:Q(i[0],e.x,-2e3,2e3),y:Q(i[1],e.y,-2e3,2e3)};if(!i||typeof i!="object")return e;let{x:t,y:n}=i;return{x:Q(t,e.x,-2e3,2e3),y:Q(n,e.y,-2e3,2e3)}}function ko(i,e){if(Array.isArray(i))return{x:Q(i[0],e.x,0,1),y:Q(i[1],e.y,0,1)};if(!i||typeof i!="object")return e;let{x:t,y:n}=i;return{x:Q(t,e.x,0,1),y:Q(n,e.y,0,1)}}function Mo(i){if(Array.isArray(i))return{x:Q(i[0],.5,-10,10),y:Q(i[1],.5,-10,10)};if(i&&typeof i=="object"){let{x:e,y:t}=i;return{x:Q(e,.5,-10,10),y:Q(t,.5,-10,10)}}return typeof i=="string"?i:null}async function be(i="scene.main",e){var l,c,p,d,u,g,h,f,m,b,y,v,x,w;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await sn(),n=Y();n.length>0&&console.log(`[CONFIG] Applying ${n.length} active overrides`);let a=await cn(i);console.log(`[CONFIG] Scene config loaded: ${((l=a.objects)==null?void 0:l.length)||0} objects`);let r=await ln();console.log("[CONFIG] Loading object configs...");let s=await on(a);console.log(`[CONFIG] Loaded ${s.size} object configs:`,Array.from(s.keys()));for(let[E,C]of s.entries()){let S=$e(C,t),O=Ze(S,t);O.valid||console.warn(`Object ${E} validation errors:`,O.errors),(c=S.transform)!=null&&c.position&&(S.transform.position=xr(S.transform.position,{x:0,y:0})),(p=S.transform)!=null&&p.offset&&(S.transform.offset=xr(S.transform.offset,{x:0,y:0})),((d=S.transform)==null?void 0:d.anchor)!==void 0&&(S.transform.anchor=Mo(S.transform.anchor)),((u=S.transform)==null?void 0:u.position_ratio)!==void 0&&S.transform.position_ratio!==null&&(S.transform.position_ratio=ko(S.transform.position_ratio,{x:.5,y:.5})),s.set(E,S)}if(e){if(e.objects)for(let[E,C]of e.objects.entries())s.set(E,C);e.engine&&(r.runtime={...r.runtime,...e.engine.runtime},r.assets={...r.assets,...e.engine.assets},r.splash={...(g=r.splash)!=null?g:{},...(h=e.engine.splash)!=null?h:{}})}let o={objects:s,engine:r,scene:a,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=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=$e(o,t))),n.length>0&&wt()&&Ce(n,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(s.keys()),engine:{runtime:Object.keys((f=r.runtime)!=null?f:{}),assets:Object.keys((m=r.assets)!=null?m:{}),splash:Object.keys((b=r.splash)!=null?b:{}),loading:Object.keys((y=r.loading)!=null?y:{}),start:Object.keys((v=r.start)!=null?v:{}),tutorial:Object.keys((x=r.tutorial)!=null?x:{}),endgame:Object.keys((w=r.endgame)!=null?w:{})},scene:a.scene_id||"unknown"}),o}function wi(i){var t,n,a,r,s,o,l,c,p,d,u,g,h,f,m,b,y,v,x,w,E,C,S,O,B,k,L,I,M,D,j,$,A;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[_,P]of i.objects.entries()){let q=((t=P.identity)==null?void 0:t.id)||_;q.includes("character")&&(e.gameplay.character_pos=((n=P.transform)==null?void 0:n.position)||{x:0,y:0},e.gameplay.character_scale=((a=P.transform)==null?void 0:a.scale)||1,e.gameplay.character_anim_speed=((s=(r=P.gameplay)==null?void 0:r.tuning)==null?void 0:s.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(o=P.gameplay)==null?void 0:o.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((p=(c=P.gameplay)==null?void 0:c.tuning)==null?void 0:p.relief_speed)||.22),(q.includes("gun")||q.includes("flame"))&&(e.gameplay.gun=P.gun||{},e.gameplay.gunmuzzle=((d=P.effects)==null?void 0:d.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=P.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=P.effects)==null?void 0:g.flame)||{}),q.includes("diamond")&&(e.gameplay.diamond=P),q.includes("ice")&&(e.gameplay.melt=P.melt||{},e.gameplay.melt_anchor=((h=P.transform)==null?void 0:h.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((f=P.transform)==null?void 0:f.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=P.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((b=P.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=P.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=P.hard_ice||{}),q.includes("water")&&(e.gameplay.water_drops=P),q.includes("crack")&&(e.gameplay.crack=P),q.includes("hand")&&(e.gameplay.hand=((v=P.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((x=P.transform)==null?void 0:x.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((w=P.transform)==null?void 0:w.scale)||1.5),q.includes("hazard")&&(e.gameplay.hazard=((E=P.gameplay)==null?void 0:E.tuning)||{},e.gameplay.danger_pos=((C=P.transform)==null?void 0:C.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((O=(S=P.gameplay)==null?void 0:S.tuning)==null?void 0:O.danger_pulse)||{},e.gameplay.hazard_height=((k=(B=P.gameplay)==null?void 0:B.tuning)==null?void 0:k.hazard_height)||140)}return e.gameplay.timeline=((L=i.engine.runtime)==null?void 0:L.timeline)||{},e.gameplay.drag_surface=((I=i.engine.runtime)==null?void 0:I.drag_surface)||{},e.gameplay.background=((M=i.engine.runtime)==null?void 0:M.background)||{},e.gameplay.ui_styles=((D=i.engine.runtime)==null?void 0:D.ui_styles)||{},e.gameplay.label_pulse=((j=i.engine.runtime)==null?void 0:j.label_pulse)||{},e.ui=(($=i.engine.runtime)==null?void 0:$.ui)||{},e.theme=((A=i.engine.runtime)==null?void 0:A.theme)||{},e.assets=i.engine.assets||{},e}var vr,z,yi,vi,Ei=de(()=>{"use strict";K();vr=null,z="dev";if(typeof window!="undefined"){let i=window.__BUILD_SETTINGS__;if(i!=null&&i.buildMode)vr=i,z=i.buildMode,console.log("[CONFIG] Loaded inline build settings:",i,"buildMode:",z);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);vr=t,z=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",z)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",z)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",z);yi=new Map,vi=z==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function Ai(i,e){let t=[];function n(a,r,s=""){if(a!==r){if(typeof a!=typeof r){t.push(`${s}: type changed`);return}if(typeof a=="object"&&a!==null&&r!==null){let o=new Set([...Object.keys(a),...Object.keys(r)]);for(let l of o){let c=s?`${s}.${l}`:l;l in a?l in r?n(a[l],r[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${s}: changed`)}}return n(i,e),t}function Si(i,e,t,n){let a={...t};for(let[r,s]of n.entries())a[r]&&s.defaults&&(a[r]={...s.defaults,...a[r]});return a}var St,ze,Ci=de(()=>{"use strict";St=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},ze=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 n=`${e}?t=${Date.now()}&r=${Math.random()}`,a=await fetch(n,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(a.ok){let r=await a.text(),s=this.hashString(r),o=this.fileHashes.get(e);if(o&&o!==s&&console.log(`[HOT-RELOAD] File changed: ${e}`),o&&o!==s){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,s)}else o||this.fileHashes.set(e,s)}}catch(n){console.warn(`Failed to check ${e}:`,n)}}determineEventType(e){var t,n;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:(n=e.split("/").pop())==null?void 0:n.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let n=0;n<e.length;n++){let a=e.charCodeAt(n);t=(t<<5)-t+a,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 Ti(i){if(typeof window=="undefined")return;let e=typeof Li!="undefined"&&!!Li.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let a=null,r=!1,s=null;if(t){s=new ze;let h=window.__configWatcher;h!=null&&h.stop&&h.stop(),window.__configWatcher=s}let o=new Set,l=h=>{var b,y;if(!s)return;let f=new Set;f.add("configs/engine/engine.runtime.json"),f.add("configs/engine/engine.assets.json"),f.add("configs/engine/engine.splash.json"),f.add("configs/scenes/scene.main.json");let m=(y=(b=h.scene)==null?void 0:b.objects)!=null?y:[];for(let v of m)v!=null&&v.object_config&&f.add(`configs/objects/${v.object_config}.json`);for(let v of o)f.has(v)||s.unwatch(v);for(let v of f)o.has(v)||s.watch(v,x=>g(x));o=f},c=new Set,p=!1,d=async h=>{let f=await Le(h),m=$e(f,i.activeConfig.schemas),b=Ze(m,i.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${h} validation errors:`,b.errors),await i.liveEditBridge.applyObjectConfig(h,m)};async function u(h){if(!r){r=!0;try{if(p||c.size===0){i.audioSystem.destroy();let f=await be("scene.main");i.setActiveConfig(f),i.gameObjectManager.updateConfig(f),i.CustomAssets.updateConfig(f),await i.CustomAssets.ready();let m=i.createAudioSystem(f);i.setAudioSystem(m),window.__audioSystem=m,await m.start(),i.liveEditBridge.rebuildIndexes(),l(f),console.log(`[GAME] Hot-reload complete (${h})`)}else{let f=Array.from(c);c.clear();for(let m of f)await d(m);console.log(`[GAME] Hot-reload updated objects: ${f.join(", ")}`)}}catch(f){console.warn("[GAME] Hot-reload failed:",f)}finally{r=!1,p=!1,c.clear()}}}function g(h){h.type==="object"&&h.objectId?c.add(h.objectId):p=!0,a&&window.clearTimeout(a),a=window.setTimeout(()=>{u(h.type)},120)}e&&Li.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(i.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${o.size} files)`))}var Li,wr=de(()=>{"use strict";Ci();Ei();Li={}});var Er={};ft(Er,{ConfigWatcher:()=>ze,DefaultReloadStrategy:()=>St,applyDefaults:()=>$e,diffConfigs:()=>Ai,loadAllObjectConfigs:()=>on,loadComponentSchemas:()=>sn,loadEngineConfig:()=>ln,loadGamePromptConfig:()=>xi,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Le,loadSceneConfig:()=>cn,rehydrateObject:()=>Si,setupHotReload:()=>Ti,toLegacyFormat:()=>wi,validateObjectConfig:()=>Ze});var dn=de(()=>{"use strict";Ei();Ci();wr()});var os={};ft(os,{AssetEditorModal:()=>aa});var aa,ra=de(()=>{"use strict";aa=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,n,a){this.currentObjectId=e,this.currentPath=t,this.currentAsset=n,this.onApplyCallback=a,this.createModal(e,n),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let n=document.createElement("div");n.className="asset-editor-modal",n.innerHTML=`
1
+ "use strict";var Io=Object.create;var Ht=Object.defineProperty;var jo=Object.getOwnPropertyDescriptor;var Ro=Object.getOwnPropertyNames;var Do=Object.getPrototypeOf,$o=Object.prototype.hasOwnProperty;var de=(i,e)=>()=>(i&&(e=i(i=0)),e);var ft=(i,e)=>{for(var t in e)Ht(i,t,{get:e[t],enumerable:!0})},Sa=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Ro(e))!$o.call(i,a)&&a!==t&&Ht(i,a,{get:()=>e[a],enumerable:!(n=jo(e,a))||n.enumerable});return i};var Ve=(i,e,t)=>(t=i!=null?Io(Do(i)):{},Sa(e||!i||!i.__esModule?Ht(t,"default",{value:i,enumerable:!0}):t,i)),zo=i=>Sa(Ht({},"__esModule",{value:!0}),i);var pe,si=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 Vo(){var i,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(i=document.querySelector("script"))==null?void 0:i.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),n=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(t&&!n)}catch{return!1}}async function Wo(){try{if(typeof window!="undefined"){let i=await fetch("./build-settings.json");if(i.ok){let e=await i.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function Yo(){try{if(typeof window!="undefined"){let i=new XMLHttpRequest;if(i.open("GET","./build-settings.json",!1),i.send(),i.status===200&&i.responseText){let e=JSON.parse(i.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function Ko(){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(!li){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),li=(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 n=await t.text();console.log("[AssetLoader] Received JS code, length:",n.length);let a=n.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(a)try{let r=a[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:",n.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ue=await li,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ue)),ue}function ci(i){return i===null||typeof i!="object"||(Object.freeze(i),Object.values(i).forEach(e=>ci(e))),i}function Xo(i=64,e=64,t=16711680){let n=document.createElement("canvas");n.width=i,n.height=e;let a=n.getContext("2d");return a.fillStyle=`#${t.toString(16).padStart(6,"0")}`,a.fillRect(0,0,i,e),a.strokeStyle="#000",a.strokeRect(0,0,i,e),a.fillStyle="#fff",a.font="10px sans-serif",a.textAlign="center",a.fillText("MISSING",i/2,e/2),ge.Texture.from(n)}function di(i,e){ir.set(i,e)}var ge,tr,nr,Ie,N,re,Ee,ue,li,ir,je,Gt=de(()=>{"use strict";ge=require("pixi.js");si();tr=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",nr=Vo(),Ie=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,N=nr?"publish":tr,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=Yo();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);Wo().then(i=>{i!=null&&i.buildMode&&i.buildMode!==N&&(N=i.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${N}`)),(i==null?void 0:i.assetsInlined)!==void 0&&(re=i.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${tr}, Runtime: ${nr?"publish":"dev"}, Effective: ${N}`);ue={},li=null;ir=new Map;je=class{static async load(e,t,n,a){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 Ko(),l=s[e];if(!l&&a&&(l=s[a],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${a}`)),!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=ir.get(t.type);if(p)try{let d=await p(t.path,l,e,n);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=ci(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 n=N==="publish",a=n&&re!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${N}, isPublishMode: ${n}, inlineData: ${t?"EXISTS":"MISSING"}`),a){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 n=N==="publish",a=n&&re!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${N}, isPublishMode: ${n}, inlineData: ${t?"EXISTS":"MISSING"}`),a){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,n){if(N==="dev"){let r=t==="image"?Xo():ci({__placeholder:!0,type:t});return pe.set(e+":"+((n==null?void 0:n.path)||"missing"),r),r}throw n}};di("image",async(i,e)=>{let t=N==="publish",n=t&&re!==!1,a=N==="brand",r=t&&re===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${a}, inlineData: ${e?"EXISTS":"MISSING"}`),n){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: ${i}`);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=i;return(a||r)&&i&&!i.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=i,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${i}" as-is`)):(o=`assets/${i}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${i}" -> "${o}"`))),ge.Assets.load(e||o)});di("json",async(i,e)=>{let t=N==="publish",n=t&&re!==!1,a=N==="brand",r=t&&re===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${a}, inlineData: ${e?"EXISTS":"MISSING"}`),n){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: ${i}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let o=i;if((a||r)&&i&&!i.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=i,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${i}" as-is`)):(o=`assets/${i}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${i}" -> "${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: ${i}`);return s.json()})});var rr={};ft(rr,{AssetTextures:()=>oe,initAssetTextures:()=>gi});function gi(i,e){ar.init(i,e),typeof window!="undefined"&&(window.__AssetTextures=oe)}var ui,ar,oe,Xe=de(()=>{"use strict";Gt();ui=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(n=>{this.priorityReadyResolve=n}),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 n=new Set(["background_loading_1"]),a=[],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{}}};n.has(s)?a.push(p()):r.push(p())}a.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(a),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 a=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(a.length===0)return;this.ready().catch(()=>{});let r=()=>a.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:a}),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())}},ar=new ui,oe=new Proxy(ar,{get(i,e){return e in i&&typeof i[e]=="function"?i[e].bind(i):i.get(e)},set(i,e,t){return i.set(e,t),!0}})});var Je={};ft(Je,{applyConfigOverride:()=>Se,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>an,clearConfigOverrides:()=>se,clearConfigOverridesForObject:()=>br,configOverrideManager:()=>yr,deepClone:()=>G,exportConfigsAsJSON:()=>De,getConfigOverrides:()=>Y,getConfigStateSummary:()=>nn,getOverrideMode:()=>wt,removeConfigOverride:()=>tn,resetToApplied:()=>Et,resetToOriginal:()=>rn,setOverrideMode:()=>bi});function Qt(){return typeof window=="undefined"?null:window.__editableConfig||null}function ur(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function dr(i,e){var t,n;if(!i)return null;try{if(i instanceof Map)return(t=i.get(e))!=null?t:null;if(typeof i=="object")return(n=i[e])!=null?n:null}catch{}return null}function Es(i,e,t){if(i){if(i instanceof Map){i.set(e,t);return}typeof i=="object"&&(i[e]=t)}}function gr(i,e){for(let t of e)xt(i,t.path,t.value)}function fr(i){var s;if(typeof window=="undefined")return;let e=Qt();if(!e)return;let t=ur(),n=(s=t?dr(t.objects,i):null)!=null?s:dr(e.objects,i);if(!n)return;let a=G(n),r=Y().filter(l=>l.objectId===i);try{gr(a,r)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",i,l);return}Es(e.objects,i,a);let o=window.applyEditableObjectConfig;if(typeof o=="function")try{o(i,a)}catch{}}function As(){var a;if(typeof window=="undefined")return;let i=Qt();if(!(i!=null&&i.engine))return;let e=ur(),t=G(((a=e==null?void 0:e.engine)!=null?a:i.engine)||{}),n=Y().filter(r=>!r.objectId&&!r.sceneId);try{gr(t,n)}catch(r){console.error("[CONFIG] Failed to reapply engine overrides",r);return}try{let r=i.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{i.engine=t}}function Ss(){if(typeof window=="undefined")return"unknown";let i=window;return typeof i.__HANDLER_PROJECT_ID=="string"?i.__HANDLER_PROJECT_ID:"handler-default"}function hr(){return`handler_preview_config_overrides::${Ss()}`}function Cs(){if(typeof window=="undefined")return[];try{let i=window.localStorage.getItem(hr());if(!i)return[];let e=JSON.parse(i);return Array.isArray(e)?e:[]}catch{return[]}}function en(i){if(typeof window!="undefined")try{window.localStorage.setItem(hr(),JSON.stringify(i))}catch{}}function wt(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function bi(i){if(typeof window!="undefined"){window.__enableConfigOverrides=i;try{window.localStorage.setItem(mr,i?"true":"false")}catch{}}}function Se(i,e={}){var u,g;let{objectId:t,path:n,value:a}=i,{silent:r=!1,persist:o=!0,emitEvent:s=!0}=e,l=Qt();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:n,hasObjects:!!l.objects});return}r||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:n,value:a});let p;try{p=Ts(c,n),xt(c,n,a)}catch(h){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:n,value:a},h);return}window.__configChanges=window.__configChanges||[];let d=window.__configChanges;if(d.push({objectId:t,path:n,oldValue:p,newValue:a,ts:Date.now()}),d.length>Ls&&d.shift(),o){let h=Y(),f=h.findIndex(m=>m.objectId===t&&m.sceneId===i.sceneId&&m.path===n);f>=0?h[f].value=a:h.push(i),window.__configOverrides=h,en(h),wt()||bi(!0)}r||console.log("[CONFIG] Applied override:",i),s&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:i}))}function Ce(i,e={}){let t=e.emitEvent!==!1,n=[];for(let a of i)a!=null&&a.objectId&&typeof a.objectId=="string"&&n.push(a.objectId),Se(a,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let a=Array.from(new Set(n));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:a,count:i.length}}))}}function se(){window.__configOverrides=[],window.__configChanges=[],en([]),console.log("[CONFIG] Cleared all overrides")}function br(i){let e=Y().filter(n=>n.objectId!==i);window.__configOverrides=e,en(e);let t=window.__configChanges||[];window.__configChanges=t.filter(n=>n.objectId!==i),fr(i),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:i}}))}function tn(i,e){let t=Y().filter(a=>a.objectId!==i||a.path!==e);window.__configOverrides=t,en(t);let n=window.__configChanges||[];window.__configChanges=n.filter(a=>a.objectId!==i||a.path!==e),i?fr(i):As(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:i,path:e}}))}function Y(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Cs()),window.__configOverrides||[])}function xt(i,e,t){var o;let n=e.split("."),a=n.pop(),r=i;for(let s of n){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[a]=t}function Ts(i,e){return e.split(".").reduce((t,n)=>t?t[n]:void 0,i)}function G(i){if(i===null||typeof i!="object")return i;if(i instanceof Date)return new Date(i.getTime());if(i instanceof Set)return new Set([...i].map(t=>G(t)));if(ArrayBuffer.isView(i))return i.slice();if(i instanceof Array)return i.map(t=>G(t));if(i instanceof Map){let t=new Map;return i.forEach((n,a)=>t.set(a,G(n))),t}let e={};for(let t in i)Object.prototype.hasOwnProperty.call(i,t)&&(e[t]=G(i[t]));return e}function De(){let i=window.__editableConfigBaseline;if(!i){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return pr(e)}return pr(i)}function pr(i){let e={objects:{},scenes:{},engine:G(i.engine||{})},t=i.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 n=i.scenes;if(n instanceof Map)n.forEach((r,o)=>{e.scenes[o]=G(r)});else if(n&&typeof n=="object")for(let r in n)e.scenes[r]=G(n[r]);let a=Y();for(let r of a)r.objectId?(e.objects[r.objectId]||(e.objects[r.objectId]={}),xt(e.objects[r.objectId],r.path,r.value)):r.sceneId?(e.scenes[r.sceneId]||(e.scenes[r.sceneId]={}),xt(e.scenes[r.sceneId],r.path,r.value)):xt(e.engine,r.path,r.value);return e}function nn(){let i=Y(),e=new Set;for(let t of i)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:i.length,hasChanges:i.length>0,overrides:i}}async function an(i){let e=De(),t={};for(let[a,r]of Object.entries(e.objects)){let o=r,s=a;/^(json\.|ui\.|effects\.|engine\.)/.test(s)||(s=`json.${a}`),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[a,r]of Object.entries(e.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;t[`scenes/${o}.json`]=r}let n=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Y().length>0,versionName:i})});if(!n.ok){let a=await n.json();throw new Error(`Apply failed: ${a.error||"Unknown error"}`)}se();try{let a=Qt();a&&(window.__editableConfigBaseline=G(a))}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 rn(){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 mr,Ls,yr,K=de(()=>{"use strict";mr="handler_preview_override_mode";if(typeof window!="undefined"){let i=window.localStorage.getItem(mr);window.__enableConfigOverrides=i===null?!0:i==="true"}Ls=500;yr={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[]}}});function _s(i,e){try{if(typeof i=="object"&&i!==null)return i;if(typeof i!="string")return null;if(i.startsWith("data:")){let n=i.indexOf(",");if(n===-1)return null;let a=i.slice(0,n);if(!a.includes("application/json")&&!a.includes("text/plain"))return null;let r=i.slice(n+1),o=a.includes("base64")?typeof atob=="function"?atob(r):r:decodeURIComponent(r);return JSON.parse(o)}let t=i.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(i):null}catch{return null}}function ks(i){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=i.replace(/^\.\/+/,""),n=t.split("/").pop()||t,a=[t,n,t.replace(/\.json$/,""),n.replace(/\.json$/,"")];for(let r of a){let o=e[r];if(o){let s=_s(o,r);if(s!==null)return s}}return null}async function At(i){if(yi.has(i)&&!vi)return console.log(`[CONFIG] Using cached config for: "${i}"`),yi.get(i);if(console.log(`[CONFIG] loadConfigFile called with: "${i}", MODE: ${z.toUpperCase()}, CACHE: ${vi?"DISABLED":"ENABLED"}`),z==="publish"){let n=ks(i);return n?(console.log(`[CONFIG] \u2713 Loaded ${i} via INLINE_ASSETS`),n):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${i} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}z==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${i}"`);let e;z==="brand"?e=[`./${i.split("/").pop()||i}`,`./${i}`,`./${i.replace(/^configs\//,"")}`,`./${i.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${i}`,`./${i.replace(/^configs\//,"")}`,`./${i.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(n=>n.startsWith("./")?[n,`/${n.slice(2)}`]:n.startsWith("/")?[n]:[n,`/${n}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let n=vi?"no-store":"force-cache";for(let a of e)try{let r=await fetch(a,{cache:n});if(!r.ok)continue;let o=await r.json();return console.log(`[CONFIG] \u2713 Loaded ${i} via ${a}`,o),o}catch(r){console.warn(`[CONFIG] \u2717 Failed to load ${a} (mode: ${z}):`,r)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${i}; using defaults`),{}})();return yi.set(i,t),t}async function on(){console.log("[CONFIG] Loading component schemas...");let i=["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 i)try{let n=z==="publish"||z==="brand"?t.split("/").pop()||t:`configs/${t}`,a=await At(n);a.component&&(e.set(a.component,a),console.log(`[CONFIG] \u2713 Schema loaded: ${a.component} ${z==="publish"||z==="brand"?"(flattened)":"(nested)"}`))}catch(n){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,n)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function Le(i){console.log(`[CONFIG] Loading object config: ${i}`);let e=z==="publish"||z==="brand"?`${i}.json`:`configs/objects/${i}.json`;return await At(e)}async function sn(i){let e=new Map;if(i.objects&&Array.isArray(i.objects)){for(let t of i.objects)if(t.enabled&&t.object_config)try{let n=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(n)||(n=`json.${n}`);let a=await Le(n);(!a||Object.keys(a).length===0)&&n!==t.instance_id&&(a=await Le(t.instance_id)),!a||Object.keys(a).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),a=await Le(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...a,instance_id:t.instance_id,object_config:t.object_config})}catch(n){console.warn(`Failed to load object ${t.object_config}:`,n)}}return e}async function ln(){console.log("[CONFIG] Loading engine configs...");let i=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(i.map(n=>{let a=`engine.${n}.json`,r=z==="publish"||z==="brand"?a:`configs/engine/${a}`;return At(r)})),t=Object.fromEntries(i.map((n,a)=>[n,e[a]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(i.map(n=>{var o;let a=(o=t[n])!=null?o:{},r=Object.keys(a);return[n,r.length>0?r:"empty"]}))),t}async function xi(){return await At(z==="publish"||z==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function cn(i="scene.main"){console.log(`[CONFIG] Loading scene config: ${i}`);let e=z==="publish"||z==="brand"?`${i}.json`:`configs/scenes/${i}.json`;return await At(e)}function Ze(i,e){let t=[];if(!i.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let n=e.get("identity");if(n)for(let a of n.required||[])i.identity[a]||t.push(`Missing required identity field: ${a}`);for(let[a,r]of Object.entries(i)){if(a==="identity")continue;let o=e.get(a);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 ${a}: ${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(`${a}.${l} value ${p} is below minimum ${d.min}`),d.max!==void 0&&p>d.max&&t.push(`${a}.${l} value ${p} is above maximum ${d.max}`))}}}}return{valid:t.length===0,errors:t}}function $e(i,e){let t={...i},n=["identity","transform","render"];for(let[a,r]of e.entries())r.defaults&&Object.keys(r.defaults).length>0&&(n.includes(a)||t[a])&&(t[a]||(t[a]={}),t[a]={...r.defaults,...t[a]});return t}function Q(i,e,t,n){return typeof i!="number"||!Number.isFinite(i)?e:Math.min(Math.max(i,t),n)}function xr(i,e){if(Array.isArray(i))return{x:Q(i[0],e.x,-2e3,2e3),y:Q(i[1],e.y,-2e3,2e3)};if(!i||typeof i!="object")return e;let{x:t,y:n}=i;return{x:Q(t,e.x,-2e3,2e3),y:Q(n,e.y,-2e3,2e3)}}function Ps(i,e){if(Array.isArray(i))return{x:Q(i[0],e.x,0,1),y:Q(i[1],e.y,0,1)};if(!i||typeof i!="object")return e;let{x:t,y:n}=i;return{x:Q(t,e.x,0,1),y:Q(n,e.y,0,1)}}function Os(i){if(Array.isArray(i))return{x:Q(i[0],.5,-10,10),y:Q(i[1],.5,-10,10)};if(i&&typeof i=="object"){let{x:e,y:t}=i;return{x:Q(e,.5,-10,10),y:Q(t,.5,-10,10)}}return typeof i=="string"?i:null}async function be(i="scene.main",e){var l,c,p,d,u,g,h,f,m,b,y,v,x,w;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await on(),n=Y();n.length>0&&console.log(`[CONFIG] Applying ${n.length} active overrides`);let a=await cn(i);console.log(`[CONFIG] Scene config loaded: ${((l=a.objects)==null?void 0:l.length)||0} objects`);let r=await ln();console.log("[CONFIG] Loading object configs...");let o=await sn(a);console.log(`[CONFIG] Loaded ${o.size} object configs:`,Array.from(o.keys()));for(let[E,C]of o.entries()){let S=$e(C,t),M=Ze(S,t);M.valid||console.warn(`Object ${E} validation errors:`,M.errors),(c=S.transform)!=null&&c.position&&(S.transform.position=xr(S.transform.position,{x:0,y:0})),(p=S.transform)!=null&&p.offset&&(S.transform.offset=xr(S.transform.offset,{x:0,y:0})),((d=S.transform)==null?void 0:d.anchor)!==void 0&&(S.transform.anchor=Os(S.transform.anchor)),((u=S.transform)==null?void 0:u.position_ratio)!==void 0&&S.transform.position_ratio!==null&&(S.transform.position_ratio=Ps(S.transform.position_ratio,{x:.5,y:.5})),o.set(E,S)}if(e){if(e.objects)for(let[E,C]of e.objects.entries())o.set(E,C);e.engine&&(r.runtime={...r.runtime,...e.engine.runtime},r.assets={...r.assets,...e.engine.assets},r.splash={...(g=r.splash)!=null?g:{},...(h=e.engine.splash)!=null?h:{}})}let s={objects:o,engine:r,scene:a,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=$e(s,t))),n.length>0&&wt()&&Ce(n,{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((f=r.runtime)!=null?f:{}),assets:Object.keys((m=r.assets)!=null?m:{}),splash:Object.keys((b=r.splash)!=null?b:{}),loading:Object.keys((y=r.loading)!=null?y:{}),start:Object.keys((v=r.start)!=null?v:{}),tutorial:Object.keys((x=r.tutorial)!=null?x:{}),endgame:Object.keys((w=r.endgame)!=null?w:{})},scene:a.scene_id||"unknown"}),s}function wi(i){var t,n,a,r,o,s,l,c,p,d,u,g,h,f,m,b,y,v,x,w,E,C,S,M,B,P,L,I,O,D,j,$,A;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[_,k]of i.objects.entries()){let q=((t=k.identity)==null?void 0:t.id)||_;q.includes("character")&&(e.gameplay.character_pos=((n=k.transform)==null?void 0:n.position)||{x:0,y:0},e.gameplay.character_scale=((a=k.transform)==null?void 0:a.scale)||1,e.gameplay.character_anim_speed=((o=(r=k.gameplay)==null?void 0:r.tuning)==null?void 0:o.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(s=k.gameplay)==null?void 0:s.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((p=(c=k.gameplay)==null?void 0:c.tuning)==null?void 0:p.relief_speed)||.22),(q.includes("gun")||q.includes("flame"))&&(e.gameplay.gun=k.gun||{},e.gameplay.gunmuzzle=((d=k.effects)==null?void 0:d.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=k.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=k.effects)==null?void 0:g.flame)||{}),q.includes("diamond")&&(e.gameplay.diamond=k),q.includes("ice")&&(e.gameplay.melt=k.melt||{},e.gameplay.melt_anchor=((h=k.transform)==null?void 0:h.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((f=k.transform)==null?void 0:f.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=k.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((b=k.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=k.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=k.hard_ice||{}),q.includes("water")&&(e.gameplay.water_drops=k),q.includes("crack")&&(e.gameplay.crack=k),q.includes("hand")&&(e.gameplay.hand=((v=k.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((x=k.transform)==null?void 0:x.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((w=k.transform)==null?void 0:w.scale)||1.5),q.includes("hazard")&&(e.gameplay.hazard=((E=k.gameplay)==null?void 0:E.tuning)||{},e.gameplay.danger_pos=((C=k.transform)==null?void 0:C.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((M=(S=k.gameplay)==null?void 0:S.tuning)==null?void 0:M.danger_pulse)||{},e.gameplay.hazard_height=((P=(B=k.gameplay)==null?void 0:B.tuning)==null?void 0:P.hazard_height)||140)}return e.gameplay.timeline=((L=i.engine.runtime)==null?void 0:L.timeline)||{},e.gameplay.drag_surface=((I=i.engine.runtime)==null?void 0:I.drag_surface)||{},e.gameplay.background=((O=i.engine.runtime)==null?void 0:O.background)||{},e.gameplay.ui_styles=((D=i.engine.runtime)==null?void 0:D.ui_styles)||{},e.gameplay.label_pulse=((j=i.engine.runtime)==null?void 0:j.label_pulse)||{},e.ui=(($=i.engine.runtime)==null?void 0:$.ui)||{},e.theme=((A=i.engine.runtime)==null?void 0:A.theme)||{},e.assets=i.engine.assets||{},e}var vr,z,yi,vi,Ei=de(()=>{"use strict";K();vr=null,z="dev";if(typeof window!="undefined"){let i=window.__BUILD_SETTINGS__;if(i!=null&&i.buildMode)vr=i,z=i.buildMode,console.log("[CONFIG] Loaded inline build settings:",i,"buildMode:",z);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);vr=t,z=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",z)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",z)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",z);yi=new Map,vi=z==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function Ai(i,e){let t=[];function n(a,r,o=""){if(a!==r){if(typeof a!=typeof r){t.push(`${o}: type changed`);return}if(typeof a=="object"&&a!==null&&r!==null){let s=new Set([...Object.keys(a),...Object.keys(r)]);for(let l of s){let c=o?`${o}.${l}`:l;l in a?l in r?n(a[l],r[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${o}: changed`)}}return n(i,e),t}function Si(i,e,t,n){let a={...t};for(let[r,o]of n.entries())a[r]&&o.defaults&&(a[r]={...o.defaults,...a[r]});return a}var St,ze,Ci=de(()=>{"use strict";St=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},ze=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 n=`${e}?t=${Date.now()}&r=${Math.random()}`,a=await fetch(n,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(a.ok){let r=await a.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(n){console.warn(`Failed to check ${e}:`,n)}}determineEventType(e){var t,n;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:(n=e.split("/").pop())==null?void 0:n.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let n=0;n<e.length;n++){let a=e.charCodeAt(n);t=(t<<5)-t+a,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 Ti(i){if(typeof window=="undefined")return;let e=typeof Li!="undefined"&&!!Li.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let a=null,r=!1,o=null;if(t){o=new ze;let h=window.__configWatcher;h!=null&&h.stop&&h.stop(),window.__configWatcher=o}let s=new Set,l=h=>{var b,y;if(!o)return;let f=new Set;f.add("configs/engine/engine.runtime.json"),f.add("configs/engine/engine.assets.json"),f.add("configs/engine/engine.splash.json"),f.add("configs/scenes/scene.main.json");let m=(y=(b=h.scene)==null?void 0:b.objects)!=null?y:[];for(let v of m)v!=null&&v.object_config&&f.add(`configs/objects/${v.object_config}.json`);for(let v of s)f.has(v)||o.unwatch(v);for(let v of f)s.has(v)||o.watch(v,x=>g(x));s=f},c=new Set,p=!1,d=async h=>{let f=await Le(h),m=$e(f,i.activeConfig.schemas),b=Ze(m,i.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${h} validation errors:`,b.errors),await i.liveEditBridge.applyObjectConfig(h,m)};async function u(h){if(!r){r=!0;try{if(p||c.size===0){i.audioSystem.destroy();let f=await be("scene.main");i.setActiveConfig(f),i.gameObjectManager.updateConfig(f),i.CustomAssets.updateConfig(f),await i.CustomAssets.ready();let m=i.createAudioSystem(f);i.setAudioSystem(m),window.__audioSystem=m,await m.start(),i.liveEditBridge.rebuildIndexes(),l(f),console.log(`[GAME] Hot-reload complete (${h})`)}else{let f=Array.from(c);c.clear();for(let m of f)await d(m);console.log(`[GAME] Hot-reload updated objects: ${f.join(", ")}`)}}catch(f){console.warn("[GAME] Hot-reload failed:",f)}finally{r=!1,p=!1,c.clear()}}}function g(h){h.type==="object"&&h.objectId?c.add(h.objectId):p=!0,a&&window.clearTimeout(a),a=window.setTimeout(()=>{u(h.type)},120)}e&&Li.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(i.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${s.size} files)`))}var Li,wr=de(()=>{"use strict";Ci();Ei();Li={}});var Er={};ft(Er,{ConfigWatcher:()=>ze,DefaultReloadStrategy:()=>St,applyDefaults:()=>$e,diffConfigs:()=>Ai,loadAllObjectConfigs:()=>sn,loadComponentSchemas:()=>on,loadEngineConfig:()=>ln,loadGamePromptConfig:()=>xi,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Le,loadSceneConfig:()=>cn,rehydrateObject:()=>Si,setupHotReload:()=>Ti,toLegacyFormat:()=>wi,validateObjectConfig:()=>Ze});var dn=de(()=>{"use strict";Ei();Ci();wr()});var so={};ft(so,{AssetEditorModal:()=>aa});var aa,ra=de(()=>{"use strict";aa=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,n,a){this.currentObjectId=e,this.currentPath=t,this.currentAsset=n,this.onApplyCallback=a,this.createModal(e,n),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let n=document.createElement("div");n.className="asset-editor-modal",n.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=n}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(s=>{s.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(s=>{s.addEventListener("click",o=>{let c=o.target.dataset.tab;c&&this.switchTab(c)})});let n=this.modal.querySelector("[data-ai-generate]");n==null||n.addEventListener("click",()=>{this.openAiEditor("generate")});let a=this.modal.querySelector("[data-ai-edit]");a==null||a.addEventListener("click",()=>{this.openAiEditor("edit")});let r=this.modal.querySelector("[data-modal-apply]");r==null||r.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",s=>{s.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(a=>{a.classList.toggle("active",a.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(a=>{a.classList.toggle("active",a.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 n="";e==="edit"&&this.currentAsset?n=`Edit this image: ${this.currentObjectId}`:n=`Create an image for: ${this.currentObjectId}`,t(this.currentObjectId||"unknown",n,this.currentAsset,{path:this.currentPath,onApply:a=>{this.onApplyCallback&&this.onApplyCallback(a),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 pl={};ft(pl,{COLORS:()=>ce,ConfigWatcher:()=>ze,DebugPanel:()=>kt,DefaultReloadStrategy:()=>St,Handler:()=>ne,PlayableLoadingScreen:()=>Un,PreviewShell:()=>Hn,STROKE_WIDTH:()=>hs,THEME:()=>ms,applyConfigOverride:()=>Se,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>an,applyDefaults:()=>$e,baseLottie:()=>ai,bootstrap:()=>el,clearConfigOverrides:()=>oe,clearConfigOverridesForObject:()=>br,configOverrideManager:()=>yr,createPreviewShell:()=>la,deepClone:()=>G,default:()=>Oe,defaultPreset:()=>pn,deviceGroups:()=>ki,devicePresets:()=>Pi,diffConfigs:()=>Ai,exportConfigsAsJSON:()=>De,getConfigOverrides:()=>Y,getConfigStateSummary:()=>nn,getOverrideMode:()=>wt,getPresetById:()=>Ne,getPresetsByCategory:()=>Oo,loadAllObjectConfigs:()=>on,loadComponentSchemas:()=>sn,loadEngineConfig:()=>ln,loadGamePromptConfig:()=>xi,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Le,loadSceneConfig:()=>cn,rehydrateObject:()=>Si,removeConfigOverride:()=>tn,resetToApplied:()=>Et,resetToOriginal:()=>rn,setBootstrapDependencies:()=>Zo,setOverrideMode:()=>bi,setupHotReload:()=>Ti,setupLiveEditBridge:()=>Bn,toLegacyFormat:()=>wi,validateObjectConfig:()=>Ze});module.exports=$s(pl);var we={};function Bt(i,e,t=!1){we[i]||(we[i]=[]),we[i].push({fn:e,once:t})}function ei(i,e){if(we[i]){if(!e){delete we[i];return}we[i]=we[i].filter(t=>t.fn!==e)}}function Ft(i,...e){let t=we[i];if(t)for(let n of[...t])n.fn(...e),n.once&&ei(i,n.fn)}function X(i,e){Bt(i,e,!0)}var F=null,ee=[],We=null;function Ta(i){F=i,ee=[],We!==null&&(clearTimeout(We),We=null)}function _a(){var i,e,t;return{endpoint:(F==null?void 0:F.endpoint)||"",transport:(F==null?void 0:F.transport)||"beacon",batchSize:(i=F==null?void 0:F.batchSize)!=null?i:10,flushIntervalMs:(e=F==null?void 0:F.flushIntervalMs)!=null?e:300,maxQueue:(t=F==null?void 0:F.maxQueue)!=null?t:200,debug:!!(F!=null&&F.debug)}}async function Ca(i,e,t,n){let a=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(i,new Blob([a],{type:"application/json"}));n&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){n&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:a,keepalive:!0}),n&&console.log("[handler.telemetry] fetch",e)}catch(r){n&&console.warn("[handler.telemetry] fetch failed",r)}}function ti(i,e){let t=_a();if(e&&t.endpoint){if(ee.push(i),ee.length>t.maxQueue&&(ee=ee.slice(ee.length-t.maxQueue)),ee.length>=t.batchSize){La();return}We===null&&(We=window.setTimeout(()=>{We=null,La()},t.flushIntervalMs))}}async function La(){let i=_a();if(!i.endpoint||ee.length===0)return;let e=ee.splice(0,i.batchSize);await Ca(i.endpoint,{events:e},i.transport,i.debug),ee.length>0&&await Ca(i.endpoint,{events:ee.splice(0,i.batchSize)},i.transport,i.debug)}function Pa(i){return Math.max(0,Math.min(1,i))}function zs(i){let e=String(i!=null?i:"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.]+)\)/),n=t?Number(t[1]):1.8;return a=>1+(n+1)*Math.pow(a-1,3)+n*Math.pow(a-1,2)}return t=>1-(1-t)*(1-t)}function ht(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Ns(i,e){let t=i==null?void 0:i[e];return typeof t=="number"?t:0}function ka(i,e,t){try{i[e]=t}catch{}}function Hs(i){let e=i==null?void 0:i.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,n=typeof e.y=="number"?e.y:1;return{x:t,y:n}}function Ma(i,e){let t=i==null?void 0:i.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 Oa(i,e){let t=Hs(i);if(!t)return{from:null,to:null};let n=null,a=null;return typeof e.scale=="number"?(n=e.scale,a=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(n=e.scale.x),typeof e.scale.y=="number"&&(a=e.scale.y)),typeof e.scaleX=="number"&&(n=e.scaleX),typeof e.scaleY=="number"&&(a=e.scaleY),n===null&&a===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:n!=null?n:t.x,y:a!=null?a:t.y}}}function Ia(){let i=new Set,e=new WeakMap,t=null,n=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),i.size>0&&n()})},a=p=>{var u;i.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),n()},r=p=>{i.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},s=p=>{p.killed||(p.killed=!0,r(p))},o=()=>{var d,u;let p=ht();for(let g of Array.from(i)){if(g.killed||g.paused)continue;let h=p-g.startMs-g.delayMs;if(h<0)continue;let f=g.durationMs>0?h/g.durationMs:1,m=Pa(f),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(f),b-1):0;if(g.repeat>0&&f>=1){let w=f-y;m=Pa(w)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let w of g.props)ka(g.target,w.key,w.from+(w.to-w.from)*v);g.scaleFrom&&g.scaleTo&&Ma(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(f>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(p,d,u)=>{var w;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),h=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((w=u==null?void 0:u.delayMsOverride)!=null?w:0)),f=zs(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let E of Object.keys(d)){if(y.has(E))continue;let C=d[E];typeof C=="number"&&v.push({key:E,from:Ns(p,E),to:C})}let x=Oa(p,d);return{target:p,startMs:ht(),delayMs:h,durationMs:g,ease:f,props:v,scaleFrom:x.from,scaleTo:x.to,repeat:m,yoyo:b,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return a(u),{kill:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ht())},resume:()=>{var f;if(!u.paused)return;let g=(f=u.pauseAtMs)!=null?f:ht(),h=ht()-g;u.startMs+=h,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 h=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&ka(p,g,h)}let u=Oa(p,d);u.to&&Ma(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))s(u)},timeline(p={}){let d=[],u=0,g=!1,h=[],f=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{d.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,x){return m({kind:"to",target:y,vars:v,atMs:f(x)}),b},fromTo(y,v,x,w){return m({kind:"fromTo",target:y,vars:x,from:v,atMs:f(w)}),b},play(){var y,v;if(g)return b;g=!0,h=[];for(let x of d)x.kind==="fromTo"&&c.set(x.target,(y=x.from)!=null?y:{}),h.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((v=x.vars.delay)!=null?v:0)}));return b},pause(){for(let y of h)y.pause();return b},kill(){for(let y of h)y.kill();h=[],g=!1}};return p.paused||b.play(),b}};return c}function ja(){if(typeof window=="undefined")return;let i=window;if(!i.gsap)try{i.gsap=Ia()}catch{}}var Ra={name:"handler-playable-sdk",version:"0.3.61",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,Fs=J++,Da=J++,$a=J++,za=J++,Na=J++,Ha=J++,Ba=J++,Fa=J++,Ua=J++,Ga=J++,qa=J++,Va=J++,H=Fs;function Wa(){return H===Da}function Ya(){return H===$a}function Ka(){return H===za}function Xa(){return H===Na}function Ye(){return H===Ha}function Ke(){return H===Ba}function Ja(){return H===Fa}function Za(){return H===Ua}function Qa(){return H===Ga}function ni(){return H===qa}function ii(){return H===Va}function er(){let i=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(i==="mraid")try{mraid.getState(),H=Da;return}catch{}else if(i==="dapi")try{dapi.isReady(),H=$a;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(H=za)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(H=Na)}catch{}else if(e==="mintegral")window.gameReady&&(H=Ha);else if(e==="tapjoy")window.TJ_API&&(H=Ba);else if(e==="tiktok")window.openAppStore&&(H=Fa);else if(e==="smadex")try{window.smxTracking&&(H=Ua)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(H=Ga)}catch{}else e==="vungle"?H=qa:(i==="nucleo"||e==="nucleo")&&(H=Va)}var Ut=Ve(require("lottie-web"),1),ai=Ut.default;typeof window!="undefined"&&(window.lottie=Ut.default,window.__baseLottie=Ut.default);var Us=require("pixi.js");var ri=require("pixi.js");var Gs=null;function si(i){Gs=i}Gt();oi();var mt=require("pixi.js");Gt();var Xs=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",pi=Xs;if(typeof window!="undefined")try{let i=new XMLHttpRequest;if(i.open("GET","./build-settings.json",!1),i.send(),i.status===200&&i.responseText){let e=JSON.parse(i.responseText);e!=null&&e.buildMode&&(pi=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${pi}`))}}catch{}function Js(i){var t,n,a,r,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(i);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(i))return{x:(t=i[0])!=null?t:.5,y:(n=i[1])!=null?n:.5};if(i&&typeof i=="object"&&"x"in i&&"y"in i)return{x:(a=i.x)!=null?a:.5,y:(r=i.y)!=null?r:.5};if(typeof i=="string"){let o=i.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var Ae=class{static async create(e,t,n){var l,c,p,d,u,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${pi}`);let a=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!a){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let f=new mt.Container;return this.applyTransform(f,t==null?void 0:t.transform,t),f}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: ${a.type}, path: ${a.path}`);let s=await je.load(e,a,n,r);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=s==null?void 0:s.constructor)==null?void 0:p.name}`);let o;if(a.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new mt.Sprite(s),console.log("[ObjectFactory] Created object:",o,"type:",(d=o==null?void 0:o.constructor)==null?void 0:d.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(a.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=s==null?void 0:s.constructor)==null?void 0:u.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof mt.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let f=[a.path,`/assets/${a.path}`,`assets/${a.path}`,`../assets/${a.path}`],m=!1;for(let b of f)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=o==null?void 0:o.constructor)==null?void 0:h.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=s)}else o=s;else o=s,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,n){var a,r,s,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(a=t.position.x)!=null?a:0,e.y=(r=t.position.y)!=null?r:0):"position"in e&&e.position&&e.position.set((s=t.position.x)!=null?s:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=Js(t.anchor);l&&("set"in e.anchor?e.anchor.set(l.x,l.y):(e.anchor.x=l.x,e.anchor.y=l.y))}}};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 eo=Ve(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=eo);Xe();var qt=require("pixi.js");Xe();var fi=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(a=>!this.instanceCache.has(a));if(t.length===0)return;let n=async a=>{a.length&&(console.log("[Assets] Loading objects:",a),await Promise.all(a.map(async r=>{var o;let s=this.registry.get(r);if(!s){console.warn("[Assets] No config found for object:",r);return}try{let l=await Ae.create(r,s,this.app);this.instanceCache.set(r,l),console.log("[Assets] Loaded object:",r,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",r,l)}})))};return this.readyPromise=(async()=>{await n(t);let a=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));a.length>0&&(console.warn("[Assets] Retrying missing assets:",a),await n(a)),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 n=await Ae.create(e,t,this.app);this.instanceCache.set(e,n)}}get(e){return this.instanceCache.get(e)}},to=new fi,no=new Proxy(to,{get(i,e){if(e in i&&typeof i[e]=="function")return i[e].bind(i);if(i.get(e))return i.get(e)}});Xe();var sr=require("pixi.js"),fe={width:400,height:600,designWidth:400,scaleFactor:1},Wt={scale:1,position:1},mi=[];function ao(i,e,t,n,a,r,s){mi.push({element:i,originalScale:r,positionHelper:e,heightPercent:a}),e(i,t,n,a,r,s,!1)}function ro(){mi.forEach(({element:i,originalScale:e,positionHelper:t,heightPercent:n})=>{let a=e*fe.scaleFactor;t(i,fe.width,fe.height,n,a,!0,!1)})}function hi(i,e){console.log(`[SCREEN] updateScreenState called: ${i}x${e}`),fe.width=i,fe.height=e,fe.scaleFactor=Math.min(i/fe.designWidth,1.15),Wt.scale=fe.scaleFactor,Wt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Wt.scale.toFixed(3)}`),ro()}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 so(i,e,t){let n=vt[i];n&&n[e]!==void 0&&(n[e]=t,console.log(`Updated ${i}.${e} = ${t}`))}function oo(){return vt}var lo={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 Vt(i,e){return typeof i=="number"&&Number.isFinite(i)?i:e}function Yt(i,e={x:.5,y:.5}){var t;if(Array.isArray(i))return{x:Vt(i[0],e.x),y:Vt(i[1],e.y)};if(i&&typeof i=="object"){let n=i;return{x:Vt(n.x,e.x),y:Vt(n.y,e.y)}}if(typeof i=="string"){let n=i.trim().toLowerCase();return(t=lo[n])!=null?t:e}return e}function or(i,e,t,n={}){var g,h,f,m,b,y;let a=Yt(t),r=(g=n.inset)!=null?g:{},s=(h=n.padding)!=null?h:{x:0,y:0},o=((f=r.left)!=null?f:0)+s.x,l=((m=r.right)!=null?m:0)+s.x,c=((b=r.top)!=null?b:0)+s.y,p=((y=r.bottom)!=null?y:0)+s.y,d=Math.max(0,i-o-l),u=Math.max(0,e-c-p);return{x:o+d*a.x,y:c+u*a.y}}function lr(i,e,t,n={}){var f,m,b,y,v,x;let a=(f=n.inset)!=null?f:{},r=(m=n.padding)!=null?m:{x:0,y:0},s=((b=a.left)!=null?b:0)+r.x,o=((y=a.right)!=null?y:0)+r.x,l=((v=a.top)!=null?v:0)+r.y,c=((x=a.bottom)!=null?x:0)+r.y,p=Math.max(0,i-s-o),d=Math.max(0,e-l-c),u=Yt(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:s+p*g,y:l+d*h}}if(typeof window!="undefined"){let i=window.innerWidth,e=window.innerHeight,t=()=>{let n=window.innerWidth,a=window.innerHeight;(n!==i||a!==e)&&(i=n,e=a,hi(n,a))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),hi(window.innerWidth,window.innerHeight),window.updateDebugConfig=so,window.getDebugConfig=oo,window.copyConfig=xo,window.applyConfig=yt,window.applyConfigForRatio=wo,window.positionAtBottom=cr,window.positionAtTop=uo,window.positionAtCenter=go,window.positionAtLeft=fo,window.positionAtRight=ho,window.positionAtBottomLeft=mo,window.positionAtBottomRight=bo,window.positionAtTopLeft=yo,window.positionAtTopRight=vo,window.applyPositionContract=po,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 Kt(i,e,t=0){return i*e+t}function Xt(i,e,t=0){return i*(1-e)+t}function Jt(i,e,t=0){return i*e+t}function Zt(i,e,t=0){return i*(1-e)+t}function Z(i,e=0){return i/2+e}function co(i,e){return i*e}function po(i,e,t,n){var s,o,l,c,p,d,u,g,h,f,m,b,y,v,x,w,E,C,S,O;let a=0,r=0;switch(n.type){case"top":a=Z(e,(o=(s=n.offset)==null?void 0:s.x)!=null?o:0),r=Kt(t,n.percent,(c=(l=n.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":a=Z(e,(d=(p=n.offset)==null?void 0:p.x)!=null?d:0),r=Xt(t,n.percent,(g=(u=n.offset)==null?void 0:u.y)!=null?g:0);break;case"left":a=Jt(e,n.percent,(f=(h=n.offset)==null?void 0:h.x)!=null?f:0),r=Z(t,(b=(m=n.offset)==null?void 0:m.y)!=null?b:0);break;case"right":a=Zt(e,n.percent,(v=(y=n.offset)==null?void 0:y.x)!=null?v:0),r=Z(t,(w=(x=n.offset)==null?void 0:x.y)!=null?w:0);break;case"center":a=Z(e,(C=(E=n.offset)==null?void 0:E.x)!=null?C:0),r=Z(t,(O=(S=n.offset)==null?void 0:S.y)!=null?O:0);break}i.position?i.position.set(a,r):(i.x=a,i.y=r),n.scale!==void 0&&n.scale!==1&&i.scale&&(typeof i.scale.set=="function"?i.scale.set(n.scale,n.scale):(i.scale.x=n.scale,i.scale.y=n.scale))}function cr(i,e,t,n=.2,a=1,r=!0,s=!1){let o=co(t,n),l=Xt(t,n/2);he(i,Z(e),l);let c=r?a*fe.scaleFactor:a;me(i,c),s&&!mi.find(p=>p.element===i)&&ao(i,cr,e,t,n,a,r)}function uo(i,e,t,n=.1,a=1){he(i,Z(e),Kt(t,n)),me(i,a)}function go(i,e,t,n=0,a=0,r=1){he(i,Z(e,n),Z(t,a)),me(i,r)}function fo(i,e,t,n=.1,a=1){he(i,Jt(e,n),Z(t)),me(i,a)}function ho(i,e,t,n=.1,a=1){he(i,Zt(e,n),Z(t)),me(i,a)}function mo(i,e,t,n=.05,a=.05,r=1){he(i,Jt(e,a),Xt(t,n)),me(i,r)}function bo(i,e,t,n=.05,a=.05,r=1){he(i,Zt(e,a),Xt(t,n)),me(i,r)}function yo(i,e,t,n=.05,a=.05,r=1){he(i,Jt(e,a),Kt(t,n)),me(i,r)}function vo(i,e,t,n=.05,a=.05,r=1){he(i,Zt(e,a),Kt(t,n)),me(i,r)}function he(i,e,t){i&&i.position?typeof i.position.set=="function"?i.position.set(e,t):(i.position.x=e,i.position.y=t):i&&(i.x=e,i.y=t)}function me(i,e){e!==1&&i&&i.scale&&(typeof i.scale.set=="function"?i.scale.set(e,e):i.scale.x!==void 0&&i.scale.y!==void 0&&(i.scale.x=e,i.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 xo(i){return i&&Re[i]?JSON.parse(JSON.stringify(Re[i])):JSON.parse(JSON.stringify(vt))}function yt(i){Object.keys(i).forEach(e=>{let t=e;vt[t]&&i[t]&&Object.assign(vt[t],i[t])}),console.log("Config applied:",i)}function wo(i,e){let t=i/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 i=window;i.configPresets=Re,i.resolveAnchorVec2=i.resolveAnchorVec2||Yt,i.resolveScreenAnchorPoint=i.resolveScreenAnchorPoint||or,i.resolveScreenRatioPoint=i.resolveScreenRatioPoint||lr}dn();function U(i,e){let t=(a,r)=>r===0?a:t(r,a%r),n=t(i,e);return`${i/n}:${e/n}`}var Nc=[{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)}],Hc=[{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)}],Bc=[{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)}],_i=[{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 Pi=[..._i],ki=[{category:"playable",label:"Playable Ad",devices:_i}],pn=_i[0];function Ne(i){return Pi.find(e=>e.id===i)||pn}function Oo(i){return Pi.filter(e=>e.category===i)}var un=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all"}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
46
+ `,this.modal=n}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 n=this.modal.querySelector("[data-ai-generate]");n==null||n.addEventListener("click",()=>{this.openAiEditor("generate")});let a=this.modal.querySelector("[data-ai-edit]");a==null||a.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(a=>{a.classList.toggle("active",a.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(a=>{a.classList.toggle("active",a.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 n="";e==="edit"&&this.currentAsset?n=`Edit this image: ${this.currentObjectId}`:n=`Create an image for: ${this.currentObjectId}`,t(this.currentObjectId||"unknown",n,this.currentAsset,{path:this.currentPath,onApply:a=>{this.onApplyCallback&&this.onApplyCallback(a),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 pl={};ft(pl,{COLORS:()=>ce,ConfigWatcher:()=>ze,DebugPanel:()=>Pt,DefaultReloadStrategy:()=>St,Handler:()=>ne,PlayableLoadingScreen:()=>Un,PreviewShell:()=>Hn,STROKE_WIDTH:()=>mo,THEME:()=>bo,applyConfigOverride:()=>Se,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>an,applyDefaults:()=>$e,baseLottie:()=>ai,bootstrap:()=>el,clearConfigOverrides:()=>se,clearConfigOverridesForObject:()=>br,configOverrideManager:()=>yr,createPreviewShell:()=>la,deepClone:()=>G,default:()=>Me,defaultPreset:()=>pn,deviceGroups:()=>Pi,devicePresets:()=>ki,diffConfigs:()=>Ai,exportConfigsAsJSON:()=>De,getConfigOverrides:()=>Y,getConfigStateSummary:()=>nn,getOverrideMode:()=>wt,getPresetById:()=>Ne,getPresetsByCategory:()=>Ms,loadAllObjectConfigs:()=>sn,loadComponentSchemas:()=>on,loadEngineConfig:()=>ln,loadGamePromptConfig:()=>xi,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Le,loadSceneConfig:()=>cn,rehydrateObject:()=>Si,removeConfigOverride:()=>tn,resetToApplied:()=>Et,resetToOriginal:()=>rn,setBootstrapDependencies:()=>Zs,setOverrideMode:()=>bi,setupHotReload:()=>Ti,setupLiveEditBridge:()=>Bn,toLegacyFormat:()=>wi,validateObjectConfig:()=>Ze});module.exports=zo(pl);var we={};function Bt(i,e,t=!1){we[i]||(we[i]=[]),we[i].push({fn:e,once:t})}function ei(i,e){if(we[i]){if(!e){delete we[i];return}we[i]=we[i].filter(t=>t.fn!==e)}}function Ft(i,...e){let t=we[i];if(t)for(let n of[...t])n.fn(...e),n.once&&ei(i,n.fn)}function X(i,e){Bt(i,e,!0)}var F=null,ee=[],We=null;function Ta(i){F=i,ee=[],We!==null&&(clearTimeout(We),We=null)}function _a(){var i,e,t;return{endpoint:(F==null?void 0:F.endpoint)||"",transport:(F==null?void 0:F.transport)||"beacon",batchSize:(i=F==null?void 0:F.batchSize)!=null?i:10,flushIntervalMs:(e=F==null?void 0:F.flushIntervalMs)!=null?e:300,maxQueue:(t=F==null?void 0:F.maxQueue)!=null?t:200,debug:!!(F!=null&&F.debug)}}async function Ca(i,e,t,n){let a=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let r=navigator.sendBeacon(i,new Blob([a],{type:"application/json"}));n&&console.log("[handler.telemetry] beacon",r,e);return}catch(r){n&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",r)}try{await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:a,keepalive:!0}),n&&console.log("[handler.telemetry] fetch",e)}catch(r){n&&console.warn("[handler.telemetry] fetch failed",r)}}function ti(i,e){let t=_a();if(e&&t.endpoint){if(ee.push(i),ee.length>t.maxQueue&&(ee=ee.slice(ee.length-t.maxQueue)),ee.length>=t.batchSize){La();return}We===null&&(We=window.setTimeout(()=>{We=null,La()},t.flushIntervalMs))}}async function La(){let i=_a();if(!i.endpoint||ee.length===0)return;let e=ee.splice(0,i.batchSize);await Ca(i.endpoint,{events:e},i.transport,i.debug),ee.length>0&&await Ca(i.endpoint,{events:ee.splice(0,i.batchSize)},i.transport,i.debug)}function ka(i){return Math.max(0,Math.min(1,i))}function No(i){let e=String(i!=null?i:"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.]+)\)/),n=t?Number(t[1]):1.8;return a=>1+(n+1)*Math.pow(a-1,3)+n*Math.pow(a-1,2)}return t=>1-(1-t)*(1-t)}function ht(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Ho(i,e){let t=i==null?void 0:i[e];return typeof t=="number"?t:0}function Pa(i,e,t){try{i[e]=t}catch{}}function Bo(i){let e=i==null?void 0:i.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,n=typeof e.y=="number"?e.y:1;return{x:t,y:n}}function Oa(i,e){let t=i==null?void 0:i.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Ma(i,e){let t=Bo(i);if(!t)return{from:null,to:null};let n=null,a=null;return typeof e.scale=="number"?(n=e.scale,a=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(n=e.scale.x),typeof e.scale.y=="number"&&(a=e.scale.y)),typeof e.scaleX=="number"&&(n=e.scaleX),typeof e.scaleY=="number"&&(a=e.scaleY),n===null&&a===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:n!=null?n:t.x,y:a!=null?a:t.y}}}function Ia(){let i=new Set,e=new WeakMap,t=null,n=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),i.size>0&&n()})},a=p=>{var u;i.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),n()},r=p=>{i.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=ht();for(let g of Array.from(i)){if(g.killed||g.paused)continue;let h=p-g.startMs-g.delayMs;if(h<0)continue;let f=g.durationMs>0?h/g.durationMs:1,m=ka(f),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(f),b-1):0;if(g.repeat>0&&f>=1){let w=f-y;m=ka(w)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let w of g.props)Pa(g.target,w.key,w.from+(w.to-w.from)*v);g.scaleFrom&&g.scaleTo&&Oa(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(f>=b){o(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(p,d,u)=>{var w;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),h=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((w=u==null?void 0:u.delayMsOverride)!=null?w:0)),f=No(d.ease),m=typeof d.repeat=="number"?Math.max(0,d.repeat|0):0,b=d.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let E of Object.keys(d)){if(y.has(E))continue;let C=d[E];typeof C=="number"&&v.push({key:E,from:Ho(p,E),to:C})}let x=Ma(p,d);return{target:p,startMs:ht(),delayMs:h,durationMs:g,ease:f,props:v,scaleFrom:x.from,scaleTo:x.to,repeat:m,yoyo:b,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return a(u),{kill:()=>o(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=ht())},resume:()=>{var f;if(!u.paused)return;let g=(f=u.pauseAtMs)!=null?f:ht(),h=ht()-g;u.startMs+=h,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 h=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&Pa(p,g,h)}let u=Ma(p,d);u.to&&Oa(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,h=[],f=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{d.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,x){return m({kind:"to",target:y,vars:v,atMs:f(x)}),b},fromTo(y,v,x,w){return m({kind:"fromTo",target:y,vars:x,from:v,atMs:f(w)}),b},play(){var y,v;if(g)return b;g=!0,h=[];for(let x of d)x.kind==="fromTo"&&c.set(x.target,(y=x.from)!=null?y:{}),h.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((v=x.vars.delay)!=null?v:0)}));return b},pause(){for(let y of h)y.pause();return b},kill(){for(let y of h)y.kill();h=[],g=!1}};return p.paused||b.play(),b}};return c}function ja(){if(typeof window=="undefined")return;let i=window;if(!i.gsap)try{i.gsap=Ia()}catch{}}var Ra={name:"handler-playable-sdk",version:"0.3.62",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,Uo=J++,Da=J++,$a=J++,za=J++,Na=J++,Ha=J++,Ba=J++,Fa=J++,Ua=J++,Ga=J++,qa=J++,Va=J++,H=Uo;function Wa(){return H===Da}function Ya(){return H===$a}function Ka(){return H===za}function Xa(){return H===Na}function Ye(){return H===Ha}function Ke(){return H===Ba}function Ja(){return H===Fa}function Za(){return H===Ua}function Qa(){return H===Ga}function ni(){return H===qa}function ii(){return H===Va}function er(){let i=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(i==="mraid")try{mraid.getState(),H=Da;return}catch{}else if(i==="dapi")try{dapi.isReady(),H=$a;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(H=za)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(H=Na)}catch{}else if(e==="mintegral")window.gameReady&&(H=Ha);else if(e==="tapjoy")window.TJ_API&&(H=Ba);else if(e==="tiktok")window.openAppStore&&(H=Fa);else if(e==="smadex")try{window.smxTracking&&(H=Ua)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(H=Ga)}catch{}else e==="vungle"?H=qa:(i==="nucleo"||e==="nucleo")&&(H=Va)}var Ut=Ve(require("lottie-web"),1),ai=Ut.default;typeof window!="undefined"&&(window.lottie=Ut.default,window.__baseLottie=Ut.default);var Go=require("pixi.js");var ri=require("pixi.js");var qo=null;function oi(i){qo=i}Gt();si();var mt=require("pixi.js");Gt();var Jo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",pi=Jo;if(typeof window!="undefined")try{let i=new XMLHttpRequest;if(i.open("GET","./build-settings.json",!1),i.send(),i.status===200&&i.responseText){let e=JSON.parse(i.responseText);e!=null&&e.buildMode&&(pi=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${pi}`))}}catch{}function Zo(i){var t,n,a,r,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(i);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(i))return{x:(t=i[0])!=null?t:.5,y:(n=i[1])!=null?n:.5};if(i&&typeof i=="object"&&"x"in i&&"y"in i)return{x:(a=i.x)!=null?a:.5,y:(r=i.y)!=null?r:.5};if(typeof i=="string"){let s=i.trim().toLowerCase();return(o=e[s])!=null?o:{x:.5,y:.5}}return null}var Ae=class{static async create(e,t,n){var l,c,p,d,u,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${pi}`);let a=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!a){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let f=new mt.Container;return this.applyTransform(f,t==null?void 0:t.transform,t),f}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: ${a.type}, path: ${a.path}`);let o=await je.load(e,a,n,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(a.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(a.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 f=[a.path,`/assets/${a.path}`,`assets/${a.path}`,`../assets/${a.path}`],m=!1;for(let b of f)try{let y=await fetch(b);if(y.ok){s=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=s==null?void 0:s.constructor)==null?void 0:h.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,n){var a,r,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(a=t.position.x)!=null?a: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=Zo(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 ts=Ve(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=ts);Xe();var qt=require("pixi.js");Xe();var fi=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(a=>!this.instanceCache.has(a));if(t.length===0)return;let n=async a=>{a.length&&(console.log("[Assets] Loading objects:",a),await Promise.all(a.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 Ae.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 n(t);let a=this.registry.getAllIds().filter(r=>!this.instanceCache.has(r));a.length>0&&(console.warn("[Assets] Retrying missing assets:",a),await n(a)),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 n=await Ae.create(e,t,this.app);this.instanceCache.set(e,n)}}get(e){return this.instanceCache.get(e)}},ns=new fi,is=new Proxy(ns,{get(i,e){if(e in i&&typeof i[e]=="function")return i[e].bind(i);if(i.get(e))return i.get(e)}});Xe();var or=require("pixi.js"),fe={width:400,height:600,designWidth:400,scaleFactor:1},Wt={scale:1,position:1},mi=[];function rs(i,e,t,n,a,r,o){mi.push({element:i,originalScale:r,positionHelper:e,heightPercent:a}),e(i,t,n,a,r,o,!1)}function os(){mi.forEach(({element:i,originalScale:e,positionHelper:t,heightPercent:n})=>{let a=e*fe.scaleFactor;t(i,fe.width,fe.height,n,a,!0,!1)})}function hi(i,e){console.log(`[SCREEN] updateScreenState called: ${i}x${e}`),fe.width=i,fe.height=e,fe.scaleFactor=Math.min(i/fe.designWidth,1.15),Wt.scale=fe.scaleFactor,Wt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Wt.scale.toFixed(3)}`),os()}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 ss(i,e,t){let n=vt[i];n&&n[e]!==void 0&&(n[e]=t,console.log(`Updated ${i}.${e} = ${t}`))}function ls(){return vt}var cs={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 Vt(i,e){return typeof i=="number"&&Number.isFinite(i)?i:e}function Yt(i,e={x:.5,y:.5}){var t;if(Array.isArray(i))return{x:Vt(i[0],e.x),y:Vt(i[1],e.y)};if(i&&typeof i=="object"){let n=i;return{x:Vt(n.x,e.x),y:Vt(n.y,e.y)}}if(typeof i=="string"){let n=i.trim().toLowerCase();return(t=cs[n])!=null?t:e}return e}function sr(i,e,t,n={}){var g,h,f,m,b,y;let a=Yt(t),r=(g=n.inset)!=null?g:{},o=(h=n.padding)!=null?h:{x:0,y:0},s=((f=r.left)!=null?f:0)+o.x,l=((m=r.right)!=null?m:0)+o.x,c=((b=r.top)!=null?b:0)+o.y,p=((y=r.bottom)!=null?y:0)+o.y,d=Math.max(0,i-s-l),u=Math.max(0,e-c-p);return{x:s+d*a.x,y:c+u*a.y}}function lr(i,e,t,n={}){var f,m,b,y,v,x;let a=(f=n.inset)!=null?f:{},r=(m=n.padding)!=null?m:{x:0,y:0},o=((b=a.left)!=null?b:0)+r.x,s=((y=a.right)!=null?y:0)+r.x,l=((v=a.top)!=null?v:0)+r.y,c=((x=a.bottom)!=null?x:0)+r.y,p=Math.max(0,i-o-s),d=Math.max(0,e-l-c),u=Yt(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:o+p*g,y:l+d*h}}if(typeof window!="undefined"){let i=window.innerWidth,e=window.innerHeight,t=()=>{let n=window.innerWidth,a=window.innerHeight;(n!==i||a!==e)&&(i=n,e=a,hi(n,a))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),hi(window.innerWidth,window.innerHeight),window.updateDebugConfig=ss,window.getDebugConfig=ls,window.copyConfig=xs,window.applyConfig=yt,window.applyConfigForRatio=ws,window.positionAtBottom=cr,window.positionAtTop=us,window.positionAtCenter=gs,window.positionAtLeft=fs,window.positionAtRight=hs,window.positionAtBottomLeft=ms,window.positionAtBottomRight=bs,window.positionAtTopLeft=ys,window.positionAtTopRight=vs,window.applyPositionContract=ps,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 Kt(i,e,t=0){return i*e+t}function Xt(i,e,t=0){return i*(1-e)+t}function Jt(i,e,t=0){return i*e+t}function Zt(i,e,t=0){return i*(1-e)+t}function Z(i,e=0){return i/2+e}function ds(i,e){return i*e}function ps(i,e,t,n){var o,s,l,c,p,d,u,g,h,f,m,b,y,v,x,w,E,C,S,M;let a=0,r=0;switch(n.type){case"top":a=Z(e,(s=(o=n.offset)==null?void 0:o.x)!=null?s:0),r=Kt(t,n.percent,(c=(l=n.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":a=Z(e,(d=(p=n.offset)==null?void 0:p.x)!=null?d:0),r=Xt(t,n.percent,(g=(u=n.offset)==null?void 0:u.y)!=null?g:0);break;case"left":a=Jt(e,n.percent,(f=(h=n.offset)==null?void 0:h.x)!=null?f:0),r=Z(t,(b=(m=n.offset)==null?void 0:m.y)!=null?b:0);break;case"right":a=Zt(e,n.percent,(v=(y=n.offset)==null?void 0:y.x)!=null?v:0),r=Z(t,(w=(x=n.offset)==null?void 0:x.y)!=null?w:0);break;case"center":a=Z(e,(C=(E=n.offset)==null?void 0:E.x)!=null?C:0),r=Z(t,(M=(S=n.offset)==null?void 0:S.y)!=null?M:0);break}i.position?i.position.set(a,r):(i.x=a,i.y=r),n.scale!==void 0&&n.scale!==1&&i.scale&&(typeof i.scale.set=="function"?i.scale.set(n.scale,n.scale):(i.scale.x=n.scale,i.scale.y=n.scale))}function cr(i,e,t,n=.2,a=1,r=!0,o=!1){let s=ds(t,n),l=Xt(t,n/2);he(i,Z(e),l);let c=r?a*fe.scaleFactor:a;me(i,c),o&&!mi.find(p=>p.element===i)&&rs(i,cr,e,t,n,a,r)}function us(i,e,t,n=.1,a=1){he(i,Z(e),Kt(t,n)),me(i,a)}function gs(i,e,t,n=0,a=0,r=1){he(i,Z(e,n),Z(t,a)),me(i,r)}function fs(i,e,t,n=.1,a=1){he(i,Jt(e,n),Z(t)),me(i,a)}function hs(i,e,t,n=.1,a=1){he(i,Zt(e,n),Z(t)),me(i,a)}function ms(i,e,t,n=.05,a=.05,r=1){he(i,Jt(e,a),Xt(t,n)),me(i,r)}function bs(i,e,t,n=.05,a=.05,r=1){he(i,Zt(e,a),Xt(t,n)),me(i,r)}function ys(i,e,t,n=.05,a=.05,r=1){he(i,Jt(e,a),Kt(t,n)),me(i,r)}function vs(i,e,t,n=.05,a=.05,r=1){he(i,Zt(e,a),Kt(t,n)),me(i,r)}function he(i,e,t){i&&i.position?typeof i.position.set=="function"?i.position.set(e,t):(i.position.x=e,i.position.y=t):i&&(i.x=e,i.y=t)}function me(i,e){e!==1&&i&&i.scale&&(typeof i.scale.set=="function"?i.scale.set(e,e):i.scale.x!==void 0&&i.scale.y!==void 0&&(i.scale.x=e,i.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 xs(i){return i&&Re[i]?JSON.parse(JSON.stringify(Re[i])):JSON.parse(JSON.stringify(vt))}function yt(i){Object.keys(i).forEach(e=>{let t=e;vt[t]&&i[t]&&Object.assign(vt[t],i[t])}),console.log("Config applied:",i)}function ws(i,e){let t=i/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 i=window;i.configPresets=Re,i.resolveAnchorVec2=i.resolveAnchorVec2||Yt,i.resolveScreenAnchorPoint=i.resolveScreenAnchorPoint||sr,i.resolveScreenRatioPoint=i.resolveScreenRatioPoint||lr}dn();function U(i,e){let t=(a,r)=>r===0?a:t(r,a%r),n=t(i,e);return`${i/n}:${e/n}`}var Nc=[{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)}],Hc=[{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)}],Bc=[{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)}],_i=[{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 ki=[..._i],Pi=[{category:"playable",label:"Playable Ad",devices:_i}],pn=_i[0];function Ne(i){return ki.find(e=>e.id===i)||pn}function Ms(i){return ki.filter(e=>e.category===i)}var un=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all"}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
47
47
  <div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects" style="left:16px; top:72px;">
48
48
  <div class="scene-panel-header" data-panel-handle>
49
49
  <div class="panel-title">
@@ -76,9 +76,9 @@
76
76
  <div class="scene-object-list" data-object-list></div>
77
77
  </div>
78
78
  </div>
79
- `}initialize(e,t){var a,r,s,o,l;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(r=this.root)==null?void 0:r.querySelector("#scene-object-search"),(s=this.searchInput)==null||s.addEventListener("input",()=>this.refreshObjects());let n=(o=this.root)==null?void 0:o.querySelector("#scene-screen-filter");if(n){try{let c=window.localStorage.getItem(this.getScreenFilterStorageKey());c&&(this.screenFilter=c)}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 c=n.value||"all";this.screenFilter=c;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(l=this.root)==null||l.addEventListener("click",c=>{let p=c.target;if(!p)return;let d=p.closest("[data-object-id]");if(!d)return;let u=d.dataset.objectId;u&&this.select(u)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects())}setSelected(e){var s,o,l,c,p;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{d.classList.toggle("selected",d.dataset.objectId===e)});let n=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumbs]"),a=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-screen]"),r=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(n&&a&&r)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,u),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},f=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),m=this.formatDisplayName(f);a.textContent=h[g]||g,r.textContent=m,n.style.display="flex"}else n.style.display="none"}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,n=window.refreshEditableConfigIndex;if(typeof n=="function"&&n(),typeof e!="function"){this.scheduleRetry();return}let a=e();if(!Array.isArray(a)||a.length===0){let d=window.__editableObjectConfigs;d&&typeof d.keys=="function"&&(a=Array.from(d.keys()))}if(!Array.isArray(a)||a.length===0){this.scheduleRetry();return}let r=(((p=this.searchInput)==null?void 0:p.value)||"").trim().toLowerCase(),s=["loading","start","gameplay","tutorial","endgame"],o=Object.fromEntries(s.map(d=>[d,[]])),l=Object.fromEntries(s.map(d=>[d,[]]));a.forEach(d=>{var O,B,k,L;let u=typeof t=="function"?t(d):null;if(!u){let I=window.__editableObjectConfigs;I&&typeof I.get=="function"&&(u=(O=I.get(d))!=null?O:null)}let g=(((B=u==null?void 0:u.identity)==null?void 0:B.category)||"scene").toString(),h=(((k=u==null?void 0:u.identity)==null?void 0:k.id)||d).toString(),f=g.toLowerCase(),m=h.toLowerCase(),b=f.includes("ui")||m.startsWith("ui")||m.includes("label"),y=this.formatDisplayName(h||d),v=((L=u==null?void 0:u.render)==null?void 0:L.visible)===!1||(u==null?void 0:u.enabled)===!1,x=this.getObjectType(u),w={id:d,label:y,category:g,isUi:b,isUnused:v,objectType:x},E=this.inferScreen(w.id,u);if(this.screenFilter!=="all"&&E!==this.screenFilter||!(!r||w.id.toLowerCase().includes(r)||w.label.toLowerCase().includes(r)))return;(w.isUnused?l:o)[E].push(w)});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"};this.listContainer.innerHTML=`
80
- ${s.map(d=>this.renderGroup(c[d],[...o[d],...l[d]])).join("")}
81
- `,this.setSelected(this.selectedId)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var o,l;let n=window.__HANDLER_SCREEN_INDEX,a=(o=n==null?void 0:n.instanceToScreen)==null?void 0:o[e];if(a==="loading"||a==="start"||a==="gameplay"||a==="tutorial"||a==="endgame")return a;let r=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${r}`.toLowerCase();return s.includes("loading")?"loading":s.includes("start")?"start":s.includes("tutorial")?"tutorial":s.includes("endgame")||s.includes("end_card")||s.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,n,a,r,s,o,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(r=(a=(n=e.render)==null?void 0:n.asset)==null?void 0:a.path)!=null&&r.endsWith(".json")?"animation":((o=(s=e.render)==null?void 0:s.asset)==null?void 0:o.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(p=(c=e.gameplay)==null?void 0:c.tuning)!=null&&p.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let n=window.getEditableObjectConfig,a=t.map(r=>{var p,d;let s=typeof n=="function"?n(r.id):null;if(!s){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(s=(p=u.get(r.id))!=null?p:null)}let o=this.getTypeIconByType(r.objectType),l=this.getAssetPreview(s),c=(d=s==null?void 0:s.ui)!=null&&d.text?`"${s.ui.text.substring(0,12)}${s.ui.text.length>12?"...":""}"`:"";return`
79
+ `}initialize(e,t){var a,r,o,s,l;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(r=this.root)==null?void 0:r.querySelector("#scene-object-search"),(o=this.searchInput)==null||o.addEventListener("input",()=>this.refreshObjects());let n=(s=this.root)==null?void 0:s.querySelector("#scene-screen-filter");if(n){try{let c=window.localStorage.getItem(this.getScreenFilterStorageKey());c&&(this.screenFilter=c)}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 c=n.value||"all";this.screenFilter=c;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(l=this.root)==null||l.addEventListener("click",c=>{let p=c.target;if(!p)return;let d=p.closest("[data-object-id]");if(!d)return;let u=d.dataset.objectId;u&&this.select(u)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects())}setSelected(e){var 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 n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumbs]"),a=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),r=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(n&&a&&r)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,u),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},f=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),m=this.formatDisplayName(f);a.textContent=h[g]||g,r.textContent=m,n.style.display="flex"}else n.style.display="none"}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,n=window.refreshEditableConfigIndex;if(typeof n=="function"&&n(),typeof e!="function"){this.scheduleRetry();return}let a=e();if(!Array.isArray(a)||a.length===0){let d=window.__editableObjectConfigs;d&&typeof d.keys=="function"&&(a=Array.from(d.keys()))}if(!Array.isArray(a)||a.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,[]]));a.forEach(d=>{var M,B,P,L;let u=typeof t=="function"?t(d):null;if(!u){let I=window.__editableObjectConfigs;I&&typeof I.get=="function"&&(u=(M=I.get(d))!=null?M:null)}let g=(((B=u==null?void 0:u.identity)==null?void 0:B.category)||"scene").toString(),h=(((P=u==null?void 0:u.identity)==null?void 0:P.id)||d).toString(),f=g.toLowerCase(),m=h.toLowerCase(),b=f.includes("ui")||m.startsWith("ui")||m.includes("label"),y=this.formatDisplayName(h||d),v=((L=u==null?void 0:u.render)==null?void 0:L.visible)===!1||(u==null?void 0:u.enabled)===!1,x=this.getObjectType(u),w={id:d,label:y,category:g,isUi:b,isUnused:v,objectType:x},E=this.inferScreen(w.id,u);if(this.screenFilter!=="all"&&E!==this.screenFilter||!(!r||w.id.toLowerCase().includes(r)||w.label.toLowerCase().includes(r)))return;(w.isUnused?l:s)[E].push(w)});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"};this.listContainer.innerHTML=`
80
+ ${o.map(d=>this.renderGroup(c[d],[...s[d],...l[d]])).join("")}
81
+ `,this.setSelected(this.selectedId)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(n=>n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var s,l;let n=window.__HANDLER_SCREEN_INDEX,a=(s=n==null?void 0:n.instanceToScreen)==null?void 0:s[e];if(a==="loading"||a==="start"||a==="gameplay"||a==="tutorial"||a==="endgame")return a;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,n,a,r,o,s,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(r=(a=(n=e.render)==null?void 0:n.asset)==null?void 0:a.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 n=window.getEditableObjectConfig,a=t.map(r=>{var p,d;let o=typeof n=="function"?n(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`
82
82
  <button class="scene-object-item ${r.isUnused?"unused":""}" data-object-id="${r.id}">
83
83
  <span class="scene-object-label">${r.label}</span>
84
84
  ${c?`<span class="scene-object-text-preview">${c}</span>`:""}
@@ -91,7 +91,7 @@
91
91
  ${a}
92
92
  </div>
93
93
  </div>
94
- `}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var n,a,r,s,o,l;if(!e)return"\u{1F4E6}";if((n=e.render)!=null&&n.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((a=e.ui)!=null&&a.text)return"\u{1F4DD}";if(((r=e.identity)==null?void 0:r.category)==="ui")return"\u{1F3A8}";if(e.effects||(o=(s=e.identity)==null?void 0:s.id)!=null&&o.includes("effect"))return"\u2728";if(e.audio)return"\u{1F50A}";let t=((l=e.identity)==null?void 0:l.id)||"";return t.includes("background")?"\u{1F5BC}\uFE0F":t.includes("character")?"\u{1F464}":t.includes("key")?"\u{1F511}":t.includes("draggable")?"\u{1F3AF}":t.includes("machine")?"\u2699\uFE0F":t.includes("tutorial")||t.includes("hand")?"\u{1F446}":"\u{1F4E6}"}getAssetPreview(e){var n;if(!e)return null;let t=(n=e.render)==null?void 0:n.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var n,a,r,s;if(!e)return"";let t=((n=e.render)==null?void 0:n.background_color)||((r=(a=e.gameplay)==null?void 0:a.tuning)==null?void 0:r.panel_bg_color)||((s=e.ui)==null?void 0:s.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var n,a,r,s;if(!e)return"";let t=[];return((n=e.render)==null?void 0:n.visible)===!1&&t.push("hidden"),((a=e.render)==null?void 0:a.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((r=e.interaction)!=null&&r.clickable||(s=e.ui)!=null&&s.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t;this.selectedId=e,this.setSelected(e),(t=this.options)==null||t.onSelect(e)}};var gn=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
94
+ `}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var n,a,r,o,s,l;if(!e)return"\u{1F4E6}";if((n=e.render)!=null&&n.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((a=e.ui)!=null&&a.text)return"\u{1F4DD}";if(((r=e.identity)==null?void 0:r.category)==="ui")return"\u{1F3A8}";if(e.effects||(s=(o=e.identity)==null?void 0:o.id)!=null&&s.includes("effect"))return"\u2728";if(e.audio)return"\u{1F50A}";let t=((l=e.identity)==null?void 0:l.id)||"";return t.includes("background")?"\u{1F5BC}\uFE0F":t.includes("character")?"\u{1F464}":t.includes("key")?"\u{1F511}":t.includes("draggable")?"\u{1F3AF}":t.includes("machine")?"\u2699\uFE0F":t.includes("tutorial")||t.includes("hand")?"\u{1F446}":"\u{1F4E6}"}getAssetPreview(e){var n;if(!e)return null;let t=(n=e.render)==null?void 0:n.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var n,a,r,o;if(!e)return"";let t=((n=e.render)==null?void 0:n.background_color)||((r=(a=e.gameplay)==null?void 0:a.tuning)==null?void 0:r.panel_bg_color)||((o=e.ui)==null?void 0:o.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var n,a,r,o;if(!e)return"";let t=[];return((n=e.render)==null?void 0:n.visible)===!1&&t.push("hidden"),((a=e.render)==null?void 0:a.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((r=e.interaction)!=null&&r.clickable||(o=e.ui)!=null&&o.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t;this.selectedId=e,this.setSelected(e),(t=this.options)==null||t.onSelect(e)}};var gn=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
95
95
  <div class="scene-tools-corner-panel ${this.isCollapsed?"collapsed":""}" data-panel="scene-tools-corner">
96
96
  <div class="scene-tools-header" data-tools-header data-panel-handle>
97
97
  <span class="scene-tools-title">Scene Tools</span>
@@ -136,7 +136,7 @@
136
136
  </div>
137
137
  </div>
138
138
  </div>
139
- `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="scene-tools-corner"]'),!this.root)return;let n=localStorage.getItem("scene-tools-collapsed");n!==null&&(this.isCollapsed=n==="true",this.root.classList.toggle("collapsed",this.isCollapsed));let a=this.root.querySelector("[data-tools-collapse]");a==null||a.addEventListener("click",()=>{var c;this.isCollapsed=!this.isCollapsed,(c=this.root)==null||c.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let r=(c,p)=>{var u;let d=(u=this.root)==null?void 0:u.querySelector(`[data-status="${c}"]`);d&&d.classList.toggle("active",p)},s=this.root.querySelector("#debug-highlight-object");s==null||s.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightObject(!!s.checked),r("bounds",s.checked)});let o=this.root.querySelector("#debug-highlight-anchor");o==null||o.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightAnchor(!!o.checked),r("anchor",o.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{r("nudge",l.checked)})}updateInfo(e){}};var fn=class{constructor(){this.root=null;this.options=null}render(){return`
139
+ `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="scene-tools-corner"]'),!this.root)return;let n=localStorage.getItem("scene-tools-collapsed");n!==null&&(this.isCollapsed=n==="true",this.root.classList.toggle("collapsed",this.isCollapsed));let a=this.root.querySelector("[data-tools-collapse]");a==null||a.addEventListener("click",()=>{var c;this.isCollapsed=!this.isCollapsed,(c=this.root)==null||c.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let r=(c,p)=>{var u;let d=(u=this.root)==null?void 0:u.querySelector(`[data-status="${c}"]`);d&&d.classList.toggle("active",p)},o=this.root.querySelector("#debug-highlight-object");o==null||o.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightObject(!!o.checked),r("bounds",o.checked)});let s=this.root.querySelector("#debug-highlight-anchor");s==null||s.addEventListener("change",()=>{var c;(c=this.options)==null||c.onHighlightAnchor(!!s.checked),r("anchor",s.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{r("nudge",l.checked)})}updateInfo(e){}};var fn=class{constructor(){this.root=null;this.options=null}render(){return`
140
140
  <div class="nudge-panel hidden" data-panel="nudge-panel">
141
141
  <div class="nudge-panel-header">
142
142
  <span class="nudge-panel-title">Nudge Controls</span>
@@ -193,7 +193,7 @@
193
193
  </div>
194
194
  </div>
195
195
  </div>
196
- `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(r=>{r.addEventListener("click",()=>{var l,c,p,d;let s=r.dataset.nudge,o=this.getNudgeStep();switch(s){case"up":(l=this.options)==null||l.onNudge(0,-o);break;case"down":(c=this.options)==null||c.onNudge(0,o);break;case"left":(p=this.options)==null||p.onNudge(-o,0);break;case"right":(d=this.options)==null||d.onNudge(o,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(r=>{r.addEventListener("click",()=>{var l;let o=r.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(o)})})}show(){var e;(e=this.root)==null||e.classList.remove("hidden")}hide(){var e;(e=this.root)==null||e.classList.add("hidden")}getNudgeStep(){var n,a;let e=(n=this.root)==null?void 0:n.querySelector("#nudge-step-input"),t=Number((a=e==null?void 0:e.value)!=null?a:10);return Number.isFinite(t)&&t>0?t:10}};var hn=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let n=e||{},a=t||{},r={slots:Array.isArray(a.slots)?[...a.slots]:[],libraryAssets:typeof a.libraryAssets=="object"&&a.libraryAssets?{...a.libraryAssets}:{},categories:Array.isArray(a.categories)?[...a.categories]:[]},s=Array.isArray(n.slots)?n.slots:[];if(s.length>0&&r.slots.length>0)for(let c of r.slots){let p=s.find(d=>(d==null?void 0:d.slotId)&&d.slotId===(c==null?void 0:c.slotId));p!=null&&p.currentAsset&&p.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=p.currentAsset)}let o=n.libraryAssets||{};for(let[c,p]of Object.entries(o)){if(!Array.isArray(p))continue;r.libraryAssets[c]||(r.libraryAssets[c]=[]);let d=new Set((r.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of p){let g=u==null?void 0:u.filename;!g||d.has(g)||(r.libraryAssets[c].unshift(u),d.add(g))}}let l=new Set(r.categories||[]);for(let c of n.categories||[])typeof c=="string"&&l.add(c);return r.categories=Array.from(l),r}render(){return`
196
+ `}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 n,a;let e=(n=this.root)==null?void 0:n.querySelector("#nudge-step-input"),t=Number((a=e==null?void 0:e.value)!=null?a:10);return Number.isFinite(t)&&t>0?t:10}};var hn=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let n=e||{},a=t||{},r={slots:Array.isArray(a.slots)?[...a.slots]:[],libraryAssets:typeof a.libraryAssets=="object"&&a.libraryAssets?{...a.libraryAssets}:{},categories:Array.isArray(a.categories)?[...a.categories]:[]},o=Array.isArray(n.slots)?n.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=n.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 n.categories||[])typeof c=="string"&&l.add(c);return r.categories=Array.from(l),r}render(){return`
197
197
  <div class="scene-panel library-panel panel-accent-purple" data-panel="library">
198
198
  <div class="scene-panel-header" data-panel-handle>
199
199
  <div class="panel-title">
@@ -212,7 +212,7 @@
212
212
  </div>
213
213
  <div class="panel-resize-handle" data-panel-resize></div>
214
214
  </div>
215
- `}initialize(e,t){var r,s,o;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-slots]");let n=(s=this.root)==null?void 0:s.querySelector("[data-create-ai]");n==null||n.addEventListener("click",()=>{this.handleCreateWithAI()});let a=(o=this.root)==null?void 0:o.querySelector("[data-refresh-library]");a==null||a.addEventListener("click",()=>{a.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>a.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,n=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(n.ok){let a=await n.json(),r=this.mergeRegistries(t,a);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 n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)&&n.slots.length>0){this.registry=n,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 n of this.registry.slots)e[n.category]||(e[n.category]=[]),e[n.category].push(n);let t=Date.now();this.slotsContainer.innerHTML="";for(let n of this.registry.categories){let a=e[n]||[];if(a.length===0)continue;let r=document.createElement("div");r.className="library-category";let s=document.createElement("div");s.className="library-category-header",s.textContent=this.formatCategoryName(n),r.appendChild(s);let o=document.createElement("div");o.className="library-category-slots";for(let l of a){let c=this.createSlotElement(l,t);o.appendChild(c)}r.appendChild(o),this.slotsContainer.appendChild(r)}}createSlotElement(e,t){let n=this.expandedSlot===e.slotId,a=document.createElement("div");a.className=`library-slot ${n?"expanded":""}`,a.dataset.slotId=e.slotId;let r=document.createElement("div");r.className="slot-header";let s=document.createElement("div");s.className="slot-current";let o=document.createElement("img");o.src=`/raw/${e.currentAsset}?t=${t}`,o.alt=e.displayName,o.className="slot-thumbnail",o.onerror=()=>{o.style.display="none"},s.appendChild(o),r.appendChild(s);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let p=document.createElement("div");p.className="slot-asset",p.textContent=e.currentAsset,l.appendChild(c),l.appendChild(p),r.appendChild(l);let d=document.createElement("div");d.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async m=>{m.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),d.appendChild(g);let h=document.createElement("button");h.className="slot-reset",h.title="Reset to default",h.textContent="\u21BA",h.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),d.appendChild(h);let f=document.createElement("span");if(f.className="slot-expand-icon",f.textContent=n?"\u25BC":"\u25B6",d.appendChild(f),r.appendChild(d),r.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),a.appendChild(r),n){let m=this.createLibraryElement(e,t);a.appendChild(m)}return a}createLibraryElement(e,t){var r;let n=document.createElement("div");n.className="slot-library";let a=((r=this.registry)==null?void 0:r.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(s=>{let o=new Map;for(let c of a)o.set(c.filename,c);for(let c of s)o.has(c.filename)||o.set(c.filename,c);let l=Array.from(o.values());if(l.length===0){n.innerHTML='<div class="library-empty">No alternative assets</div>';return}n.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)}),n.appendChild(p)}}),n.innerHTML='<div class="library-loading">Loading assets...</div>',n}async fetchFolderAssets(e,t){try{let n=await fetch(`/raw/library/${e}/?t=${t}`);if(!n.ok)return[];let a=await n.text(),r=[],s=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=s.exec(a))!==null;){let l=o[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");r.push({filename:l,displayName:c})}}return r}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var n;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{await((n=this.options)==null?void 0:n.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(a){console.error("[LIBRARY] Failed to apply asset:",a)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to reset slot:",n)}}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 n=e.slotId||e.objectId,a="render.texture";e.category==="ui"&&(a="ui.image"),e.category==="audio"&&(a="audio.src"),t(n,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:a})}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 a;let n=(a=t.files)==null?void 0:a[0];if(n){console.log("[Library] File selected:",n.name);try{let r=await this.fileToDataUrl(n);if(!r){alert("Failed to read file");return}let o=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",o,"to category:",l);let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${o}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[Library] \u2705 Upload saved:",p.path);let d=window.addAssetToRegistry;typeof d=="function"&&d(l,`${o}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(u){console.warn("[Library] Setup-library not available:",u)}await this.handleApply(e,`${o}.png`),e.currentAsset=`${o}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",p.error),alert(`Upload failed: ${p.error}`)}catch(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 n=new FileReader;n.onload=()=>t(n.result),n.onerror=()=>t(null),n.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 n=e.startsWith("json.")?e.replace("json.",""):e,a=this.registry.slots.find(r=>(r.objectId===n||r.slotId===n)&&(!t||r.category===t));a?(console.log("[LIBRARY] Highlighting slot:",a.slotId),this.expandedSlot=a.slotId,this.renderSlots(),setTimeout(()=>{var s;let r=(s=this.slotsContainer)==null?void 0:s.querySelector(`[data-slot-id="${a.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 mn=class{detectType(e,t,n){let a=e.toLowerCase();return a==="logic_id"||a==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":a.includes("color")||a.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 bn=class{render(e,t,n,a){let r=this.formatLabel(t),s=n?this.getThumbnailUrl(n):"";return`
215
+ `}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 n=(o=this.root)==null?void 0:o.querySelector("[data-create-ai]");n==null||n.addEventListener("click",()=>{this.handleCreateWithAI()});let a=(s=this.root)==null?void 0:s.querySelector("[data-refresh-library]");a==null||a.addEventListener("click",()=>{a.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>a.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,n=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(n.ok){let a=await n.json(),r=this.mergeRegistries(t,a);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 n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)&&n.slots.length>0){this.registry=n,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 n of this.registry.slots)e[n.category]||(e[n.category]=[]),e[n.category].push(n);let t=Date.now();this.slotsContainer.innerHTML="";for(let n of this.registry.categories){let a=e[n]||[];if(a.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(n),r.appendChild(o);let s=document.createElement("div");s.className="library-category-slots";for(let l of a){let c=this.createSlotElement(l,t);s.appendChild(c)}r.appendChild(s),this.slotsContainer.appendChild(r)}}createSlotElement(e,t){let n=this.expandedSlot===e.slotId,a=document.createElement("div");a.className=`library-slot ${n?"expanded":""}`,a.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 g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),d.appendChild(g);let h=document.createElement("button");h.className="slot-reset",h.title="Reset to default",h.textContent="\u21BA",h.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),d.appendChild(h);let f=document.createElement("span");if(f.className="slot-expand-icon",f.textContent=n?"\u25BC":"\u25B6",d.appendChild(f),r.appendChild(d),r.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),a.appendChild(r),n){let m=this.createLibraryElement(e,t);a.appendChild(m)}return a}createLibraryElement(e,t){var r;let n=document.createElement("div");n.className="slot-library";let a=((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 a)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){n.innerHTML='<div class="library-empty">No alternative assets</div>';return}n.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)}),n.appendChild(p)}}),n.innerHTML='<div class="library-loading">Loading assets...</div>',n}async fetchFolderAssets(e,t){try{let n=await fetch(`/raw/library/${e}/?t=${t}`);if(!n.ok)return[];let a=await n.text(),r=[],o=/href="([^"]+\.(png|jpg|jpeg))"/gi,s;for(;(s=o.exec(a))!==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 n;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{await((n=this.options)==null?void 0:n.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(a){console.error("[LIBRARY] Failed to apply asset:",a)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to reset slot:",n)}}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 n=e.slotId||e.objectId,a="render.texture";e.category==="ui"&&(a="ui.image"),e.category==="audio"&&(a="audio.src"),t(n,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:a})}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 a;let n=(a=t.files)==null?void 0:a[0];if(n){console.log("[Library] File selected:",n.name);try{let r=await this.fileToDataUrl(n);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 n=new FileReader;n.onload=()=>t(n.result),n.onerror=()=>t(null),n.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 n=e.startsWith("json.")?e.replace("json.",""):e,a=this.registry.slots.find(r=>(r.objectId===n||r.slotId===n)&&(!t||r.category===t));a?(console.log("[LIBRARY] Highlighting slot:",a.slotId),this.expandedSlot=a.slotId,this.renderSlots(),setTimeout(()=>{var o;let r=(o=this.slotsContainer)==null?void 0:o.querySelector(`[data-slot-id="${a.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 mn=class{detectType(e,t,n){let a=e.toLowerCase();return a==="logic_id"||a==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":a.includes("color")||a.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 bn=class{render(e,t,n,a){let r=this.formatLabel(t),o=n?this.getThumbnailUrl(n):"";return`
216
216
  <div class="inspector-property" data-property-type="image">
217
217
  <div class="inspector-property-header">
218
218
  <label class="inspector-label">${r}</label>
@@ -223,9 +223,9 @@
223
223
  <button class="debug-btn debug-btn-sm" data-action="reset" data-path="${a}" data-object="${e}" title="Reset">\u21BA</button>
224
224
  </div>
225
225
  </div>
226
- ${s?`
226
+ ${o?`
227
227
  <div class="inspector-image-preview">
228
- <img src="${s}" alt="${r}" class="inspector-thumbnail" />
228
+ <img src="${o}" alt="${r}" class="inspector-thumbnail" />
229
229
  </div>
230
230
  `:`
231
231
  <div class="inspector-image-preview inspector-image-empty">
@@ -287,14 +287,14 @@
287
287
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
288
288
  <div class="inspector-array-empty">Empty array</div>
289
289
  </div>
290
- `;let r=n.map((s,o)=>typeof s=="string"?`<div class="inspector-array-item">\u2022 ${s}</div>`:typeof s=="object"?`<div class="inspector-array-item">\u2022 ${JSON.stringify(s)}</div>`:`<div class="inspector-array-item">\u2022 ${String(s)}</div>`).join("");return`
290
+ `;let r=n.map((o,s)=>typeof o=="string"?`<div class="inspector-array-item">\u2022 ${o}</div>`:typeof o=="object"?`<div class="inspector-array-item">\u2022 ${JSON.stringify(o)}</div>`:`<div class="inspector-array-item">\u2022 ${String(o)}</div>`).join("");return`
291
291
  <div class="inspector-property inspector-property-array">
292
292
  <label class="inspector-property-label">${this.formatLabel(t)} (${n.length} items)</label>
293
293
  <div class="inspector-array-list">
294
294
  ${r}
295
295
  </div>
296
296
  </div>
297
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var An=class{constructor(e){this.registry=e}render(e,t,n,a){if(t==="logic"&&n&&typeof n=="object")return this.renderLogic(e,t,n,a);let r=[];for(let o in n){let l=n[o],c=`${a}.${o}`,p=this.registry.renderProperty(e,o,l,c);p&&r.push(p)}return r.length===0?"":r.length<=4&&r.every(o=>o.includes("inspector-property"))?`
297
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var An=class{constructor(e){this.registry=e}render(e,t,n,a){if(t==="logic"&&n&&typeof n=="object")return this.renderLogic(e,t,n,a);let r=[];for(let s in n){let l=n[s],c=`${a}.${s}`,p=this.registry.renderProperty(e,s,l,c);p&&r.push(p)}return r.length===0?"":r.length<=4&&r.every(s=>s.includes("inspector-property"))?`
298
298
  <div class="inspector-subsection">
299
299
  <div class="inspector-subsection-title">${this.formatLabel(t)}</div>
300
300
  <div class="inspector-subsection-content">
@@ -308,7 +308,7 @@
308
308
  ${r.join("")}
309
309
  </div>
310
310
  </div>
311
- `}renderLogic(e,t,n,a){let r=[],s=typeof(n==null?void 0:n.id)=="string"?n.id:"",o={zone:["bottom-left","bottom-right","top-left","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"]},l=(()=>{let p=window,d=Array.isArray(p==null?void 0:p.__HANDLER_LOGIC_OPTIONS)?p.__HANDLER_LOGIC_OPTIONS:[],g=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...d].map(h=>String(h)).filter(h=>h.trim().length>0);return Array.from(new Set(g)).sort((h,f)=>h.localeCompare(f))})(),c=s&&!l.includes(s)?[s,...l]:l;r.push(`
311
+ `}renderLogic(e,t,n,a){let r=[],o=typeof(n==null?void 0:n.id)=="string"?n.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(h=>String(h)).filter(h=>h.trim().length>0);return Array.from(new Set(g)).sort((h,f)=>h.localeCompare(f))})(),c=o&&!l.includes(o)?[o,...l]:l;r.push(`
312
312
  <div class="inspector-property inspector-property-text">
313
313
  <label class="inspector-property-label">Id</label>
314
314
  <div class="inspector-input-group">
@@ -316,12 +316,12 @@
316
316
  data-property-path="${a}.id"
317
317
  data-object-id="${e}"
318
318
  data-logic-id-selector="true">
319
- <option value="" ${s?"":"selected"}>None</option>
320
- ${c.map(p=>`<option value="${p}" ${p===s?"selected":""}>${p}</option>`).join("")}
319
+ <option value="" ${o?"":"selected"}>None</option>
320
+ ${c.map(p=>`<option value="${p}" ${p===o?"selected":""}>${p}</option>`).join("")}
321
321
  </select>
322
322
  </div>
323
323
  </div>
324
- `);for(let p in n){if(p==="id")continue;let d=n[p],u=`${a}.${p}`;if(p==="props"&&d&&typeof d=="object"){let h=[];for(let f in d){let m=d[f],b=`${u}.${f}`,y=o[f];if((f==="targetId"||f==="inputId")&&typeof m=="string"){let v=(()=>{try{let E=window,C=E==null?void 0:E.__editableConfig;if(!(C!=null&&C.objects))return[];let S=[];if(C.objects instanceof Map)for(let O of C.objects.keys())S.push(O);else typeof C.objects=="object"&&S.push(...Object.keys(C.objects));return S.sort()}catch{return[]}})(),x=m||"",w=x&&!v.includes(x)?[x,...v]:v;h.push(`
324
+ `);for(let p in n){if(p==="id")continue;let d=n[p],u=`${a}.${p}`;if(p==="props"&&d&&typeof d=="object"){let h=[];for(let f in d){let m=d[f],b=`${u}.${f}`,y=s[f];if((f==="targetId"||f==="inputId")&&typeof m=="string"){let v=(()=>{try{let E=window,C=E==null?void 0:E.__editableConfig;if(!(C!=null&&C.objects))return[];let S=[];if(C.objects instanceof Map)for(let M of C.objects.keys())S.push(M);else typeof C.objects=="object"&&S.push(...Object.keys(C.objects));return S.sort()}catch{return[]}})(),x=m||"",w=x&&!v.includes(x)?[x,...v]:v;h.push(`
325
325
  <div class="inspector-property inspector-property-text">
326
326
  <label class="inspector-property-label">${this.formatLabel(f)}</label>
327
327
  <div class="inspector-input-group">
@@ -358,18 +358,18 @@
358
358
  ${r.join("")}
359
359
  </div>
360
360
  </div>
361
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Sn=class{render(e,t,n,a,r){let s=n==null?"":String(n),o=Array.from(new Set(r.map(c=>String(c)))),l=s&&!o.includes(s)?[s,...o]:o;return`
361
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Sn=class{render(e,t,n,a,r){let o=n==null?"":String(n),s=Array.from(new Set(r.map(c=>String(c)))),l=o&&!s.includes(o)?[o,...s]:s;return`
362
362
  <div class="inspector-property inspector-property-text">
363
363
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
364
364
  <div class="inspector-input-group">
365
365
  <select class="inspector-component-select inspector-input"
366
366
  data-property-path="${a}"
367
367
  data-object-id="${e}">
368
- ${l.map(c=>`<option value="${c}" ${c===s?"selected":""}>${c}</option>`).join("")}
368
+ ${l.map(c=>`<option value="${c}" ${c===o?"selected":""}>${c}</option>`).join("")}
369
369
  </select>
370
370
  </div>
371
371
  </div>
372
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Cn=class{constructor(){this.typeDetector=new mn,this.imageRenderer=new bn,this.colorRenderer=new yn,this.numberRenderer=new vn,this.textRenderer=new xn,this.booleanRenderer=new wn,this.arrayRenderer=new En,this.objectRenderer=new An(this),this.selectRenderer=new Sn}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let n=[];if(t.objects instanceof Map)for(let a of t.objects.keys())n.push(a);else typeof t.objects=="object"&&n.push(...Object.keys(t.objects));return n.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let n=window,a=n==null?void 0:n.__editableConfig,r=a==null?void 0:a.schemas;if(!r)return null;let s=String(e||"").split(".").filter(Boolean);if(s.length<2)return null;let o=s[0],l=s.slice(1).join("."),c=r instanceof Map?r.get(o):r==null?void 0:r[o];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],a=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(a)).sort((r,s)=>r.localeCompare(s))}catch{return[]}}renderProperty(e,t,n,a){let r=t.toLowerCase(),s=r==="logic"||r==="logic_id"||r==="logicid",o=r==="id"&&a.toLowerCase().includes("logic");if((s||o)&&typeof n=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,n,a,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"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"]}[t];if(c&&a.includes("logic.props"))return this.selectRenderer.render(e,t,n,a,c);if((t==="targetId"||t==="inputId")&&typeof n=="string"){let u=this.getObjectIds();return this.selectRenderer.render(e,t,n,a,["",...u])}let p=this.getEnumOptionsFromSchemas(a);if(p)return this.selectRenderer.render(e,t,n,a,p);switch(this.typeDetector.detectType(t,n)){case"image":return this.imageRenderer.render(e,t,n,a);case"color":return this.colorRenderer.render(e,t,n,a);case"number":return this.numberRenderer.render(e,t,n,a);case"boolean":return this.booleanRenderer.render(e,t,n,a);case"array":return this.arrayRenderer.render(e,t,n,a);case"object":return this.objectRenderer.render(e,t,n,a);case"select":return this.selectRenderer.render(e,t,n,a,[]);default:return this.textRenderer.render(e,t,n,a)}}getTypeDetector(){return this.typeDetector}};K();var Qe=class{async updateProperty(e,t,n,a={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,n);let r=window.getEditableObjectConfig;if(typeof r!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let s=r(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}Se({objectId:e,path:t,value:n},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let d=window.__editableConfig,u=(p=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?p:s;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),a.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let n=t.split("."),a=e;for(let r of n)if(a&&typeof a=="object"&&r in a)a=a[r];else return;return a}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};var Ln=class{constructor(){this.updateManager=new Qe}async handleAction(e,t,n){console.log("[QuickActionsBar] Action:",e,t,n);let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=a(t);if(!r)return;let s=this.updateManager.getNestedProperty(r,n);if(e==="ai-convert"||e==="upload"||e==="library"){let o=n==="ui.text"||n==="render.asset.path",l=n==="render.asset.path";o&&(await this.prepareForImageConversion(t,r),e==="ai-convert"&&n!=="render.asset.path"&&(n="render.asset.path"))}switch(e){case"library":this.openLibrary(t,n,s);break;case"ai-edit":this.openAIEditor(t,n,s);break;case"upload":this.openUpload(t,n);break;case"reset":await this.resetToDefault(t,n);break;case"ai-convert":this.handleAiConvert(t,n,s);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var n,a;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let s=((a=(n=t.transform)==null?void 0:n.scale)!=null?a:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let n=window.getEditableAssets;if(typeof n!="function")return;let a=n();if(!a||!a.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!a.slots.some(p=>p.objectId===r||p.slotId===r)){let p=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",r),a.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"}),a.categories&&!a.categories.includes(p)&&a.categories.push(p),a.libraryAssets&&!a.libraryAssets[p]&&(a.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,n){var r;let a=window.__debugContext;if(a){if(a.activeTab!=="library"){a.activeTab="library";let s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(a.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(e),l=(r=o==null?void 0:o.identity)==null?void 0:r.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),a.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,n){let a=window.__openAiEditor;if(typeof a=="function"){let r=t.split(".").pop()||t;a(r,`Edit ${r} for ${e}`,n,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){let n=document.createElement("input");n.type="file",n.accept="image/*",n.onchange=async a=>{var o;let r=(o=a.target.files)==null?void 0:o[0];if(!r)return;console.log("[QuickActionsBar] Preparing upload for:",r.name);let s=new FileReader;s.onload=async()=>{var c,p,d;let l=s.result;try{let u=window.getEditableObjectConfig,g=u==null?void 0:u(e),h=((c=g==null?void 0:g.identity)==null?void 0:c.category)||(t.split(".")[0]==="render"?"environment":"ui"),m=`${e.replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`;console.log("[QuickActionsBar] Saving uploaded file:",m,"to category:",h);let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:h,filename:`${m}.png`,data:l,overwrite:!0})})).json();if(y.success){console.log("[QuickActionsBar] \u2705 Uploaded and saved:",y.path);let v=window.addAssetToRegistry;typeof v=="function"&&v(h,`${m}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}}),console.log("[QuickActionsBar] \u2705 Library setup completed")}catch(C){console.warn("[QuickActionsBar] Setup-library not available:",C)}let x=window.refreshAssetLibrary;typeof x=="function"&&await x(),await this.updateManager.updateProperty(e,t,y.path);let w=window.__debugContext;(d=(p=w==null?void 0:w.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,y.path);let E=window.__highlightLibrarySlot;typeof E=="function"&&setTimeout(()=>{E(e,h)},500),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[QuickActionsBar] \u2705 Upload complete and applied")}else console.error("[QuickActionsBar] \u274C Upload failed:",y.error),alert(`Upload failed: ${y.error}`)}catch(u){console.error("[QuickActionsBar] \u274C Upload error:",u),alert("Upload failed. Check console.")}},s.readAsDataURL(r)},n.click()}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let n=await this.getDefaultValue(e,t);n!==void 0?(await this.updateManager.updateProperty(e,t,n),console.log("[QuickActionsBar] Reset to default value:",n)):alert("No default value found for this property.")}catch(n){console.error("[QuickActionsBar] Failed to reset to default:",n),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let n=t.split(".");if(n.length<2)return;let a=n[0],r=n.slice(1),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(a):typeof s.schemas=="object"&&(o=s.schemas[a]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of r)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,n){let a=window.__openAiEditor;if(typeof a=="function"){let s=`A single, high-quality, high-detail game UI icon/asset representing "${String(n||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),a(e,s,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};function Io(i,e){let t;return function(...a){let r=()=>{clearTimeout(t),i(...a)};clearTimeout(t),t=setTimeout(r,e)}}var Tn=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.rendererRegistry=new Cn,this.updateManager=new Qe,this.quickActions=new Ln,window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
372
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Cn=class{constructor(){this.typeDetector=new mn,this.imageRenderer=new bn,this.colorRenderer=new yn,this.numberRenderer=new vn,this.textRenderer=new xn,this.booleanRenderer=new wn,this.arrayRenderer=new En,this.objectRenderer=new An(this),this.selectRenderer=new Sn}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let n=[];if(t.objects instanceof Map)for(let a of t.objects.keys())n.push(a);else typeof t.objects=="object"&&n.push(...Object.keys(t.objects));return n.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let n=window,a=n==null?void 0:n.__editableConfig,r=a==null?void 0:a.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:[],a=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(r=>String(r)).filter(r=>r.trim().length>0);return Array.from(new Set(a)).sort((r,o)=>r.localeCompare(o))}catch{return[]}}renderProperty(e,t,n,a){let r=t.toLowerCase(),o=r==="logic"||r==="logic_id"||r==="logicid",s=r==="id"&&a.toLowerCase().includes("logic");if((o||s)&&typeof n=="string"){let u=this.getLogicOptions();return this.selectRenderer.render(e,t,n,a,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"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"]}[t];if(c&&a.includes("logic.props"))return this.selectRenderer.render(e,t,n,a,c);if((t==="targetId"||t==="inputId")&&typeof n=="string"){let u=this.getObjectIds();return this.selectRenderer.render(e,t,n,a,["",...u])}let p=this.getEnumOptionsFromSchemas(a);if(p)return this.selectRenderer.render(e,t,n,a,p);switch(this.typeDetector.detectType(t,n)){case"image":return this.imageRenderer.render(e,t,n,a);case"color":return this.colorRenderer.render(e,t,n,a);case"number":return this.numberRenderer.render(e,t,n,a);case"boolean":return this.booleanRenderer.render(e,t,n,a);case"array":return this.arrayRenderer.render(e,t,n,a);case"object":return this.objectRenderer.render(e,t,n,a);case"select":return this.selectRenderer.render(e,t,n,a,[]);default:return this.textRenderer.render(e,t,n,a)}}getTypeDetector(){return this.typeDetector}};K();var Qe=class{async updateProperty(e,t,n,a={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,n);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}Se({objectId:e,path:t,value:n},{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),a.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let n=t.split("."),a=e;for(let r of n)if(a&&typeof a=="object"&&r in a)a=a[r];else return;return a}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};var Ln=class{constructor(){this.updateManager=new Qe}async handleAction(e,t,n){console.log("[QuickActionsBar] Action:",e,t,n);let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=a(t);if(!r)return;let o=this.updateManager.getNestedProperty(r,n);if(e==="ai-convert"||e==="upload"||e==="library"){let s=n==="ui.text"||n==="render.asset.path",l=n==="render.asset.path";s&&(await this.prepareForImageConversion(t,r),e==="ai-convert"&&n!=="render.asset.path"&&(n="render.asset.path"))}switch(e){case"library":this.openLibrary(t,n,o);break;case"ai-edit":this.openAIEditor(t,n,o);break;case"upload":this.openUpload(t,n);break;case"reset":await this.resetToDefault(t,n);break;case"ai-convert":this.handleAiConvert(t,n,o);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var n,a;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=((a=(n=t.transform)==null?void 0:n.scale)!=null?a: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 n=window.getEditableAssets;if(typeof n!="function")return;let a=n();if(!a||!a.slots)return;let r=e.startsWith("json.")?e.replace("json.",""):e;if(!a.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),a.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"}),a.categories&&!a.categories.includes(p)&&a.categories.push(p),a.libraryAssets&&!a.libraryAssets[p]&&(a.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,n){var r;let a=window.__debugContext;if(a){if(a.activeTab!=="library"){a.activeTab="library";let o=window.__updateWorkbenchTabs;typeof o=="function"&&o()}if(a.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),a.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,n){let a=window.__openAiEditor;if(typeof a=="function"){let r=t.split(".").pop()||t;a(r,`Edit ${r} for ${e}`,n,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){let n=document.createElement("input");n.type="file",n.accept="image/*",n.onchange=async a=>{var s;let r=(s=a.target.files)==null?void 0:s[0];if(!r)return;console.log("[QuickActionsBar] Preparing upload for:",r.name);let o=new FileReader;o.onload=async()=>{var c,p,d;let l=o.result;try{let u=window.getEditableObjectConfig,g=u==null?void 0:u(e),h=((c=g==null?void 0:g.identity)==null?void 0:c.category)||(t.split(".")[0]==="render"?"environment":"ui"),m=`${e.replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`;console.log("[QuickActionsBar] Saving uploaded file:",m,"to category:",h);let y=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:h,filename:`${m}.png`,data:l,overwrite:!0})})).json();if(y.success){console.log("[QuickActionsBar] \u2705 Uploaded and saved:",y.path);let v=window.addAssetToRegistry;typeof v=="function"&&v(h,`${m}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}}),console.log("[QuickActionsBar] \u2705 Library setup completed")}catch(C){console.warn("[QuickActionsBar] Setup-library not available:",C)}let x=window.refreshAssetLibrary;typeof x=="function"&&await x(),await this.updateManager.updateProperty(e,t,y.path);let w=window.__debugContext;(d=(p=w==null?void 0:w.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,y.path);let E=window.__highlightLibrarySlot;typeof E=="function"&&setTimeout(()=>{E(e,h)},500),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[QuickActionsBar] \u2705 Upload complete and applied")}else console.error("[QuickActionsBar] \u274C Upload failed:",y.error),alert(`Upload failed: ${y.error}`)}catch(u){console.error("[QuickActionsBar] \u274C Upload error:",u),alert("Upload failed. Check console.")}},o.readAsDataURL(r)},n.click()}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let n=await this.getDefaultValue(e,t);n!==void 0?(await this.updateManager.updateProperty(e,t,n),console.log("[QuickActionsBar] Reset to default value:",n)):alert("No default value found for this property.")}catch(n){console.error("[QuickActionsBar] Failed to reset to default:",n),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let n=t.split(".");if(n.length<2)return;let a=n[0],r=n.slice(1),o=window.__editableConfig;if(!(o!=null&&o.schemas))return;let s=null;if(o.schemas instanceof Map?s=o.schemas.get(a):typeof o.schemas=="object"&&(s=o.schemas[a]),!(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,n){let a=window.__openAiEditor;if(typeof a=="function"){let o=`A single, high-quality, high-detail game UI icon/asset representing "${String(n||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),a(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")}};function Is(i,e){let t;return function(...a){let r=()=>{clearTimeout(t),i(...a)};clearTimeout(t),t=setTimeout(r,e)}}var Tn=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.rendererRegistry=new Cn,this.updateManager=new Qe,this.quickActions=new Ln,window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
373
373
  <div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector" style="right:16px; top:72px;">
374
374
  <div class="scene-panel-header" data-panel-handle>
375
375
  <div class="panel-title">
@@ -390,22 +390,22 @@
390
390
  </div>
391
391
  </div>
392
392
  </div>
393
- `}initialize(e,t){var n;this.options=t,this.root=e.querySelector('[data-panel="inspector"]'),this.contentContainer=(n=this.root)==null?void 0:n.querySelector("[data-inspector-content]")}loadObject(e){this.selectedObjectId=e;let t=window.getEditableObjectConfig;if(typeof t!="function"){this.showError("Config system not ready");return}let n=t(e);if(!n){this.showError("Object not found");return}this.renderProperties(e,n)}renderProperties(e,t){if(!this.contentContainer)return;let n=[],a=t.identity||{},r=a.id||e,s=a.category||"unknown";n.push(`
393
+ `}initialize(e,t){var n;this.options=t,this.root=e.querySelector('[data-panel="inspector"]'),this.contentContainer=(n=this.root)==null?void 0:n.querySelector("[data-inspector-content]")}loadObject(e){this.selectedObjectId=e;let t=window.getEditableObjectConfig;if(typeof t!="function"){this.showError("Config system not ready");return}let n=t(e);if(!n){this.showError("Object not found");return}this.renderProperties(e,n)}renderProperties(e,t){if(!this.contentContainer)return;let n=[],a=t.identity||{},r=a.id||e,o=a.category||"unknown";n.push(`
394
394
  <div class="inspector-header">
395
395
  <div class="inspector-header-info">
396
396
  <div class="inspector-object-name">${r}</div>
397
- <div class="inspector-object-category">${s}</div>
397
+ <div class="inspector-object-category">${o}</div>
398
398
  </div>
399
399
  ${this.renderConversionButtons(e,t)}
400
400
  </div>
401
- `);let o=["ui","transform","render","gameplay","interaction","audio","effects","physics","motion","identity"];for(let l of o){let c=t[l];if(c){if(!this.showAdvanced&&!this.isSectionMeaningful(l,c,t))continue;n.push(this.renderSection(e,l,c,l))}}for(let l in t)if(!o.includes(l)&&typeof t[l]=="object"&&t[l]!==null){if(!this.showAdvanced&&!this.isSectionMeaningful(l,t[l],t))continue;n.push(this.renderSection(e,l,t[l],l))}this.contentContainer.innerHTML=n.join("")+this.renderFooter(t),this.attachEventListeners()}renderConversionButtons(e,t){var o,l,c,p;let n=!!t.ui,a=((o=t.ui)==null?void 0:o.renderMode)==="png"||((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.type)==="image";if(!(n||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||a)return"";let s=(p=t.ui)!=null&&p.text?"ui.text":"render.asset.path";return`
401
+ `);let s=["ui","transform","render","gameplay","interaction","audio","effects","physics","motion","identity"];for(let l of s){let c=t[l];if(c){if(!this.showAdvanced&&!this.isSectionMeaningful(l,c,t))continue;n.push(this.renderSection(e,l,c,l))}}for(let l in t)if(!s.includes(l)&&typeof t[l]=="object"&&t[l]!==null){if(!this.showAdvanced&&!this.isSectionMeaningful(l,t[l],t))continue;n.push(this.renderSection(e,l,t[l],l))}this.contentContainer.innerHTML=n.join("")+this.renderFooter(t),this.attachEventListeners()}renderConversionButtons(e,t){var s,l,c,p;let n=!!t.ui,a=((s=t.ui)==null?void 0:s.renderMode)==="png"||((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.type)==="image";if(!(n||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||a)return"";let o=(p=t.ui)!=null&&p.text?"ui.text":"render.asset.path";return`
402
402
  <div class="inspector-quick-actions">
403
403
  <button class="debug-btn debug-btn-sm success ai-simple-btn" type="button" data-convert-toggle>
404
404
  \u2728 Convert to PNG
405
405
  </button>
406
406
  <div class="inspector-convert-menu hidden" data-convert-menu>
407
407
  <button class="debug-btn debug-btn-sm" data-action="library" data-path="render.asset.path" data-object="${e}">\u{1F3A8} Library</button>
408
- <button class="debug-btn debug-btn-sm" data-action="ai-convert" data-path="${s}" data-object="${e}">\u2728 AI</button>
408
+ <button class="debug-btn debug-btn-sm" data-action="ai-convert" data-path="${o}" data-object="${e}">\u2728 AI</button>
409
409
  <button class="debug-btn debug-btn-sm" data-action="upload" data-path="render.asset.path" data-object="${e}">\u{1F4E4} Upload</button>
410
410
  </div>
411
411
  </div>
@@ -419,7 +419,7 @@
419
419
  <button class="debug-btn debug-btn-sm primary" data-inspector-add-component-btn>Add</button>
420
420
  </div>
421
421
  </div>
422
- `}renderSection(e,t,n,a){let r=[],s=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let o in n){if(!this.showAdvanced&&s.includes(o))continue;let l=n[o],c=`${a}.${o}`,p=this.rendererRegistry.renderProperty(e,o,l,c);p&&r.push(p)}return r.length===0?"":`
422
+ `}renderSection(e,t,n,a){let r=[],o=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let s in n){if(!this.showAdvanced&&o.includes(s))continue;let l=n[s],c=`${a}.${s}`,p=this.rendererRegistry.renderProperty(e,s,l,c);p&&r.push(p)}return r.length===0?"":`
423
423
  <div class="inspector-section" data-section="${t}">
424
424
  <div class="inspector-section-header" data-section-toggle="${t}">
425
425
  <span class="inspector-section-arrow">\u25BC</span>
@@ -430,7 +430,7 @@
430
430
  ${r.join("")}
431
431
  </div>
432
432
  </div>
433
- `}attachEventListeners(){var c,p,d,u;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Io((g,h,f)=>{var m,b;this.updateManager.updateProperty(g,h,f),(b=(m=this.options)==null?void 0:m.onPropertyChange)==null||b.call(m,g,h,f)},300);e.forEach(g=>{let h=m=>{var x,w;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId;if(y&&v){let E=b.value;if(b.type==="checkbox")E=b.checked;else if(b.type==="number"&&(E=parseFloat(b.value),isNaN(E)))return;b.type==="text"||b.type==="range"||b.tagName==="TEXTAREA"?t(v,y,E):(this.updateManager.updateProperty(v,y,E),(w=(x=this.options)==null?void 0:x.onPropertyChange)==null||w.call(x,v,y,E))}},f=g.dataset.propertyPath;f==="logic.id"||f!=null&&f.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",f),g.addEventListener("change",async m=>{var O;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId,x=b.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",x),!y||!v)return;await this.updateManager.updateProperty(v,y,x),console.log("[Inspector v1.0.0] Logic ID updated");let w=window,E=(O=w==null?void 0:w.__HANDLER_LOGIC_META)==null?void 0:O[x],C=this.getDefaultPropsForLogic(x,E);console.log("[Inspector v1.0.0] New logic default props:",C);let S=y.replace(".id",".props");await this.updateManager.updateProperty(v,S,C),console.log("[Inspector v1.0.0] Logic props updated to:",C),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(v)})):(g.addEventListener("change",h),(g.tagName==="INPUT"||g.tagName==="TEXTAREA")&&g.addEventListener("input",h))}),this.contentContainer.querySelectorAll("[data-action]").forEach(g=>{g.addEventListener("click",h=>{let f=h.target,m=f.dataset.action,b=f.dataset.path,y=f.dataset.object;m&&b&&y&&this.quickActions.handleAction(m,y,b)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(g=>{g.addEventListener("click",h=>{var b,y;let f=h.target,m=f.dataset.sectionToggle||((b=f.closest("[data-section-toggle]"))==null?void 0:b.getAttribute("data-section-toggle"));if(m){let v=(y=this.contentContainer)==null?void 0:y.querySelector(`[data-section="${m}"]`);v==null||v.classList.toggle("collapsed")}})});let r=(c=this.root)==null?void 0:c.querySelector("[data-inspector-advanced]");r==null||r.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let s=(p=this.root)==null?void 0:p.querySelector("[data-convert-toggle]");s==null||s.addEventListener("click",()=>{var h;let g=(h=this.root)==null?void 0:h.querySelector("[data-convert-menu]");g==null||g.classList.toggle("hidden")});let o=(d=this.contentContainer)==null?void 0:d.querySelector("[data-inspector-add-component-btn]"),l=(u=this.contentContainer)==null?void 0:u.querySelector("[data-inspector-component-select]");o==null||o.addEventListener("click",async()=>{let g=l.value;g&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,g)})}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let n=window.getEditableObjectConfig,a=n==null?void 0:n(e);if(!a){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};a[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}let r=window.__editableConfig,s=r==null?void 0:r.schemas,o=null;s instanceof Map?o=s.get(t):s&&typeof s=="object"&&(o=s[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};a[t]={...l},await this.updateManager.updateProperty(e,t,a[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,n){var r,s;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((s=(r=n.render)==null?void 0:r.asset)==null?void 0:s.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let a=Object.keys(t);return a.length===0||a.length===1&&a[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
433
+ `}attachEventListeners(){var c,p,d,u;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Is((g,h,f)=>{var m,b;this.updateManager.updateProperty(g,h,f),(b=(m=this.options)==null?void 0:m.onPropertyChange)==null||b.call(m,g,h,f)},300);e.forEach(g=>{let h=m=>{var x,w;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId;if(y&&v){let E=b.value;if(b.type==="checkbox")E=b.checked;else if(b.type==="number"&&(E=parseFloat(b.value),isNaN(E)))return;b.type==="text"||b.type==="range"||b.tagName==="TEXTAREA"?t(v,y,E):(this.updateManager.updateProperty(v,y,E),(w=(x=this.options)==null?void 0:x.onPropertyChange)==null||w.call(x,v,y,E))}},f=g.dataset.propertyPath;f==="logic.id"||f!=null&&f.endsWith(".logic.id")?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",f),g.addEventListener("change",async m=>{var M;let b=m.target,y=b.dataset.propertyPath,v=b.dataset.objectId,x=b.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",x),!y||!v)return;await this.updateManager.updateProperty(v,y,x),console.log("[Inspector v1.0.0] Logic ID updated");let w=window,E=(M=w==null?void 0:w.__HANDLER_LOGIC_META)==null?void 0:M[x],C=this.getDefaultPropsForLogic(x,E);console.log("[Inspector v1.0.0] New logic default props:",C);let S=y.replace(".id",".props");await this.updateManager.updateProperty(v,S,C),console.log("[Inspector v1.0.0] Logic props updated to:",C),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(v)})):(g.addEventListener("change",h),(g.tagName==="INPUT"||g.tagName==="TEXTAREA")&&g.addEventListener("input",h))}),this.contentContainer.querySelectorAll("[data-action]").forEach(g=>{g.addEventListener("click",h=>{let f=h.target,m=f.dataset.action,b=f.dataset.path,y=f.dataset.object;m&&b&&y&&this.quickActions.handleAction(m,y,b)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(g=>{g.addEventListener("click",h=>{var b,y;let f=h.target,m=f.dataset.sectionToggle||((b=f.closest("[data-section-toggle]"))==null?void 0:b.getAttribute("data-section-toggle"));if(m){let v=(y=this.contentContainer)==null?void 0:y.querySelector(`[data-section="${m}"]`);v==null||v.classList.toggle("collapsed")}})});let r=(c=this.root)==null?void 0:c.querySelector("[data-inspector-advanced]");r==null||r.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let o=(p=this.root)==null?void 0:p.querySelector("[data-convert-toggle]");o==null||o.addEventListener("click",()=>{var h;let g=(h=this.root)==null?void 0:h.querySelector("[data-convert-menu]");g==null||g.classList.toggle("hidden")});let s=(d=this.contentContainer)==null?void 0:d.querySelector("[data-inspector-add-component-btn]"),l=(u=this.contentContainer)==null?void 0:u.querySelector("[data-inspector-component-select]");s==null||s.addEventListener("click",async()=>{let g=l.value;g&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,g)})}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let n=window.getEditableObjectConfig,a=n==null?void 0:n(e);if(!a){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};a[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}let r=window.__editableConfig,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};a[t]={...l},await this.updateManager.updateProperty(e,t,a[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,n){var r,o;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((o=(r=n.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 a=Object.keys(t);return a.length===0||a.length===1&&a[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
434
434
  <div class="inspector-empty">
435
435
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
436
436
  <span class="inspector-empty-text">${e}</span>
@@ -440,11 +440,11 @@
440
440
  <span class="inspector-empty-icon">\u{1F3AF}</span>
441
441
  <span class="inspector-empty-text">Select an object to inspect</span>
442
442
  </div>
443
- `)}};var Dr=Ve(require("jszip"),1);function Mi(i){return new Promise((e,t)=>{let n=new FileReader;n.onerror=()=>t(new Error("FileReader failed")),n.onload=()=>e(String(n.result||"")),n.readAsDataURL(i)})}function Ar(i){var a;let[e,t]=i.split(","),n=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(a=n==null?void 0:n[1])!=null?a:"image/png"}}async function Sr(i){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=i})}async function _n(i){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",i);let n=await fetch(i);if(!n.ok)return console.warn("[ImageUtils] Fetch failed with status:",n.status,i),null;let a=await n.blob();console.log("[ImageUtils] Blob received, size:",a.size,"type:",a.type);let r=await Mi(a),s=await Sr(r),o=Ar(r);return console.log("[ImageUtils] Success resolution:",s==null?void 0:s.width,"x",s==null?void 0:s.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:r,width:(e=s==null?void 0:s.width)!=null?e:0,height:(t=s==null?void 0:s.height)!=null?t:0}}catch(n){return console.error("[ImageUtils] Error fetching image data:",n),null}}async function Te(i){var e,t;try{let n=await Mi(i),a=await Sr(n),r=Ar(n);return{base64:r.base64,mimeType:r.mimeType,dataUrl:n,width:(e=a==null?void 0:a.width)!=null?e:0,height:(t=a==null?void 0:a.height)!=null?t:0}}catch{return null}}function Oi(i){return Mi(i).then(e=>e).catch(()=>null)}function Ii(i,e){var t;try{let[n,a]=i.split(","),r=n.match(/data:(.*?);base64/),s=(t=r==null?void 0:r[1])!=null?t:"image/png",o=atob(a),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:s})}catch{return null}}async function et(i,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=i}),n=document.createElement("canvas");n.width=t.width,n.height=t.height;let a=n.getContext("2d");if(!a)return console.error("[ImageUtils] Failed to get canvas context"),i;a.drawImage(t,0,0);let r=a.getImageData(0,0,n.width,n.height),s=r.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(n.width-1)*4},{name:"bottom-left",offset:(n.height-1)*n.width*4},{name:"bottom-right",offset:((n.height-1)*n.width+(n.width-1))*4}].map(d=>({r:s[d.offset],g:s[d.offset+1],b:s[d.offset+2]})),c=0;for(let d=0;d<s.length;d+=4){let u=s[d],g=s[d+1],h=s[d+2],f=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(g-m.g,2)+Math.pow(h-m.b,2))<e){f=!0;break}f&&(s[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),a.putImageData(r,0,0),n.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),i}}function Cr(i,e){if(!i||!e)return"1:1";let t=i/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function ye(i){return typeof i=="object"&&i!==null&&!Array.isArray(i)}function W(i){return typeof i=="string"?i:void 0}function Lr(i){return i.toLowerCase().endsWith(".png")?i.slice(0,-4):i}function jo(i){var n,a,r;let e=(n=W(i.id))!=null?n:W(i.name);if(e)return e;let t=(a=W(i.file))!=null?a:W(i.asset);return t?Lr((r=t.split("/").pop())!=null?r:t):void 0}function Ro(i,e,t){var n,a,r;if(typeof e=="string")return{id:i,file:e,role:t};if(ye(e)){let s=(n=W(e.file))!=null?n:W(e.asset);return s?{id:(a=W(e.id))!=null?a:i,file:s,role:(r=W(e.role))!=null?r:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function ji(i,e){var t,n,a;if(!i)return[];if(Array.isArray(i)){let r=[];for(let s of i){if(typeof s=="string"){let o=Lr((t=s.split("/").pop())!=null?t:s);r.push({id:o,file:s,role:e});continue}if(ye(s)){let o=jo(s),l=(n=W(s.file))!=null?n:W(s.asset);if(!o||!l)continue;r.push({id:o,file:l,role:(a=W(s.role))!=null?a:e,dataUrl:W(s.dataUrl),layout:s.layout})}}return r}if(ye(i)){let r=[];for(let[s,o]of Object.entries(i)){let l=Ro(s,o,e);l&&r.push(l)}return r}return[]}function Do(i){var e,t;return(t=(e=W(i.brand_name))!=null?e:W(i.brandName))!=null?t:W(i.name)}function $o(i){if(ye(i.brand_dna)&&ye(i.brand_dna.colors))return i.brand_dna;if(ye(i.colors)){let e={colors:i.colors};return typeof i.style=="string"&&(e.style=i.style),ye(i.fonts)&&(e.fonts=i.fonts),e}}function zo(i){var t;let e=new Map;for(let n of i){let a=e.get(n.id);if(!a){e.set(n.id,n);continue}e.set(n.id,{...a,...n,file:n.file||a.file,role:n.role||a.role,dataUrl:n.dataUrl||a.dataUrl,layout:(t=n.layout)!=null?t:a.layout})}return Array.from(e.values())}function Ri(i,e={}){var s,o,l;let t=i.filter(ye),n=(o=(s=t.map(Do).find(Boolean))!=null?s:e.defaultBrandName)!=null?o:"Imported Brand",a=(l=t.map($o).find(Boolean))!=null?l:{colors:{}},r=[];for(let c of t)"layers"in c&&r.push(...ji(c.layers,"visual element")),"assets"in c&&r.push(...ji(c.assets,"visual element")),ye(c.endgame)&&"assets"in c.endgame&&r.push(...ji(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:n,brand_dna:a,assets:zo(r)}}var Tr=require("@google/genai");async function Pn(i,e,t=[],n={}){var a,r,s,o,l,c,p;try{if(!(i!=null&&i.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let y=t[b];if(!y.base64||!y.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(y.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!y.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${y.mimeType}`)}let d=new Tr.GoogleGenAI({apiKey:i}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await d.models.generateContent({model:u,contents:g}),f="",m=(s=(r=(a=h.candidates)==null?void 0:a[0])==null?void 0:r.content)==null?void 0:s.parts;if(m)for(let b of m)b.text&&(f+=b.text);if(!f.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${f.length}`),f}catch(d){throw console.error("[Gemini] API error:",d),(o=d.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=d.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=d.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(p=d.message)!=null&&p.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):d}}var _r=require("@google/genai");async function tt(i,e,t=[],n={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let a=new _r.GoogleGenAI({apiKey:i}),r=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),r.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let s=await a.models.generateContent({model:"gemini-2.5-flash-image",contents:r});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!s.candidates||!s.candidates[0]||!s.candidates[0].content||!s.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let o of s.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,c=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(a){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(a,Object.getOwnPropertyNames(a),2)),a}}function Pr(i){let e=i.brandAssets.map(r=>{let s=`- ${r.id}: ${r.role}`;return r.layout&&(s+=` [pos: ${r.layout.x.toFixed(0)},${r.layout.y.toFixed(0)}, size: ${r.layout.w.toFixed(0)}x${r.layout.h.toFixed(0)}, z: ${r.layout.z}, opacity: ${r.layout.opacity}]`),s}).join(`
443
+ `)}};var Dr=Ve(require("jszip"),1);function Oi(i){return new Promise((e,t)=>{let n=new FileReader;n.onerror=()=>t(new Error("FileReader failed")),n.onload=()=>e(String(n.result||"")),n.readAsDataURL(i)})}function Ar(i){var a;let[e,t]=i.split(","),n=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(a=n==null?void 0:n[1])!=null?a:"image/png"}}async function Sr(i){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=i})}async function _n(i){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",i);let n=await fetch(i);if(!n.ok)return console.warn("[ImageUtils] Fetch failed with status:",n.status,i),null;let a=await n.blob();console.log("[ImageUtils] Blob received, size:",a.size,"type:",a.type);let r=await Oi(a),o=await Sr(r),s=Ar(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(n){return console.error("[ImageUtils] Error fetching image data:",n),null}}async function Te(i){var e,t;try{let n=await Oi(i),a=await Sr(n),r=Ar(n);return{base64:r.base64,mimeType:r.mimeType,dataUrl:n,width:(e=a==null?void 0:a.width)!=null?e:0,height:(t=a==null?void 0:a.height)!=null?t:0}}catch{return null}}function Mi(i){return Oi(i).then(e=>e).catch(()=>null)}function Ii(i,e){var t;try{let[n,a]=i.split(","),r=n.match(/data:(.*?);base64/),o=(t=r==null?void 0:r[1])!=null?t:"image/png",s=atob(a),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 et(i,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=i}),n=document.createElement("canvas");n.width=t.width,n.height=t.height;let a=n.getContext("2d");if(!a)return console.error("[ImageUtils] Failed to get canvas context"),i;a.drawImage(t,0,0);let r=a.getImageData(0,0,n.width,n.height),o=r.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(n.width-1)*4},{name:"bottom-left",offset:(n.height-1)*n.width*4},{name:"bottom-right",offset:((n.height-1)*n.width+(n.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],h=o[d+2],f=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(g-m.g,2)+Math.pow(h-m.b,2))<e){f=!0;break}f&&(o[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),a.putImageData(r,0,0),n.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),i}}function Cr(i,e){if(!i||!e)return"1:1";let t=i/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function ye(i){return typeof i=="object"&&i!==null&&!Array.isArray(i)}function W(i){return typeof i=="string"?i:void 0}function Lr(i){return i.toLowerCase().endsWith(".png")?i.slice(0,-4):i}function js(i){var n,a,r;let e=(n=W(i.id))!=null?n:W(i.name);if(e)return e;let t=(a=W(i.file))!=null?a:W(i.asset);return t?Lr((r=t.split("/").pop())!=null?r:t):void 0}function Rs(i,e,t){var n,a,r;if(typeof e=="string")return{id:i,file:e,role:t};if(ye(e)){let o=(n=W(e.file))!=null?n:W(e.asset);return o?{id:(a=W(e.id))!=null?a:i,file:o,role:(r=W(e.role))!=null?r:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function ji(i,e){var t,n,a;if(!i)return[];if(Array.isArray(i)){let r=[];for(let o of i){if(typeof o=="string"){let s=Lr((t=o.split("/").pop())!=null?t:o);r.push({id:s,file:o,role:e});continue}if(ye(o)){let s=js(o),l=(n=W(o.file))!=null?n:W(o.asset);if(!s||!l)continue;r.push({id:s,file:l,role:(a=W(o.role))!=null?a:e,dataUrl:W(o.dataUrl),layout:o.layout})}}return r}if(ye(i)){let r=[];for(let[o,s]of Object.entries(i)){let l=Rs(o,s,e);l&&r.push(l)}return r}return[]}function Ds(i){var e,t;return(t=(e=W(i.brand_name))!=null?e:W(i.brandName))!=null?t:W(i.name)}function $s(i){if(ye(i.brand_dna)&&ye(i.brand_dna.colors))return i.brand_dna;if(ye(i.colors)){let e={colors:i.colors};return typeof i.style=="string"&&(e.style=i.style),ye(i.fonts)&&(e.fonts=i.fonts),e}}function zs(i){var t;let e=new Map;for(let n of i){let a=e.get(n.id);if(!a){e.set(n.id,n);continue}e.set(n.id,{...a,...n,file:n.file||a.file,role:n.role||a.role,dataUrl:n.dataUrl||a.dataUrl,layout:(t=n.layout)!=null?t:a.layout})}return Array.from(e.values())}function Ri(i,e={}){var o,s,l;let t=i.filter(ye),n=(s=(o=t.map(Ds).find(Boolean))!=null?o:e.defaultBrandName)!=null?s:"Imported Brand",a=(l=t.map($s).find(Boolean))!=null?l:{colors:{}},r=[];for(let c of t)"layers"in c&&r.push(...ji(c.layers,"visual element")),"assets"in c&&r.push(...ji(c.assets,"visual element")),ye(c.endgame)&&"assets"in c.endgame&&r.push(...ji(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:n,brand_dna:a,assets:zs(r)}}var Tr=require("@google/genai");async function kn(i,e,t=[],n={}){var a,r,o,s,l,c,p;try{if(!(i!=null&&i.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let y=t[b];if(!y.base64||!y.mimeType)throw new Error(`Image ${b+1} is missing required data`);if(y.base64.length<1e3&&console.warn(`Image ${b+1} data appears very small, may be corrupted`),!y.mimeType.startsWith("image/"))throw new Error(`Image ${b+1} has invalid MIME type: ${y.mimeType}`)}let d=new Tr.GoogleGenAI({apiKey:i}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await d.models.generateContent({model:u,contents:g}),f="",m=(o=(r=(a=h.candidates)==null?void 0:a[0])==null?void 0:r.content)==null?void 0:o.parts;if(m)for(let b of m)b.text&&(f+=b.text);if(!f.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${f.length}`),f}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 _r=require("@google/genai");async function tt(i,e,t=[],n={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let a=new _r.GoogleGenAI({apiKey:i}),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 a.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(a){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(a,Object.getOwnPropertyNames(a),2)),a}}function kr(i){let e=i.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(`
444
444
  `)||"None",t=i.brandDna?`Colors: ${JSON.stringify(i.brandDna.colors)}, Style: ${i.brandDna.style||"not specified"}`:"Not provided",n=i.gameObjects.map(r=>typeof r=="string"?`- id: ${r}`:`- id: ${r.id}${r.category?`, category: ${r.category}`:""}${r.type?`, type: ${r.type}`:""}`).join(`
445
- `),a="";if(i.brandConfig){let r=i.brandConfig,s=[];r.splash&&s.push(`SPLASH: title="${r.splash.title||""}", subtitle="${r.splash.subtitle||""}", button="${r.splash.button_label||""}"`),r.endgame&&s.push(`ENDGAME: title="${r.endgame.title||""}", subtitle="${r.endgame.subtitle||""}", cta="${r.endgame.cta_label||""}"`),r.tutorial&&s.push(`TUTORIAL: text="${r.tutorial.label_text||""}", helper="${r.tutorial.helper_text||""}"`),s.length>0&&(a=`
445
+ `),a="";if(i.brandConfig){let r=i.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&&(a=`
446
446
  BRAND CONTENT:
447
- ${s.join(`
447
+ ${o.join(`
448
448
  `)}
449
449
  `)}return`
450
450
  You are analyzing a brand's visual design for use in a playable ad game.
@@ -504,7 +504,7 @@ OUTPUT ONLY VALID JSON (no markdown, no explanation):
504
504
  }
505
505
  ]
506
506
  }
507
- `.trim()}function kr(i){var a,r;let e=(a=i.brandDna)!=null&&a.colors?`Primary: ${i.brandDna.colors.primary}, Secondary: ${i.brandDna.colors.secondary||"N/A"}, Accent: ${i.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((r=i.brandDna)==null?void 0:r.style)||"modern gaming style",n=i.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
507
+ `.trim()}function Pr(i){var a,r;let e=(a=i.brandDna)!=null&&a.colors?`Primary: ${i.brandDna.colors.primary}, Secondary: ${i.brandDna.colors.secondary||"N/A"}, Accent: ${i.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((r=i.brandDna)==null?void 0:r.style)||"modern gaming style",n=i.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
508
508
  TASK: ${i.prompt}
509
509
 
510
510
  BRAND STYLE:
@@ -525,7 +525,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
525
525
 
526
526
  OUTPUT:
527
527
  Generate the requested asset matching the brand style.${i.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
528
- `.trim()}function Mr(i){return i.map(e=>{if(typeof e=="string"){let t=e,n,a;return t.includes("background")?(n="background",a="background"):t.includes("button")||t.includes("cta")?(n="ui",a="button"):t.includes("logo")?(n="ui",a="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(n="text",a="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(n="effects",a="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(n="ui",a="image"):(n="environment",a="interactive"),{id:t,category:n,type:a}}return e})}function Or(i,e){return!(i.includes("background")&&(i.includes("_1")||i.includes("splash")||i.includes("endgame")||i.includes("main"))||e==="text"||e==="effects"&&i.includes("particle"))}async function Ir(i){var s,o;let e=Mr(i.gameObjects),t={gamePrompt:i.gamePrompt,gameObjects:e,brandAssets:i.manifest.assets,brandDna:i.manifest.brand_dna,brandName:i.manifest.brand_name},n=Pr(t),a=[];if(i.flatDesignDataUrl)try{let l=jr(i.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(a.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",a.length,"images...");let r;try{r=await Pn(i.apiKey,n,a,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(s=l.message)!=null&&s.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return No(r,i.gameObjects)}function No(i,e){try{let t=i,n=i.match(/```(?:json)?\s*([\s\S]*?)```/);if(n)t=n[1].trim();else{let r=i.match(/\{[\s\S]*\}/);r&&(t=r[0])}let a=JSON.parse(t);return a.mappings&&Array.isArray(a.mappings)?{mappingResult:a,rawResponse:i,parsed:!0}:{mappingResult:{mappings:e.map(r=>({game_object:r,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:i,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(n=>({game_object:n,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:i,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function Di(i,e,t={}){var a;let n=e.mappings.filter(r=>r.action==="GENERATE");if(n.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${n.length} assets...`);for(let r=0;r<n.length;r++){let s=n[r];(a=t.onProgress)==null||a.call(t,r+1,n.length,s.game_object);try{let o=await Ho(i,s);s.output_dataUrl=o,s.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${s.game_object}:`,o),s.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Ho(i,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&i.manifest){let o=i.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=i.assetFiles.get(o.file);if(l){let c=await Te(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(i.flatDesignDataUrl){let o=jr(i.flatDesignDataUrl);o&&t.push(o)}let n=Or(e.game_object),a={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:i.manifest.brand_dna,needsTransparency:n},r=kr(a);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${n})`);let s=await tt(i.apiKey,r,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return n&&await et(s)||s}function jr(i){let[e,t]=i.split(","),n=e==null?void 0:e.match(/data:(.*?);base64/);return t&&n?{base64:t,mimeType:n[1]}:null}async function Rr(i,e){let t=i.assets,n=[];Array.isArray(t)?n=t:t&&typeof t=="object"?n=Object.entries(t).map(([a,r])=>({id:a,file:String(r),role:"visual element"})):n=[],i.assets=n;for(let a of n){let r=e.get(a.file);if(r){let s=await Te(r);s&&(a.dataUrl=s.dataUrl)}}}var kn=class{constructor(){this.root=null;this.currentTab="upload";this.uploadMethod="individual";this.uploadedJsons=new Map;this.normalizedManifest=null;this.flatDesignDataUrl=null;this.assetFiles=new Map;this.zipFile=null;this.mappingResult=null;this.analysisRawResponse=null;this.analysisParsedOk=null;this.analysisParseError=null;this.isAnalyzing=!1;this.isGenerating=!1}get manifest(){return this.normalizedManifest}render(){return`
528
+ `.trim()}function Or(i){return i.map(e=>{if(typeof e=="string"){let t=e,n,a;return t.includes("background")?(n="background",a="background"):t.includes("button")||t.includes("cta")?(n="ui",a="button"):t.includes("logo")?(n="ui",a="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(n="text",a="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(n="effects",a="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(n="ui",a="image"):(n="environment",a="interactive"),{id:t,category:n,type:a}}return e})}function Mr(i,e){return!(i.includes("background")&&(i.includes("_1")||i.includes("splash")||i.includes("endgame")||i.includes("main"))||e==="text"||e==="effects"&&i.includes("particle"))}async function Ir(i){var o,s;let e=Or(i.gameObjects),t={gamePrompt:i.gamePrompt,gameObjects:e,brandAssets:i.manifest.assets,brandDna:i.manifest.brand_dna,brandName:i.manifest.brand_name},n=kr(t),a=[];if(i.flatDesignDataUrl)try{let l=jr(i.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(a.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",a.length,"images...");let r;try{r=await kn(i.apiKey,n,a,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(o=l.message)!=null&&o.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(s=l.message)!=null&&s.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return Ns(r,i.gameObjects)}function Ns(i,e){try{let t=i,n=i.match(/```(?:json)?\s*([\s\S]*?)```/);if(n)t=n[1].trim();else{let r=i.match(/\{[\s\S]*\}/);r&&(t=r[0])}let a=JSON.parse(t);return a.mappings&&Array.isArray(a.mappings)?{mappingResult:a,rawResponse:i,parsed:!0}:{mappingResult:{mappings:e.map(r=>({game_object:r,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:i,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(n=>({game_object:n,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:i,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function Di(i,e,t={}){var a;let n=e.mappings.filter(r=>r.action==="GENERATE");if(n.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${n.length} assets...`);for(let r=0;r<n.length;r++){let o=n[r];(a=t.onProgress)==null||a.call(t,r+1,n.length,o.game_object);try{let s=await Hs(i,o);o.output_dataUrl=s,o.status="Generated \u2713"}catch(s){console.error(`[Pipeline] Failed to generate ${o.game_object}:`,s),o.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function Hs(i,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&i.manifest){let s=i.manifest.assets.find(l=>l.id===e.reference_asset);if(s){let l=i.assetFiles.get(s.file);if(l){let c=await Te(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(i.flatDesignDataUrl){let s=jr(i.flatDesignDataUrl);s&&t.push(s)}let n=Mr(e.game_object),a={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:i.manifest.brand_dna,needsTransparency:n},r=Pr(a);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${n})`);let o=await tt(i.apiKey,r,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return n&&await et(o)||o}function jr(i){let[e,t]=i.split(","),n=e==null?void 0:e.match(/data:(.*?);base64/);return t&&n?{base64:t,mimeType:n[1]}:null}async function Rr(i,e){let t=i.assets,n=[];Array.isArray(t)?n=t:t&&typeof t=="object"?n=Object.entries(t).map(([a,r])=>({id:a,file:String(r),role:"visual element"})):n=[],i.assets=n;for(let a of n){let r=e.get(a.file);if(r){let o=await Te(r);o&&(a.dataUrl=o.dataUrl)}}}var Pn=class{constructor(){this.root=null;this.currentTab="upload";this.uploadMethod="individual";this.uploadedJsons=new Map;this.normalizedManifest=null;this.flatDesignDataUrl=null;this.assetFiles=new Map;this.zipFile=null;this.mappingResult=null;this.analysisRawResponse=null;this.analysisParsedOk=null;this.analysisParseError=null;this.isAnalyzing=!1;this.isGenerating=!1}get manifest(){return this.normalizedManifest}render(){return`
529
529
  <div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
530
530
  <div class="scene-panel-header" data-panel-handle>
531
531
  <div class="panel-title">
@@ -641,15 +641,15 @@ Generate the requested asset matching the brand style.${i.needsTransparency?" Ba
641
641
  </div>
642
642
  <div class="panel-resize-handle" data-panel-resize></div>
643
643
  </div>
644
- `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,n,a,r,s,o,l,c,p,d,u,g,h;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let f="/dashboard";window.location.pathname!==f&&(window.location.href=f)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(f=>{f.addEventListener("click",()=>{let m=f.dataset.visionTab;this.switchTab(m)})}),(n=this.root.querySelector("[data-vision-upload-method]"))==null||n.addEventListener("change",f=>{let m=f.target.value;this.switchUploadMethod(m)}),(a=this.root.querySelector("[data-vision-upload-manifest]"))==null||a.addEventListener("click",()=>{var f,m;(m=(f=this.root)==null?void 0:f.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(r=this.root.querySelector("[data-vision-upload-zip]"))==null||r.addEventListener("click",()=>{var f,m;(m=(f=this.root)==null?void 0:f.querySelector("[data-vision-zip-input]"))==null||m.click()}),(s=this.root.querySelector("[data-vision-zip-input]"))==null||s.addEventListener("change",f=>{this.handleZipUpload(f)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",f=>{this.handleManifestUpload(f)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var f,m;(m=(f=this.root)==null?void 0:f.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",f=>{this.handleAssetsUpload(f)}),(p=this.root.querySelector("[data-vision-upload-flat]"))==null||p.addEventListener("click",()=>{var f,m;(m=(f=this.root)==null?void 0:f.querySelector("[data-vision-flat-input]"))==null||m.click()}),(d=this.root.querySelector("[data-vision-flat-input]"))==null||d.addEventListener("change",f=>{this.handleFlatDesignUpload(f)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(h=this.root.querySelector("[data-vision-apply-all]"))==null||h.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",f=>{let m=f.target;if(!m)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;y&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(y),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(y),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(y),m.closest("[data-mapping-generate-one]")&&this.generateOne(y),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",f=>{let m=f.target;if(!m||!this.mappingResult)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(x=>x.game_object===y);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",f=>{let m=f.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(x=>x.game_object===y);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,n;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(a=>a.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(a=>a.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(n=this.root.querySelector(`[data-vision-content="${e}"]`))==null||n.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(n=>{n.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var a;let n=(a=e.target.files)==null?void 0:a[0];if(n){this.zipFile=n,this.setStatus("zip",`Selected: ${n.name} (${(n.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(n)}catch(r){console.error("[BrandVision] ZIP processing failed:",r),this.setStatus("zip",`Error: ${r instanceof Error?r.message:"Unknown error"}`)}}}async processZipFile(e){var s,o;let t=await Dr.loadAsync(e),n=[],a=[];t.forEach((l,c)=>{let p=l.toLowerCase();p.endsWith(".json")?n.push({name:l,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&a.push({name:l,file:c})});for(let l of n)try{let c=await((s=t.file(l.name))==null?void 0:s.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let r=new Map;for(let l of a)try{let c=await l.file.async("uint8array"),p=new Blob([c],{type:"image/png"}),d=l.name.split("/").pop()||l.name;console.log(`Processing ${d}, uint8array length: ${c.length}, blob size: ${p.size}`);let u;try{u=await this.blobToDataUrl(p)}catch(m){console.warn(`FileReader failed for ${d}, using fallback:`,m),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${d}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(d.replace(".png",""));console.log(`Saving ${d} to category: ${g}`);let f=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}:`,f),f.success){console.log(`\u2705 Saved PNG to library: ${d} (${g}) at ${f.path}`);let m=new File([p],d,{type:"image/png"});r.set(d,m)}else console.warn(`\u274C Failed to save ${d}:`,f.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),n.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=r;try{this.normalizedManifest=Ri(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: ${n.length} JSONs, ${c} PNGs
645
- \u{1F3F7}\uFE0F Brand: ${((o=this.normalizedManifest)==null?void 0:o.brand_name)||"Imported Brand"}`),this.addAssetsToRegistry(l),this.refreshLibrary()}catch(l){console.error("[BrandVision] Failed to normalize ZIP manifest:",l),this.normalizedManifest=null,this.setStatus("zip","\u274C Failed to normalize manifest")}}async fileToDataUrl(e){return new Promise((t,n)=>{let a=new FileReader;a.onload=()=>t(a.result),a.onerror=n,a.readAsDataURL(e)})}async blobToDataUrl(e){return new Promise((t,n)=>{let a=new FileReader;a.onload=()=>{let r=a.result;console.log("FileReader result type:",typeof r,"length:",r.length),console.log("Data URL prefix:",r.substring(0,30)),t(r)},a.onerror=r=>{console.error("FileReader error:",r),n(r)},a.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 n=t();if(!(n!=null&&n.libraryAssets))return;let a={};for(let r of e){let s=r.category||"misc";a[s]||(a[s]=[]),n.libraryAssets[s]||(n.libraryAssets[s]=[]),n.libraryAssets[s].some(l=>l.filename===r.filename)||(n.libraryAssets[s].unshift({filename:r.filename,displayName:r.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${r.filename} to registry category ${s}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var r;let t=e.target,n=t.files;if(!n||n.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let a="";for(let s of Array.from(n))try{let o=await s.text(),l=JSON.parse(o);this.uploadedJsons.set(s.name,l),l.layers?a+=`\u2705 Layers: ${s.name}
646
- `:l.brand_dna||l.colors?a+=`\u2705 Brand: ${s.name}
647
- `:a+=`\u2705 Loaded: ${s.name}
648
- `}catch{a+=`\u274C Error in ${s.name}
649
- `}try{this.normalizedManifest=Ri(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let s=Array.isArray((r=this.normalizedManifest)==null?void 0:r.assets)?this.normalizedManifest.assets.length:0;a+=`
650
- \u{1F4E6} Normalized manifest: ${s} assets`,a+=`
651
- \u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:s,brandName:this.normalizedManifest.brand_name})}catch(s){console.error("[BrandVision] Failed to normalize manifest:",s),this.normalizedManifest=null,a+=`
652
- \u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",a.trim())}async handleAssetsUpload(e){let n=e.target.files;if(!(!n||n.length===0)){for(let a of Array.from(n))this.assetFiles.set(a.name,a);this.setStatus("assets",`${this.assetFiles.size} files loaded`)}}async handleFlatDesignUpload(e){var r,s;let n=(r=e.target.files)==null?void 0:r[0];if(!n)return;let a=await Te(n);if(a){this.flatDesignDataUrl=a.dataUrl,this.setStatus("flat",n.name);let o=(s=this.root)==null?void 0:s.querySelector("[data-vision-flat-preview]");o&&(o.innerHTML=`<img src="${a.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var n,a,r,s,o,l,c;if(this.isAnalyzing)return;let e=(r=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:r.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await Rr(t,this.assetFiles);let p={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},d=await Ir(p);this.mappingResult=d.mappingResult,this.analysisRawResponse=d.rawResponse,this.analysisParsedOk=d.parsed,this.analysisParseError=(s=d.parseError)!=null?s:null,this.renderMappings(),d.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(o=this.mappingResult)==null?void 0:o.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${d.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(p){console.error("[BrandVision] Analysis failed:",p),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,n,a;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(a=(n=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let r={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Di(r,this.mappingResult,{onProgress:(s,o,l)=>{this.setStatus("apply",`Generating ${s}/${o}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(r){console.error("[BrandVision] Generation failed:",r),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var o;let e=(o=this.root)==null?void 0:o.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,n=this.getEngineAssets(),a=!!this.analysisRawResponse&&this.analysisParsedOk===!1,r=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),s=a?`
644
+ `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,n,a,r,o,s,l,c,p,d,u,g,h;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let f="/dashboard";window.location.pathname!==f&&(window.location.href=f)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(f=>{f.addEventListener("click",()=>{let m=f.dataset.visionTab;this.switchTab(m)})}),(n=this.root.querySelector("[data-vision-upload-method]"))==null||n.addEventListener("change",f=>{let m=f.target.value;this.switchUploadMethod(m)}),(a=this.root.querySelector("[data-vision-upload-manifest]"))==null||a.addEventListener("click",()=>{var f,m;(m=(f=this.root)==null?void 0:f.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(r=this.root.querySelector("[data-vision-upload-zip]"))==null||r.addEventListener("click",()=>{var f,m;(m=(f=this.root)==null?void 0:f.querySelector("[data-vision-zip-input]"))==null||m.click()}),(o=this.root.querySelector("[data-vision-zip-input]"))==null||o.addEventListener("change",f=>{this.handleZipUpload(f)}),(s=this.root.querySelector("[data-vision-manifest-input]"))==null||s.addEventListener("change",f=>{this.handleManifestUpload(f)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var f,m;(m=(f=this.root)==null?void 0:f.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",f=>{this.handleAssetsUpload(f)}),(p=this.root.querySelector("[data-vision-upload-flat]"))==null||p.addEventListener("click",()=>{var f,m;(m=(f=this.root)==null?void 0:f.querySelector("[data-vision-flat-input]"))==null||m.click()}),(d=this.root.querySelector("[data-vision-flat-input]"))==null||d.addEventListener("change",f=>{this.handleFlatDesignUpload(f)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(h=this.root.querySelector("[data-vision-apply-all]"))==null||h.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",f=>{let m=f.target;if(!m)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;y&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(y),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(y),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(y),m.closest("[data-mapping-generate-one]")&&this.generateOne(y),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",f=>{let m=f.target;if(!m||!this.mappingResult)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(x=>x.game_object===y);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",f=>{let m=f.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(x=>x.game_object===y);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,n;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(a=>a.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(a=>a.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(n=this.root.querySelector(`[data-vision-content="${e}"]`))==null||n.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(n=>{n.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var a;let n=(a=e.target.files)==null?void 0:a[0];if(n){this.zipFile=n,this.setStatus("zip",`Selected: ${n.name} (${(n.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(n)}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 Dr.loadAsync(e),n=[],a=[];t.forEach((l,c)=>{let p=l.toLowerCase();p.endsWith(".json")?n.push({name:l,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&a.push({name:l,file:c})});for(let l of n)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 a)try{let c=await l.file.async("uint8array"),p=new Blob([c],{type:"image/png"}),d=l.name.split("/").pop()||l.name;console.log(`Processing ${d}, uint8array length: ${c.length}, blob size: ${p.size}`);let u;try{u=await this.blobToDataUrl(p)}catch(m){console.warn(`FileReader failed for ${d}, using fallback:`,m),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${d}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(d.replace(".png",""));console.log(`Saving ${d} to category: ${g}`);let f=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}:`,f),f.success){console.log(`\u2705 Saved PNG to library: ${d} (${g}) at ${f.path}`);let m=new File([p],d,{type:"image/png"});r.set(d,m)}else console.warn(`\u274C Failed to save ${d}:`,f.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),n.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=r;try{this.normalizedManifest=Ri(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: ${n.length} JSONs, ${c} PNGs
645
+ \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,n)=>{let a=new FileReader;a.onload=()=>t(a.result),a.onerror=n,a.readAsDataURL(e)})}async blobToDataUrl(e){return new Promise((t,n)=>{let a=new FileReader;a.onload=()=>{let r=a.result;console.log("FileReader result type:",typeof r,"length:",r.length),console.log("Data URL prefix:",r.substring(0,30)),t(r)},a.onerror=r=>{console.error("FileReader error:",r),n(r)},a.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 n=t();if(!(n!=null&&n.libraryAssets))return;let a={};for(let r of e){let o=r.category||"misc";a[o]||(a[o]=[]),n.libraryAssets[o]||(n.libraryAssets[o]=[]),n.libraryAssets[o].some(l=>l.filename===r.filename)||(n.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,n=t.files;if(!n||n.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let a="";for(let o of Array.from(n))try{let s=await o.text(),l=JSON.parse(s);this.uploadedJsons.set(o.name,l),l.layers?a+=`\u2705 Layers: ${o.name}
646
+ `:l.brand_dna||l.colors?a+=`\u2705 Brand: ${o.name}
647
+ `:a+=`\u2705 Loaded: ${o.name}
648
+ `}catch{a+=`\u274C Error in ${o.name}
649
+ `}try{this.normalizedManifest=Ri(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let o=Array.isArray((r=this.normalizedManifest)==null?void 0:r.assets)?this.normalizedManifest.assets.length:0;a+=`
650
+ \u{1F4E6} Normalized manifest: ${o} assets`,a+=`
651
+ \u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:o,brandName:this.normalizedManifest.brand_name})}catch(o){console.error("[BrandVision] Failed to normalize manifest:",o),this.normalizedManifest=null,a+=`
652
+ \u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",a.trim())}async handleAssetsUpload(e){let n=e.target.files;if(!(!n||n.length===0)){for(let a of Array.from(n))this.assetFiles.set(a.name,a);this.setStatus("assets",`${this.assetFiles.size} files loaded`)}}async handleFlatDesignUpload(e){var r,o;let n=(r=e.target.files)==null?void 0:r[0];if(!n)return;let a=await Te(n);if(a){this.flatDesignDataUrl=a.dataUrl,this.setStatus("flat",n.name);let s=(o=this.root)==null?void 0:o.querySelector("[data-vision-flat-preview]");s&&(s.innerHTML=`<img src="${a.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var n,a,r,o,s,l,c;if(this.isAnalyzing)return;let e=(r=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:r.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await Rr(t,this.assetFiles);let p={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},d=await Ir(p);this.mappingResult=d.mappingResult,this.analysisRawResponse=d.rawResponse,this.analysisParsedOk=d.parsed,this.analysisParseError=(o=d.parseError)!=null?o:null,this.renderMappings(),d.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(s=this.mappingResult)==null?void 0:s.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${d.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(p){console.error("[BrandVision] Analysis failed:",p),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,n,a;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(a=(n=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let r={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Di(r,this.mappingResult,{onProgress:(o,s,l)=>{this.setStatus("apply",`Generating ${o}/${s}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(r){console.error("[BrandVision] Generation failed:",r),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var s;let e=(s=this.root)==null?void 0:s.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,n=this.getEngineAssets(),a=!!this.analysisRawResponse&&this.analysisParsedOk===!1,r=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),o=a?`
653
653
  <div class="vision-raw-block">
654
654
  <div class="inspector-text-sm" style="white-space: pre-wrap;">
655
655
  \u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
@@ -658,7 +658,7 @@ Generate the requested asset matching the brand style.${i.needsTransparency?" Ba
658
658
  <textarea class="inspector-input vision-raw-textarea" readonly>${this.analysisRawResponse||""}</textarea>
659
659
  </div>
660
660
  `:"";e.innerHTML=`
661
- ${s}
661
+ ${o}
662
662
  ${this.mappingResult.mappings.map(l=>{var b;let c=n[l.game_object]||"",p=l.brand_asset||"",d=(b=t==null?void 0:t.assets)==null?void 0:b.find(y=>y.id===p),u=(d==null?void 0:d.dataUrl)||"",g=l.output_dataUrl||"",h=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",f=!!h,m=`
663
663
  <select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
664
664
  <option value="">Select brand asset\u2026</option>
@@ -711,8 +711,8 @@ Generate the requested asset matching the brand style.${i.needsTransparency?" Ba
711
711
  </div>
712
712
  </div>
713
713
  `}).join("")}
714
- `}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(n=>n.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let n=this.manifest.assets.find(a=>a.id===t.brand_asset);if(n!=null&&n.dataUrl)return{value:n.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let n of this.mappingResult.mappings){if(n.action==="KEEP"||n.action==="APPLY"&&!n.brand_asset||n.action==="GENERATE"&&!n.output_dataUrl)continue;let a=n.game_object,r=this.getPreviewValueForMapping(a);if(!r.value)continue;let s=e.saveToLibrary?await this.saveToLibraryAndReturnPath(a,r.value):r.value;s&&(await this.stageEngineAssetOverride(a,s),n.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(r=>r.game_object===e);n&&(n.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var r;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let n=await this.saveToLibraryAndReturnPath(e,t.value);if(!n){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,n);let a=(r=this.mappingResult)==null?void 0:r.mappings.find(s=>s.game_object===e);a&&(a.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(s=>s.game_object===e);if(!t)return;let n=this.getPreviewValueForMapping(e),a=window.__openAiEditor;if(typeof a!="function"){this.setStatus("apply","AI editor not available");return}let r=t.action==="GENERATE"?t.generation_prompt:void 0;a(e,r,n.value||void 0,{path:`assets.${e}`})}async generateOne(e){var a,r,s;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let n=(s=(r=(a=this.root)==null?void 0:a.querySelector("[data-vision-api-key]"))==null?void 0:r.value)==null?void 0:s.trim();if(!n||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let o={apiKey:n,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Di(o,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(o){console.error("[BrandVision] generateOne failed:",o),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:n}=await Promise.resolve().then(()=>(K(),Je));n({path:`assets.${e}`,value:t},{silent:!0});let a=window.applyEditableEngineConfig;typeof a=="function"&&a({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let n=this.inferCategoryFromAssetKey(e),a=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let s=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:a,data:t,overwrite:!0})})).json();if(!(s!=null&&s.success)||!(s!=null&&s.path))return console.error("[BrandVision] Save to library failed:",(s==null?void 0:s.error)||s),null;let o=window.addAssetToRegistry;typeof o=="function"&&o(n,a);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(s.path)}catch(r){return console.error("[BrandVision] Save to library error:",r),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let a=t();if(a!=null&&a.slots&&Array.isArray(a.slots)){let s=a.slots.find(o=>o.slotId===e||o.currentAsset===e);if(s!=null&&s.category)return String(s.category)}let r=a==null?void 0:a.categories;if(Array.isArray(r)&&r.length>0){let s=e.toLowerCase(),o=l=>r.find(c=>c.toLowerCase().includes(l));return s.includes("bg")||s.includes("background")?o("background")||r[0]:(s.includes("cta")||s.includes("button")||s.includes("ui")||s.includes("logo"))&&o("ui")||r[0]}}let n=e.toLowerCase();return n.includes("bg")||n.includes("background")?"backgrounds":n.includes("cta")||n.includes("button")||n.includes("ui")||n.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var r;let n={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},a=(r=this.root)==null?void 0:r.querySelector(n[e]);a&&(a.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let n=t.clientX,a=this.root.getBoundingClientRect().width,r=o=>{let l=Math.max(300,a+(o.clientX-n));this.root.style.width=`${l}px`},s=()=>{window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",s)};window.addEventListener("pointermove",r),window.addEventListener("pointerup",s)})}refresh(){}};function $r(i,e={}){let{includeReference:t=!1,includeMagenta:n=!0,changeLevel:a=5}=e;return[`TASK: ${i}`,`CHANGE_STRENGTH: ${a}/10`,t?"REFERENCE: provided":"REFERENCE: none",n?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
715
- `)}var Bo=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],Fo=["cta_hint","cta_label_end"],zr=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],Uo=["brand.primary","brand.heading","brand.body","brand.warning"],Mn=class{constructor(){this.root=null;this.assetsContainer=null;this.colorsContainer=null;this.fontsContainer=null;this.textsContainer=null;this.audioContainer=null;this.options=null;this.previewModal=null;this.autoApplyTimer=null;this.activePreviewKey=null;this.activePreviewValue=null;this.activePreviewFileInput=null;this.retryTimer=null;this.aiModal=null;this.aiTargetKey=null;this.aiKeyInput=null;this.aiPromptInput=null;this.aiStrengthInput=null;this.aiStrengthValue=null;this.aiModelSelect=null;this.aiModalSubtitle=null;this.aiGalleryToggle=null;this.aiGalleryEl=null;this.aiGalleryGrid=null;this.aiReferenceInput=null;this.aiReferenceName=null;this.aiReferenceFile=null;this.aiRemoveBgToggle=null;this.aiUseOutputToggle=null;this.aiGenerateBtn=null;this.aiApplyBtn=null;this.aiSaveLibraryBtn=null;this.aiCropBtn=null;this.aiDownloadBtn=null;this.aiPreviewImg=null;this.aiStatusEl=null;this.aiOutputDataUrl=null;this.aiBaseDataUrl=null;this.aiBaseValue=null;this.aiOutputKey=null;this.aiContext=null;this.aiBgToleranceInput=null;this.aiBgToleranceValue=null;this.aiRawOutputDataUrl=null;this.aiLoadingEl=null}render(){return`
714
+ `}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(n=>n.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let n=this.manifest.assets.find(a=>a.id===t.brand_asset);if(n!=null&&n.dataUrl)return{value:n.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let n of this.mappingResult.mappings){if(n.action==="KEEP"||n.action==="APPLY"&&!n.brand_asset||n.action==="GENERATE"&&!n.output_dataUrl)continue;let a=n.game_object,r=this.getPreviewValueForMapping(a);if(!r.value)continue;let o=e.saveToLibrary?await this.saveToLibraryAndReturnPath(a,r.value):r.value;o&&(await this.stageEngineAssetOverride(a,o),n.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(r=>r.game_object===e);n&&(n.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var r;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let n=await this.saveToLibraryAndReturnPath(e,t.value);if(!n){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,n);let a=(r=this.mappingResult)==null?void 0:r.mappings.find(o=>o.game_object===e);a&&(a.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;let n=this.getPreviewValueForMapping(e),a=window.__openAiEditor;if(typeof a!="function"){this.setStatus("apply","AI editor not available");return}let r=t.action==="GENERATE"?t.generation_prompt:void 0;a(e,r,n.value||void 0,{path:`assets.${e}`})}async generateOne(e){var a,r,o;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(s=>s.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let n=(o=(r=(a=this.root)==null?void 0:a.querySelector("[data-vision-api-key]"))==null?void 0:r.value)==null?void 0:o.trim();if(!n||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let s={apiKey:n,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Di(s,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(s){console.error("[BrandVision] generateOne failed:",s),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:n}=await Promise.resolve().then(()=>(K(),Je));n({path:`assets.${e}`,value:t},{silent:!0});let a=window.applyEditableEngineConfig;typeof a=="function"&&a({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let n=this.inferCategoryFromAssetKey(e),a=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let o=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:a,data:t,overwrite:!0})})).json();if(!(o!=null&&o.success)||!(o!=null&&o.path))return console.error("[BrandVision] Save to library failed:",(o==null?void 0:o.error)||o),null;let s=window.addAssetToRegistry;typeof s=="function"&&s(n,a);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(o.path)}catch(r){return console.error("[BrandVision] Save to library error:",r),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let a=t();if(a!=null&&a.slots&&Array.isArray(a.slots)){let o=a.slots.find(s=>s.slotId===e||s.currentAsset===e);if(o!=null&&o.category)return String(o.category)}let r=a==null?void 0:a.categories;if(Array.isArray(r)&&r.length>0){let o=e.toLowerCase(),s=l=>r.find(c=>c.toLowerCase().includes(l));return o.includes("bg")||o.includes("background")?s("background")||r[0]:(o.includes("cta")||o.includes("button")||o.includes("ui")||o.includes("logo"))&&s("ui")||r[0]}}let n=e.toLowerCase();return n.includes("bg")||n.includes("background")?"backgrounds":n.includes("cta")||n.includes("button")||n.includes("ui")||n.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var r;let n={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},a=(r=this.root)==null?void 0:r.querySelector(n[e]);a&&(a.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let n=t.clientX,a=this.root.getBoundingClientRect().width,r=s=>{let l=Math.max(300,a+(s.clientX-n));this.root.style.width=`${l}px`},o=()=>{window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",o)};window.addEventListener("pointermove",r),window.addEventListener("pointerup",o)})}refresh(){}};function $r(i,e={}){let{includeReference:t=!1,includeMagenta:n=!0,changeLevel:a=5}=e;return[`TASK: ${i}`,`CHANGE_STRENGTH: ${a}/10`,t?"REFERENCE: provided":"REFERENCE: none",n?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
715
+ `)}var Bs=["background_color","text_color","cta_background","cta_text","warning_text_color","endgame_title_color","endgame_subtitle_color","endgame_cta_text_color","endgame_cta_hint_color","endgame_footer_color"],Fs=["cta_hint","cta_label_end"],zr=[{key:"warning_text",objectId:"label.warning",property:"ui.text"},{key:"endgame_title",objectId:"ui.endgame.title",property:"ui.text"},{key:"endgame_subtitle",objectId:"ui.endgame.subtitle",property:"ui.text"},{key:"endgame_cta_text",objectId:"ui.endgame.cta",property:"ui.text"},{key:"endgame_cta_hint_text",objectId:"ui.endgame.cta.hint",property:"ui.text"},{key:"endgame_footer_text",objectId:"ui.endgame.footer",property:"ui.text"}],Us=["brand.primary","brand.heading","brand.body","brand.warning"],On=class{constructor(){this.root=null;this.assetsContainer=null;this.colorsContainer=null;this.fontsContainer=null;this.textsContainer=null;this.audioContainer=null;this.options=null;this.previewModal=null;this.autoApplyTimer=null;this.activePreviewKey=null;this.activePreviewValue=null;this.activePreviewFileInput=null;this.retryTimer=null;this.aiModal=null;this.aiTargetKey=null;this.aiKeyInput=null;this.aiPromptInput=null;this.aiStrengthInput=null;this.aiStrengthValue=null;this.aiModelSelect=null;this.aiModalSubtitle=null;this.aiGalleryToggle=null;this.aiGalleryEl=null;this.aiGalleryGrid=null;this.aiReferenceInput=null;this.aiReferenceName=null;this.aiReferenceFile=null;this.aiRemoveBgToggle=null;this.aiUseOutputToggle=null;this.aiGenerateBtn=null;this.aiApplyBtn=null;this.aiSaveLibraryBtn=null;this.aiCropBtn=null;this.aiDownloadBtn=null;this.aiPreviewImg=null;this.aiStatusEl=null;this.aiOutputDataUrl=null;this.aiBaseDataUrl=null;this.aiBaseValue=null;this.aiOutputKey=null;this.aiContext=null;this.aiBgToleranceInput=null;this.aiBgToleranceValue=null;this.aiRawOutputDataUrl=null;this.aiLoadingEl=null}render(){return`
716
716
  <div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
717
717
  <div class="scene-panel-header" data-panel-handle>
718
718
  <div class="panel-title">
@@ -770,17 +770,17 @@ Generate the requested asset matching the brand style.${i.needsTransparency?" Ba
770
770
  </div>
771
771
  <div class="panel-resize-handle" data-panel-resize></div>
772
772
  </div>
773
- `}initialize(e,t){var a,r,s,o,l,c;this.options=t,this.root=e.querySelector('[data-panel="customize-settings"]'),this.assetsContainer=(a=this.root)==null?void 0:a.querySelector("[data-customize-assets]"),this.colorsContainer=(r=this.root)==null?void 0:r.querySelector("[data-customize-colors]"),this.fontsContainer=(s=this.root)==null?void 0:s.querySelector("[data-customize-fonts]"),this.textsContainer=(o=this.root)==null?void 0:o.querySelector("[data-customize-texts]"),this.audioContainer=(l=this.root)==null?void 0:l.querySelector("[data-customize-audio]");let n=(c=this.root)==null?void 0:c.querySelector("[data-customize-apply]");n==null||n.addEventListener("click",()=>this.handleApply()),this.setupRenderModeHandlers(),this.setupResizeHandle(),this.refresh()}setupRenderModeHandlers(){var n,a;let e=(n=this.root)==null?void 0:n.querySelector('[data-render-mode="endgame-png"]'),t=(a=this.root)==null?void 0:a.querySelector('[data-render-mode="splash-png"]');e==null||e.addEventListener("change",()=>{this.applyEndgamePngMode(e.checked)}),t==null||t.addEventListener("change",()=>{this.applySplashPngMode(t.checked)})}applyEndgamePngMode(e){let t=window.getEditableObjectConfig,n=window.applyEditableObjectConfig;if(typeof t!="function"||typeof n!="function")return;let a=["ui_endgame_title_1","ui_endgame_subtitle_1","ui_endgame_logo_1","ui_endgame_cta_1"];for(let r of a){let s=t(r);s&&(s.ui||(s.ui={}),s.ui.renderMode=e?"png":"text",e&&(s.render||(s.render={}),s.render.asset||(s.render.asset={type:"image",path:""}),s.render.asset.type="image"),n(r,s))}console.log("[CustomizePanel] EndGame PNG mode:",e?"enabled":"disabled")}applySplashPngMode(e){let t=window.applyEditableEngineConfig;typeof t=="function"&&(t({splash:{type:e?"image":"text",image_path:e?"library/splash/splash.png":""}}),console.log("[CustomizePanel] Splash PNG mode:",e?"enabled":"disabled"))}openAiEditor(e,t,n,a){this.openAiModal(e,n,a),t&&this.aiPromptInput&&(this.aiPromptInput.value=t,this.setAiStatus("Prompt loaded."))}refresh(){var t,n,a,r,s,o,l,c;let e=this.getEngineSnapshot();if(console.log("[CustomizePanel] Refreshing with snapshot:",!!e),!e){this.scheduleRetry();return}console.log("[CustomizePanel] Snapshot assets count:",Object.keys(e.assets||{}).length),this.renderAssets(e.assets),this.renderColors((n=(t=e.runtime)==null?void 0:t.theme)!=null?n:{}),this.renderFonts((r=(a=e.runtime)==null?void 0:a.fonts)!=null?r:{}),this.renderTexts((o=(s=e.runtime)==null?void 0:s.ui)!=null?o:{}),this.renderAudio((c=(l=e.runtime)==null?void 0:l.audio)!=null?c:{})}getEngineSnapshot(){let e=window.getEditableEngineConfig;return typeof e!="function"?null:e()}renderAssets(e){if(!this.assetsContainer)return;this.assetsContainer.innerHTML="";let t=Object.entries(e!=null?e:{});if(!t.length){this.assetsContainer.innerHTML='<div class="customize-empty">No assets found.</div>',this.scheduleRetry();return}this.clearRetry(),t.forEach(([n,a])=>{var u;let r=document.createElement("div");r.className="customize-row";let s=document.createElement("span");s.className="customize-key",s.textContent=n;let o=document.createElement("input");o.type="text",o.value=a!=null?a:"",o.className="customize-input",o.dataset.assetKey=n,o.addEventListener("input",()=>{this.handleAssetValueChange(n,o)});let l=document.createElement("div");l.className="customize-actions";let c=document.createElement("button");c.type="button",c.className="customize-icon-btn",c.title="Preview asset",c.innerHTML=`
773
+ `}initialize(e,t){var a,r,o,s,l,c;this.options=t,this.root=e.querySelector('[data-panel="customize-settings"]'),this.assetsContainer=(a=this.root)==null?void 0:a.querySelector("[data-customize-assets]"),this.colorsContainer=(r=this.root)==null?void 0:r.querySelector("[data-customize-colors]"),this.fontsContainer=(o=this.root)==null?void 0:o.querySelector("[data-customize-fonts]"),this.textsContainer=(s=this.root)==null?void 0:s.querySelector("[data-customize-texts]"),this.audioContainer=(l=this.root)==null?void 0:l.querySelector("[data-customize-audio]");let n=(c=this.root)==null?void 0:c.querySelector("[data-customize-apply]");n==null||n.addEventListener("click",()=>this.handleApply()),this.setupRenderModeHandlers(),this.setupResizeHandle(),this.refresh()}setupRenderModeHandlers(){var n,a;let e=(n=this.root)==null?void 0:n.querySelector('[data-render-mode="endgame-png"]'),t=(a=this.root)==null?void 0:a.querySelector('[data-render-mode="splash-png"]');e==null||e.addEventListener("change",()=>{this.applyEndgamePngMode(e.checked)}),t==null||t.addEventListener("change",()=>{this.applySplashPngMode(t.checked)})}applyEndgamePngMode(e){let t=window.getEditableObjectConfig,n=window.applyEditableObjectConfig;if(typeof t!="function"||typeof n!="function")return;let a=["ui_endgame_title_1","ui_endgame_subtitle_1","ui_endgame_logo_1","ui_endgame_cta_1"];for(let r of a){let o=t(r);o&&(o.ui||(o.ui={}),o.ui.renderMode=e?"png":"text",e&&(o.render||(o.render={}),o.render.asset||(o.render.asset={type:"image",path:""}),o.render.asset.type="image"),n(r,o))}console.log("[CustomizePanel] EndGame PNG mode:",e?"enabled":"disabled")}applySplashPngMode(e){let t=window.applyEditableEngineConfig;typeof t=="function"&&(t({splash:{type:e?"image":"text",image_path:e?"library/splash/splash.png":""}}),console.log("[CustomizePanel] Splash PNG mode:",e?"enabled":"disabled"))}openAiEditor(e,t,n,a){this.openAiModal(e,n,a),t&&this.aiPromptInput&&(this.aiPromptInput.value=t,this.setAiStatus("Prompt loaded."))}refresh(){var t,n,a,r,o,s,l,c;let e=this.getEngineSnapshot();if(console.log("[CustomizePanel] Refreshing with snapshot:",!!e),!e){this.scheduleRetry();return}console.log("[CustomizePanel] Snapshot assets count:",Object.keys(e.assets||{}).length),this.renderAssets(e.assets),this.renderColors((n=(t=e.runtime)==null?void 0:t.theme)!=null?n:{}),this.renderFonts((r=(a=e.runtime)==null?void 0:a.fonts)!=null?r:{}),this.renderTexts((s=(o=e.runtime)==null?void 0:o.ui)!=null?s:{}),this.renderAudio((c=(l=e.runtime)==null?void 0:l.audio)!=null?c:{})}getEngineSnapshot(){let e=window.getEditableEngineConfig;return typeof e!="function"?null:e()}renderAssets(e){if(!this.assetsContainer)return;this.assetsContainer.innerHTML="";let t=Object.entries(e!=null?e:{});if(!t.length){this.assetsContainer.innerHTML='<div class="customize-empty">No assets found.</div>',this.scheduleRetry();return}this.clearRetry(),t.forEach(([n,a])=>{var u;let r=document.createElement("div");r.className="customize-row";let o=document.createElement("span");o.className="customize-key",o.textContent=n;let s=document.createElement("input");s.type="text",s.value=a!=null?a:"",s.className="customize-input",s.dataset.assetKey=n,s.addEventListener("input",()=>{this.handleAssetValueChange(n,s)});let l=document.createElement("div");l.className="customize-actions";let c=document.createElement("button");c.type="button",c.className="customize-icon-btn",c.title="Preview asset",c.innerHTML=`
774
774
  <svg viewBox="0 0 24 24" aria-hidden="true">
775
775
  <path d="M12 5c5.2 0 9.2 3.7 10 6.8-.8 3.1-4.8 6.8-10 6.8S2.8 14.9 2 11.8C2.8 8.7 6.8 5 12 5z" />
776
776
  <circle cx="12" cy="12" r="3.2" />
777
777
  </svg>
778
- `,c.addEventListener("click",()=>{this.previewAsset(n,o.value,o.dataset.assetType,d)});let p=document.createElement("button");p.type="button",p.className="customize-icon-btn",p.title="Upload asset",p.innerHTML=`
778
+ `,c.addEventListener("click",()=>{this.previewAsset(n,s.value,s.dataset.assetType,d)});let p=document.createElement("button");p.type="button",p.className="customize-icon-btn",p.title="Upload asset",p.innerHTML=`
779
779
  <svg viewBox="0 0 24 24" aria-hidden="true">
780
780
  <path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
781
781
  <path d="M5 14v4h14v-4h2v6H3v-6h2z" />
782
782
  </svg>
783
- `;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var h;let g=(h=d.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,o,n)}),p.addEventListener("click",()=>d.click()),l.appendChild(c),l.appendChild(p),l.appendChild(d),r.appendChild(s),r.appendChild(o),r.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(r)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Bo.forEach(t=>{var l,c,p;let n=(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&&(n=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let a=document.createElement("label");a.className="customize-color-field";let r=document.createElement("span");r.textContent=t.replace(/_/g," ");let s=document.createElement("input");s.type="color",s.value=n,s.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=n,o.className="customize-color-text",o.dataset.colorTextKey=t,s.addEventListener("input",()=>{o.value=s.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(s.value=o.value)}),a.appendChild(r),a.appendChild(s),a.appendChild(o),(p=this.colorsContainer)==null||p.appendChild(a)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Uo.forEach(t=>{var s,o;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let r=document.createElement("input");r.type="text",r.value=(s=e==null?void 0:e[t])!=null?s:t,r.className="customize-input",r.dataset.fontKey=t,n.appendChild(a),n.appendChild(r),(o=this.fontsContainer)==null||o.appendChild(n)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",Fo.forEach(t=>{var s,o;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let r=document.createElement("input");r.type="text",r.value=(s=this.readUiValue(e,t))!=null?s:"",r.className="customize-input",r.dataset.textKey=t,n.appendChild(a),n.appendChild(r),(o=this.textsContainer)==null||o.appendChild(n)}),zr.forEach(({key:t,objectId:n})=>{var o,l;let a=document.createElement("div");a.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=t;let s=document.createElement("input");s.type="text",s.value=(o=this.getObjectTextValue(n))!=null?o:"",s.className="customize-input",s.dataset.objectTextKey=t,a.appendChild(r),a.appendChild(s),(l=this.textsContainer)==null||l.appendChild(a)}))}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(n=>{var o,l;let a=document.createElement("div");a.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=n.replace("_"," ");let s=document.createElement("input");s.type=n.includes("volume")?"number":"text",s.min="0",s.max="1",s.step="0.1",s.value=String((o=e==null?void 0:e[n])!=null?o:""),s.className="customize-input",s.dataset.audioKey=n,n.includes("file")&&(s.placeholder="audio file path"),a.appendChild(r),a.appendChild(s),(l=this.audioContainer)==null||l.appendChild(a)})}readUiValue(e,t){if(t.includes(".")){let a=t.split("."),r=e;for(let s of a){if(r==null)return null;r=r[s]}return typeof r=="string"?r:null}let n=e==null?void 0:e[t];return typeof n=="string"?n:null}getObjectTextValue(e){var a,r;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let n=t(e);return(r=(a=n==null?void 0:n.ui)==null?void 0:a.text)!=null?r:null}getObjectPropertyValue(e,t){let n=window.getEditableObjectConfig;if(typeof n!="function")return null;let a=n(e);if(!a)return null;let r=t.split("."),s=a;for(let o of r){if(s==null)return null;s=s[o]}return typeof s=="string"?s:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(o=>{let l=o;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let n={};this.root.querySelectorAll("[data-color-text-key]").forEach(o=>{let l=o,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):n[c]=l.value)});let a={};this.root.querySelectorAll("[data-font-key]").forEach(o=>{let l=o,c=l.dataset.fontKey;c&&(a[c]=l.value)});let r={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(r[c]=l.value)});let s={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let p=parseFloat(l.value);s[c]=isNaN(p)?0:p}else s[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let p=zr.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:n,ui:r,fonts:a,audio:s}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let n of t)try{let a=await _n(n);if(a)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:a.base64,mimeType:a.mimeType},dataUrl:a.dataUrl,width:a.width,height:a.height}}catch(a){console.warn("[CustomizePanel] Failed to fetch image data from:",n,a)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var a,r,s;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(r=(a=o==null?void 0:o.value)==null?void 0:a.trim())!=null?r:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let n=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(s=n==null?void 0:n.dataUrl)!=null?s:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let n=t!=null?t:this.activePreviewKey;if(!n||!this.aiOutputDataUrl||this.aiOutputKey!==n){e.classList.add("hidden");return}let a=e.querySelector(".asset-preview-ai-image");a&&(a.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:n})=>{var l;let a=document.createElement("button");a.type="button",a.className="ai-gallery-item",t===this.aiTargetKey&&a.classList.add("active");let r=document.createElement("img");r.className="ai-gallery-thumb",r.alt=t;let s=this.resolveAssetUrls(n);s[0]&&(r.src=s[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,a.appendChild(r),a.appendChild(o),a.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(a)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var s,o;let n=t,a=n.dataset.assetKey,r=(o=(s=n.value)==null?void 0:s.trim())!=null?o:"";!a||!r||this.isAiGalleryImage(r)&&e.push({key:a,value:r})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let n=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(a=>n.endsWith(a))}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,n){var o,l,c,p,d,u,g,h,f,m;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=n||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let a=document.createElement("div");a.className="ai-modal",a.innerHTML=`
783
+ `;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var h;let g=(h=d.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,s,n)}),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="",Bs.forEach(t=>{var l,c,p;let n=(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&&(n=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let a=document.createElement("label");a.className="customize-color-field";let r=document.createElement("span");r.textContent=t.replace(/_/g," ");let o=document.createElement("input");o.type="color",o.value=n,o.dataset.colorKey=t;let s=document.createElement("input");s.type="text",s.value=n,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)}),a.appendChild(r),a.appendChild(o),a.appendChild(s),(p=this.colorsContainer)==null||p.appendChild(a)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",Us.forEach(t=>{var o,s;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=e==null?void 0:e[t])!=null?o:t,r.className="customize-input",r.dataset.fontKey=t,n.appendChild(a),n.appendChild(r),(s=this.fontsContainer)==null||s.appendChild(n)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",Fs.forEach(t=>{var o,s;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.readUiValue(e,t))!=null?o:"",r.className="customize-input",r.dataset.textKey=t,n.appendChild(a),n.appendChild(r),(s=this.textsContainer)==null||s.appendChild(n)}),zr.forEach(({key:t,objectId:n})=>{var s,l;let a=document.createElement("div");a.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(n))!=null?s:"",o.className="customize-input",o.dataset.objectTextKey=t,a.appendChild(r),a.appendChild(o),(l=this.textsContainer)==null||l.appendChild(a)}))}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(n=>{var s,l;let a=document.createElement("div");a.className="customize-row";let r=document.createElement("span");r.className="customize-key",r.textContent=n.replace("_"," ");let o=document.createElement("input");o.type=n.includes("volume")?"number":"text",o.min="0",o.max="1",o.step="0.1",o.value=String((s=e==null?void 0:e[n])!=null?s:""),o.className="customize-input",o.dataset.audioKey=n,n.includes("file")&&(o.placeholder="audio file path"),a.appendChild(r),a.appendChild(o),(l=this.audioContainer)==null||l.appendChild(a)})}readUiValue(e,t){if(t.includes(".")){let a=t.split("."),r=e;for(let o of a){if(r==null)return null;r=r[o]}return typeof r=="string"?r:null}let n=e==null?void 0:e[t];return typeof n=="string"?n:null}getObjectTextValue(e){var a,r;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let n=t(e);return(r=(a=n==null?void 0:n.ui)==null?void 0:a.text)!=null?r:null}getObjectPropertyValue(e,t){let n=window.getEditableObjectConfig;if(typeof n!="function")return null;let a=n(e);if(!a)return null;let r=t.split("."),o=a;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 n={};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):n[c]=l.value)});let a={};this.root.querySelectorAll("[data-font-key]").forEach(s=>{let l=s,c=l.dataset.fontKey;c&&(a[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=zr.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:n,ui:r,fonts:a,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 n of t)try{let a=await _n(n);if(a)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:a.base64,mimeType:a.mimeType},dataUrl:a.dataUrl,width:a.width,height:a.height}}catch(a){console.warn("[CustomizePanel] Failed to fetch image data from:",n,a)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var a,r,o;let t=(e==null?void 0:e.trim())||"";if(!t){let s=this.getSelectedAssetInput();t=(r=(a=s==null?void 0:s.value)==null?void 0:a.trim())!=null?r:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let n=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(o=n==null?void 0:n.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 n=t!=null?t:this.activePreviewKey;if(!n||!this.aiOutputDataUrl||this.aiOutputKey!==n){e.classList.add("hidden");return}let a=e.querySelector(".asset-preview-ai-image");a&&(a.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:n})=>{var l;let a=document.createElement("button");a.type="button",a.className="ai-gallery-item",t===this.aiTargetKey&&a.classList.add("active");let r=document.createElement("img");r.className="ai-gallery-thumb",r.alt=t;let o=this.resolveAssetUrls(n);o[0]&&(r.src=o[0]);let s=document.createElement("span");s.className="ai-gallery-label",s.textContent=t,a.appendChild(r),a.appendChild(s),a.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(a)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var o,s;let n=t,a=n.dataset.assetKey,r=(s=(o=n.value)==null?void 0:o.trim())!=null?s:"";!a||!r||this.isAiGalleryImage(r)&&e.push({key:a,value:r})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let n=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(a=>n.endsWith(a))}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,n){var s,l,c,p,d,u,g,h,f,m;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=n||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let a=document.createElement("div");a.className="ai-modal",a.innerHTML=`
784
784
  <div class="ai-modal-card">
785
785
  <div class="ai-modal-header">
786
786
  <div>
@@ -851,7 +851,7 @@ Generate the requested asset matching the brand style.${i.needsTransparency?" Ba
851
851
  </div>
852
852
  </div>
853
853
  </div>
854
- `;let r=a.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),a.addEventListener("click",b=>{b.target===a&&this.closeAiModal()}),this.aiModal=a,this.aiKeyInput=a.querySelector("[data-ai-key]"),this.aiModelSelect=a.querySelector("[data-ai-model]"),this.aiPromptInput=a.querySelector("[data-ai-prompt]"),this.aiStrengthInput=a.querySelector("[data-ai-strength]"),this.aiStrengthValue=a.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=a.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=a.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=a.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=a.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=a.querySelector("[data-ai-ref-input]"),this.aiReferenceName=a.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=a.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=a.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=a.querySelector("[data-ai-generate]"),this.aiApplyBtn=a.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=a.querySelector("[data-ai-save-library]"),this.aiCropBtn=a.querySelector("[data-ai-crop]"),this.aiDownloadBtn=a.querySelector("[data-ai-download]"),this.aiPreviewImg=a.querySelector("[data-ai-preview]"),this.aiStatusEl=a.querySelector("[data-ai-status]"),this.aiLoadingEl=a.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=a.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=a.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let s=a.querySelector("[data-ai-ref-button]");s==null||s.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var y,v,x;let b=(x=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?x:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(f=this.aiCropBtn)==null||f.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(a),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,h,f,m,b,y,v,x,w,E,C,S,O,B,k,L,I;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=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",n=(b=(m=(f=this.aiPromptInput)==null?void 0:f.value)==null?void 0:m.trim())!=null?b:"",a=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,r=a,s=a,o=Number((w=(x=this.aiStrengthInput)==null?void 0:x.value)!=null?w:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!n){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((E=l==null?void 0:l.value)==null?void 0:E.trim())||((C=this.aiBaseValue)==null?void 0:C.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let M=null,D=(S=this.getSelectedAssetKey())!=null?S:"unknown",j=(O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((B=this.aiUseOutputToggle)!=null&&B.checked&&this.aiOutputDataUrl){let ie=Ii(this.aiOutputDataUrl,"ai-output.png");if(ie){let ae=await Te(ie);ae&&(M={input:{base64:ae.base64,mimeType:ae.mimeType},dataUrl:ae.dataUrl,width:ae.width,height:ae.height})}}if(M||(M=await this.getImageDataFromAsset(c)),!M){this.setAiStatus("Unable to load the base image.");return}let $=[M.input],A=!1;if(this.aiReferenceFile){let ie=await Te(this.aiReferenceFile);ie?($.push({base64:ie.base64,mimeType:ie.mimeType}),A=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let _=$r(n,{includeReference:A,includeMagenta:r,changeLevel:o}),P=(L=(k=this.aiReferenceFile)==null?void 0:k.name)!=null?L:"none";console.info("[AI] Final prompt:",_),console.info("[AI] Image sources:",{assetKey:D,base:j,reference:P});let q=Cr(M.width,M.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let V=await tt(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(M){console.error("[CustomizePanel] AI Generate Error:",M),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((I=this.aiStatusEl)==null?void 0:I.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var a,r,s,o;if(!this.aiRawOutputDataUrl)return;let e=(r=(a=this.aiRemoveBgToggle)==null?void 0:a.checked)!=null?r:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),n=this.aiRawOutputDataUrl;if(e){let l=await et(this.aiRawOutputDataUrl,t);l&&(n=l)}this.setAiOutput(n),this.setAiStatus("Ready.")}setAiOutput(e){var n,a;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(n=this.previewModal)==null?void 0:n.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(a=this.activePreviewKey)!=null?a: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,n,a;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=((n=this.aiContext)==null?void 0:n.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),s=((a=this.aiContext)==null?void 0:a.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(r&&s)console.log("[CustomizePanel] Applying AI output directly to object:",r,s),this.applyObjectPropertyValue(r,s,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var r,s,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let n=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,a=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:a,filename:`${n}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${n}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",a),p(a,`${n}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(m){console.warn("[CustomizePanel] Setup-library endpoint not available:",m)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),g=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),h=this.getSelectedAssetInput();if(h&&(h.value=c.path,this.handleAssetValueChange((o=h.dataset.assetKey)!=null?o:"",h)),u&&g){console.log("[CustomizePanel] Applying saved asset to object:",u,g);let m=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(g)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof m=="function"&&b){let y=this.getFilenameFromPath(c.path);await m(u,y,a)}else this.applyObjectPropertyValue(u,g,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&u&&(console.log("[CustomizePanel] Highlighting slot in library:",u,a),setTimeout(()=>{f(u,a)},500)),this.setAiStatus(`\u2705 Saved and applied ${n}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var s;let t=(s=this.aiContext)==null?void 0:s.objectId,n=e||this.aiTargetKey||"",a=window.getEditableAssets;if(typeof a=="function"){let o=a();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===n||c.slotId===n||c.currentAsset&&c.currentAsset.includes(n)||n.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let r=n.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 n=t();if(!(n!=null&&n.slots))return null;let a=n.slots.find(r=>r.currentAsset===e||r.slotId===e);return(a==null?void 0:a.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let n=t();if(!(n!=null&&n.slots))return null;let a=n.slots.find(s=>s.currentAsset===e||s.slotId===e);if(!a)return null;let r=a.category;return r==="render"||r==="backgrounds"||r==="characters"?"render.texture":r==="ui"?"ui.image":r==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",n=await this.getImageDimensions(t);if(!n){this.setAiStatus("Unable to read target dimensions.");return}let a=Ii(this.aiOutputDataUrl,"ai-output.png");if(!a)return;let r=await this.showManualCropModal(a,n,t);if(!r)return;let s=await Oi(r);s&&this.setAiOutput(s)}handleAiDownload(){var n;if(!this.aiOutputDataUrl)return;let e=(n=this.getSelectedAssetKey())!=null?n:"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,n){console.log("[CustomizePanel] Handling asset upload for:",n);let a=t.value,r=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(a);if(p){let d=await this.showManualCropModal(e,p,a);if(!d)return;r=d}}let s=await Oi(r);if(!s){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(n);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:s,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=d.path,this.handleAssetValueChange(n,t);let h=this.inferObjectIdFromAssetKey(n),f=this.inferPathFromAssetKey(n);if(h&&f){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(d.path);await b(h,v,c)}else this.applyObjectPropertyValue(h,f,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&h&&setTimeout(()=>{m(h,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,n,a){if(!t)return;let r=this.resolveAssetUrls(t);if(r.length===0)return;let s=n||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=a!=null?a:null,this.openPreviewModal(e,t,r,s)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let n=t.replace(/^\.?\//,""),a=[];return n.startsWith("raw/")?a=[`/${n}`,`/assets/${n}`]:n.startsWith("assets/")?a=[`/${n}`]:a=[`/raw/${n}`,`/assets/raw/${n}`,`/assets/${n}`,`/${n}`],console.log("[CustomizePanel] Resolved to possible paths:",a),a}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,n,a){this.closePreviewModal(!0);let r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
854
+ `;let r=a.querySelector(".ai-modal-close");r==null||r.addEventListener("click",()=>this.closeAiModal()),a.addEventListener("click",b=>{b.target===a&&this.closeAiModal()}),this.aiModal=a,this.aiKeyInput=a.querySelector("[data-ai-key]"),this.aiModelSelect=a.querySelector("[data-ai-model]"),this.aiPromptInput=a.querySelector("[data-ai-prompt]"),this.aiStrengthInput=a.querySelector("[data-ai-strength]"),this.aiStrengthValue=a.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=a.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=a.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=a.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=a.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=a.querySelector("[data-ai-ref-input]"),this.aiReferenceName=a.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=a.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=a.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=a.querySelector("[data-ai-generate]"),this.aiApplyBtn=a.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=a.querySelector("[data-ai-save-library]"),this.aiCropBtn=a.querySelector("[data-ai-crop]"),this.aiDownloadBtn=a.querySelector("[data-ai-download]"),this.aiPreviewImg=a.querySelector("[data-ai-preview]"),this.aiStatusEl=a.querySelector("[data-ai-status]"),this.aiLoadingEl=a.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=a.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=a.querySelector("[data-ai-bg-tolerance-value]"),(s=this.aiRemoveBgToggle)==null||s.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let o=a.querySelector("[data-ai-ref-button]");o==null||o.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiStrengthInput)==null?void 0:y.value)!=null?v:"5";this.aiStrengthValue&&(this.aiStrengthValue.textContent=b)}),(p=this.aiBgToleranceInput)==null||p.addEventListener("input",()=>{var y,v;let b=(v=(y=this.aiBgToleranceInput)==null?void 0:y.value)!=null?v:"30";this.aiBgToleranceValue&&(this.aiBgToleranceValue.textContent=b),this.refreshAiOutputFromRaw()}),(d=this.aiReferenceInput)==null||d.addEventListener("change",()=>{var y,v,x;let b=(x=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?x:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(f=this.aiCropBtn)==null||f.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(a),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,h,f,m,b,y,v,x,w,E,C,S,M,B,P,L,I;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=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",n=(b=(m=(f=this.aiPromptInput)==null?void 0:f.value)==null?void 0:m.trim())!=null?b:"",a=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,r=a,o=a,s=Number((w=(x=this.aiStrengthInput)==null?void 0:x.value)!=null?w:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!n){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((E=l==null?void 0:l.value)==null?void 0:E.trim())||((C=this.aiBaseValue)==null?void 0:C.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",j=(M=this.aiUseOutputToggle)!=null&&M.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((B=this.aiUseOutputToggle)!=null&&B.checked&&this.aiOutputDataUrl){let ie=Ii(this.aiOutputDataUrl,"ai-output.png");if(ie){let ae=await Te(ie);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],A=!1;if(this.aiReferenceFile){let ie=await Te(this.aiReferenceFile);ie?($.push({base64:ie.base64,mimeType:ie.mimeType}),A=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let _=$r(n,{includeReference:A,includeMagenta:r,changeLevel:s}),k=(L=(P=this.aiReferenceFile)==null?void 0:P.name)!=null?L:"none";console.info("[AI] Final prompt:",_),console.info("[AI] Image sources:",{assetKey:D,base:j,reference:k});let q=Cr(O.width,O.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let V=await tt(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),((I=this.aiStatusEl)==null?void 0:I.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var a,r,o,s;if(!this.aiRawOutputDataUrl)return;let e=(r=(a=this.aiRemoveBgToggle)==null?void 0:a.checked)!=null?r:!1,t=Number((s=(o=this.aiBgToleranceInput)==null?void 0:o.value)!=null?s:"30"),n=this.aiRawOutputDataUrl;if(e){let l=await et(this.aiRawOutputDataUrl,t);l&&(n=l)}this.setAiOutput(n),this.setAiStatus("Ready.")}setAiOutput(e){var n,a;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(n=this.previewModal)==null?void 0:n.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(a=this.activePreviewKey)!=null?a: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,n,a;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=((n=this.aiContext)==null?void 0:n.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),o=((a=this.aiContext)==null?void 0:a.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 n=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,a=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:a,filename:`${n}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${n}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",a),p(a,`${n}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(m){console.warn("[CustomizePanel] Setup-library endpoint not available:",m)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=((r=this.aiContext)==null?void 0:r.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),g=((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)),u&&g){console.log("[CustomizePanel] Applying saved asset to object:",u,g);let m=window.applyAssetToSlot,b=/texture|image|sprite|asset\\.path/i.test(g)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof m=="function"&&b){let y=this.getFilenameFromPath(c.path);await m(u,y,a)}else this.applyObjectPropertyValue(u,g,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&u&&(console.log("[CustomizePanel] Highlighting slot in library:",u,a),setTimeout(()=>{f(u,a)},500)),this.setAiStatus(`\u2705 Saved and applied ${n}.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,n=e||this.aiTargetKey||"",a=window.getEditableAssets;if(typeof a=="function"){let s=a();if(s!=null&&s.slots){let l=s.slots.find(c=>t&&c.objectId===t||c.currentAsset===n||c.slotId===n||c.currentAsset&&c.currentAsset.includes(n)||n.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let r=n.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 n=t();if(!(n!=null&&n.slots))return null;let a=n.slots.find(r=>r.currentAsset===e||r.slotId===e);return(a==null?void 0:a.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let n=t();if(!(n!=null&&n.slots))return null;let a=n.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!a)return null;let r=a.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:"",n=await this.getImageDimensions(t);if(!n){this.setAiStatus("Unable to read target dimensions.");return}let a=Ii(this.aiOutputDataUrl,"ai-output.png");if(!a)return;let r=await this.showManualCropModal(a,n,t);if(!r)return;let o=await Mi(r);o&&this.setAiOutput(o)}handleAiDownload(){var n;if(!this.aiOutputDataUrl)return;let e=(n=this.getSelectedAssetKey())!=null?n:"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,n){console.log("[CustomizePanel] Handling asset upload for:",n);let a=t.value,r=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(a);if(p){let d=await this.showManualCropModal(e,p,a);if(!d)return;r=d}}let o=await Mi(r);if(!o){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${n.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(n);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(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=d.path,this.handleAssetValueChange(n,t);let h=this.inferObjectIdFromAssetKey(n),f=this.inferPathFromAssetKey(n);if(h&&f){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(d.path);await b(h,v,c)}else this.applyObjectPropertyValue(h,f,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&h&&setTimeout(()=>{m(h,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,n,a){if(!t)return;let r=this.resolveAssetUrls(t);if(r.length===0)return;let o=n||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=a!=null?a: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 n=t.replace(/^\.?\//,""),a=[];return n.startsWith("raw/")?a=[`/${n}`,`/assets/${n}`]:n.startsWith("assets/")?a=[`/${n}`]:a=[`/raw/${n}`,`/assets/raw/${n}`,`/assets/${n}`,`/${n}`],console.log("[CustomizePanel] Resolved to possible paths:",a),a}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,n,a){this.closePreviewModal(!0);let r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
855
855
  <div class="asset-preview-card">
856
856
  <div class="asset-preview-header">
857
857
  <div class="asset-preview-title">${e}</div>
@@ -867,7 +867,7 @@ Generate the requested asset matching the brand style.${i.needsTransparency?" Ba
867
867
  <img class="asset-preview-ai-image" alt="AI output preview">
868
868
  </div>
869
869
  </div>
870
- `;let s=r.querySelector(".asset-preview-body"),o=r.querySelector(".asset-preview-close"),l=r.querySelector(".asset-preview-change"),c=r.querySelector(".asset-preview-ai"),p=r.querySelector("[data-asset-ai-preview]");if(o==null||o.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),r.addEventListener("click",d=>{d.target===r&&this.closePreviewModal()}),s)if(a==="image"){let d=document.createElement("img");this.loadWithFallback(d,n),s.appendChild(d)}else if(a==="audio"){let d=document.createElement("audio");d.controls=!0,this.loadWithFallback(d,n),s.appendChild(d)}else if(a==="json"){let d=document.createElement("pre");this.fetchWithFallback(n).then(u=>{d.textContent=u!=null?u:"Unable to load JSON."}),s.appendChild(d)}else{let d=document.createElement("a");d.href=n[0],d.target="_blank",d.rel="noreferrer",d.textContent="Open asset",s.appendChild(d)}document.body.appendChild(r),this.previewModal=r,this.updateAiModalPreview(p,e)}loadWithFallback(e,t){if(t.length===0)return;let n=0,a=()=>{n>=t.length||(e.src=t[n],n+=1)};e.addEventListener("error",a),a()}async fetchWithFallback(e){for(let t of e)try{let n=await fetch(t);if(!n.ok)continue;return await n.text()}catch{}return null}applyObjectPropertyValue(e,t,n){let a=window.getEditableObjectConfig,r=window.applyEditableObjectConfig;if(typeof a!="function"||typeof r!="function")return;let s=a(e);if(!s)return;let o=JSON.parse(JSON.stringify(s)),l=t.split("."),c=o;for(let p=0;p<l.length-1;p++){let d=l[p];c[d]=c[d]||{},c=c[d]}c[l[l.length-1]]=n,r(e,o)}applyTextColorToObject(e,t){let a={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];a&&this.applyObjectPropertyValue(a.objectId,a.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,n){var r;if(!this.previewModal||this.activePreviewKey!==e)return;let a=t!=null?t:"";this.activePreviewValue!==a&&this.previewAsset(e,a,n,(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"),n=t?Number(t):NaN;Number.isFinite(n)&&n>0&&(this.root.style.width=`${n}px`);let a=r=>{var u,g;r.preventDefault();let s=r.clientX,o=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,p=h=>{let f=h.clientX-s,m=Math.min(c,Math.max(l,o+f));this.root&&(this.root.style.width=`${m}px`)},d=()=>{var f,m;window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d);let h=(m=(f=this.root)==null?void 0:f.getBoundingClientRect().width)!=null?m:0;h>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(h)))};window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)};e.addEventListener("pointerdown",a)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let n of t){let a=await this.loadImage(n);if(a!=null&&a.naturalWidth&&(a!=null&&a.naturalHeight))return{width:a.naturalWidth,height:a.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let n=new Image;n.onload=()=>t(n),n.onerror=()=>t(null),n.src=e})}async showManualCropModal(e,t,n){let a=t.width/t.height,r=URL.createObjectURL(e),s=await this.loadImage(r);try{URL.revokeObjectURL(r)}catch{}if(!(s!=null&&s.naturalWidth)||!(s!=null&&s.naturalHeight))return null;let o=await this.loadImageForValue(n);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let p=Math.min(860,window.innerWidth-60),h=Math.max(220,Math.floor((p-32-16)/2)),f=Math.min(520,window.innerHeight-240),m=h,b=m/a;b>f&&(b=f,m=b*a),c.innerHTML=`
870
+ `;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(a==="image"){let d=document.createElement("img");this.loadWithFallback(d,n),o.appendChild(d)}else if(a==="audio"){let d=document.createElement("audio");d.controls=!0,this.loadWithFallback(d,n),o.appendChild(d)}else if(a==="json"){let d=document.createElement("pre");this.fetchWithFallback(n).then(u=>{d.textContent=u!=null?u:"Unable to load JSON."}),o.appendChild(d)}else{let d=document.createElement("a");d.href=n[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 n=0,a=()=>{n>=t.length||(e.src=t[n],n+=1)};e.addEventListener("error",a),a()}async fetchWithFallback(e){for(let t of e)try{let n=await fetch(t);if(!n.ok)continue;return await n.text()}catch{}return null}applyObjectPropertyValue(e,t,n){let a=window.getEditableObjectConfig,r=window.applyEditableObjectConfig;if(typeof a!="function"||typeof r!="function")return;let o=a(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]]=n,r(e,s)}applyTextColorToObject(e,t){let a={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];a&&this.applyObjectPropertyValue(a.objectId,a.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,n){var r;if(!this.previewModal||this.activePreviewKey!==e)return;let a=t!=null?t:"";this.activePreviewValue!==a&&this.previewAsset(e,a,n,(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"),n=t?Number(t):NaN;Number.isFinite(n)&&n>0&&(this.root.style.width=`${n}px`);let a=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=h=>{let f=h.clientX-o,m=Math.min(c,Math.max(l,s+f));this.root&&(this.root.style.width=`${m}px`)},d=()=>{var f,m;window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d);let h=(m=(f=this.root)==null?void 0:f.getBoundingClientRect().width)!=null?m:0;h>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(h)))};window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)};e.addEventListener("pointerdown",a)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let n of t){let a=await this.loadImage(n);if(a!=null&&a.naturalWidth&&(a!=null&&a.naturalHeight))return{width:a.naturalWidth,height:a.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let n=new Image;n.onload=()=>t(n),n.onerror=()=>t(null),n.src=e})}async showManualCropModal(e,t,n){let a=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(n);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let p=Math.min(860,window.innerWidth-60),h=Math.max(220,Math.floor((p-32-16)/2)),f=Math.min(520,window.innerHeight-240),m=h,b=m/a;b>f&&(b=f,m=b*a),c.innerHTML=`
871
871
  <div class="asset-crop-card" style="width:${p}px;">
872
872
  <div class="asset-crop-header">
873
873
  <div>
@@ -897,7 +897,7 @@ Generate the requested asset matching the brand style.${i.needsTransparency?" Ba
897
897
  <button class="asset-crop-apply" type="button">Apply Crop</button>
898
898
  </div>
899
899
  </div>
900
- `;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),w=c.querySelector(".asset-crop-zoom-value"),E=c.querySelector(".asset-crop-close"),C=c.querySelector(".asset-crop-cancel"),S=c.querySelector(".asset-crop-apply"),O=c.querySelector(".asset-crop-reset");if(!y||!v||!x||!w){l(null);return}let B=y.getContext("2d"),k=v.getContext("2d");if(!B||!k){l(null);return}let L=s.naturalWidth,I=s.naturalHeight,M=Math.max(y.width/L,y.height/I),D=1,j=0,$=0,A=!1,_=0,P=0,q=0,V=0,ie=()=>{let R=M*D,Me=Math.max(0,(L*R-y.width)/2),Ue=Math.max(0,(I*R-y.height)/2);j=Math.min(Me,Math.max(-Me,j)),$=Math.min(Ue,Math.max(-Ue,$))},ae=()=>{let R=M*D;B.clearRect(0,0,y.width,y.height);let Me=y.width/2-L*R/2+j,Ue=y.height/2-I*R/2+$;if(B.drawImage(s,Me,Ue,L*R,I*R),k.clearRect(0,0,v.width,v.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let qe=Math.max(v.width/o.naturalWidth,v.height/o.naturalHeight),Qn=v.width/2-o.naturalWidth*qe/2,gt=v.height/2-o.naturalHeight*qe/2;k.drawImage(o,Qn,gt,o.naturalWidth*qe,o.naturalHeight*qe)}else k.fillStyle="rgba(255, 255, 255, 0.04)",k.fillRect(0,0,v.width,v.height),k.strokeStyle="rgba(255, 255, 255, 0.08)",k.strokeRect(4,4,v.width-8,v.height-8);let ut=v.width/y.width*(M*D),Ge=j*(v.width/y.width),Nt=$*(v.height/y.height),Jn=v.width/2-L*ut/2+Ge,Zn=v.height/2-I*ut/2+Nt;k.save(),k.globalAlpha=.7,k.drawImage(s,Jn,Zn,L*ut,I*ut),k.restore()},Aa=()=>{j=0,$=0,ie(),ae()};x.addEventListener("input",()=>{D=Number(x.value),w.textContent=`${D.toFixed(2)}\xD7`,ie(),ae()}),y.addEventListener("pointerdown",R=>{A=!0,_=R.clientX,P=R.clientY,q=j,V=$,y.setPointerCapture(R.pointerId)}),y.addEventListener("pointermove",R=>{A&&(j=q+(R.clientX-_),$=V+(R.clientY-P),ie(),ae())}),y.addEventListener("pointerup",R=>{A=!1,y.releasePointerCapture(R.pointerId)}),y.addEventListener("pointerleave",()=>{A=!1});let Kn=()=>{c.remove()},Xn=()=>{Kn(),l(null)},Ps=async()=>{let R=document.createElement("canvas");R.width=t.width,R.height=t.height;let Me=R.getContext("2d");if(!Me){Kn(),l(null);return}let Ue=D,Ge=Math.max(R.width/L,R.height/I)*Ue,Nt=R.width/y.width,Jn=j*Nt,Zn=$*Nt,qe=R.width/2-L*Ge/2+Jn,Qn=R.height/2-I*Ge/2+Zn;Me.drawImage(s,qe,Qn,L*Ge,I*Ge);let gt=await new Promise(ks=>{R.toBlob(Ms=>ks(Ms),e.type||"image/png")});if(Kn(),!gt){l(null);return}l(new File([gt],e.name,{type:gt.type}))};E==null||E.addEventListener("click",Xn),C==null||C.addEventListener("click",Xn),O==null||O.addEventListener("click",Aa),S==null||S.addEventListener("click",()=>{Ps()}),c.addEventListener("click",R=>{R.target===c&&Xn()}),document.body.appendChild(c),Aa()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let n of t){let a=await this.loadImage(n);if(a)return a}return null}};var On=class{constructor(){this.root=null;this.options=null}render(){return`
900
+ `;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),w=c.querySelector(".asset-crop-zoom-value"),E=c.querySelector(".asset-crop-close"),C=c.querySelector(".asset-crop-cancel"),S=c.querySelector(".asset-crop-apply"),M=c.querySelector(".asset-crop-reset");if(!y||!v||!x||!w){l(null);return}let B=y.getContext("2d"),P=v.getContext("2d");if(!B||!P){l(null);return}let L=o.naturalWidth,I=o.naturalHeight,O=Math.max(y.width/L,y.height/I),D=1,j=0,$=0,A=!1,_=0,k=0,q=0,V=0,ie=()=>{let R=O*D,Oe=Math.max(0,(L*R-y.width)/2),Ue=Math.max(0,(I*R-y.height)/2);j=Math.min(Oe,Math.max(-Oe,j)),$=Math.min(Ue,Math.max(-Ue,$))},ae=()=>{let R=O*D;B.clearRect(0,0,y.width,y.height);let Oe=y.width/2-L*R/2+j,Ue=y.height/2-I*R/2+$;if(B.drawImage(o,Oe,Ue,L*R,I*R),P.clearRect(0,0,v.width,v.height),s!=null&&s.naturalWidth&&(s!=null&&s.naturalHeight)){let qe=Math.max(v.width/s.naturalWidth,v.height/s.naturalHeight),Qn=v.width/2-s.naturalWidth*qe/2,gt=v.height/2-s.naturalHeight*qe/2;P.drawImage(s,Qn,gt,s.naturalWidth*qe,s.naturalHeight*qe)}else P.fillStyle="rgba(255, 255, 255, 0.04)",P.fillRect(0,0,v.width,v.height),P.strokeStyle="rgba(255, 255, 255, 0.08)",P.strokeRect(4,4,v.width-8,v.height-8);let ut=v.width/y.width*(O*D),Ge=j*(v.width/y.width),Nt=$*(v.height/y.height),Jn=v.width/2-L*ut/2+Ge,Zn=v.height/2-I*ut/2+Nt;P.save(),P.globalAlpha=.7,P.drawImage(o,Jn,Zn,L*ut,I*ut),P.restore()},Aa=()=>{j=0,$=0,ie(),ae()};x.addEventListener("input",()=>{D=Number(x.value),w.textContent=`${D.toFixed(2)}\xD7`,ie(),ae()}),y.addEventListener("pointerdown",R=>{A=!0,_=R.clientX,k=R.clientY,q=j,V=$,y.setPointerCapture(R.pointerId)}),y.addEventListener("pointermove",R=>{A&&(j=q+(R.clientX-_),$=V+(R.clientY-k),ie(),ae())}),y.addEventListener("pointerup",R=>{A=!1,y.releasePointerCapture(R.pointerId)}),y.addEventListener("pointerleave",()=>{A=!1});let Kn=()=>{c.remove()},Xn=()=>{Kn(),l(null)},Po=async()=>{let R=document.createElement("canvas");R.width=t.width,R.height=t.height;let Oe=R.getContext("2d");if(!Oe){Kn(),l(null);return}let Ue=D,Ge=Math.max(R.width/L,R.height/I)*Ue,Nt=R.width/y.width,Jn=j*Nt,Zn=$*Nt,qe=R.width/2-L*Ge/2+Jn,Qn=R.height/2-I*Ge/2+Zn;Oe.drawImage(o,qe,Qn,L*Ge,I*Ge);let gt=await new Promise(Oo=>{R.toBlob(Mo=>Oo(Mo),e.type||"image/png")});if(Kn(),!gt){l(null);return}l(new File([gt],e.name,{type:gt.type}))};E==null||E.addEventListener("click",Xn),C==null||C.addEventListener("click",Xn),M==null||M.addEventListener("click",Aa),S==null||S.addEventListener("click",()=>{Po()}),c.addEventListener("click",R=>{R.target===c&&Xn()}),document.body.appendChild(c),Aa()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let n of t){let a=await this.loadImage(n);if(a)return a}return null}};var Mn=class{constructor(){this.root=null;this.options=null}render(){return`
901
901
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
902
902
  <div class="scene-panel-header" data-panel-handle>
903
903
  <div class="panel-title">
@@ -963,10 +963,10 @@ Generate the requested asset matching the brand style.${i.needsTransparency?" Ba
963
963
  </div>
964
964
  </div>
965
965
  </div>
966
- `}initialize(e,t){var y,v,x,w,E,C,S,O,B,k,L,I,M,D,j,$;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let a=(()=>{var _;let A=window.getEditableEngineConfig;if(typeof A=="function"){let P=A();return(_=P==null?void 0:P.loading)!=null?_:{}}return{}})(),r=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");r&&(r.value=a.type==="image"?"image":"color",r.addEventListener("change",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{type:r.value}),this.updateFieldVisibility(r.value)}));let s=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");s&&(s.value=a.background_color||"#160a17",s.addEventListener("input",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{background_color:s.value})}));let o=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((E=a.overlay_alpha)!=null?E:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var _,P;let A=Number(o.value);l&&(l.textContent=A.toFixed(2)),(P=(_=this.options)==null?void 0:_.onUpdateLoading)==null||P.call(_,{overlay_alpha:A})}));let c=(C=this.root)==null?void 0:C.querySelector("#loading-text");c&&(c.value=a.text||"",c.addEventListener("input",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{text:c.value})}));let p=(S=this.root)==null?void 0:S.querySelector("#loading-text-scale"),d=(O=this.root)==null?void 0:O.querySelector("#loading-text-scale-value");p&&(p.value=String((B=a.text_scale)!=null?B:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var _,P;let A=Number(p.value);d&&(d.textContent=A.toFixed(2)),(P=(_=this.options)==null?void 0:_.onUpdateLoading)==null||P.call(_,{text_scale:A})}));let u=(k=this.root)==null?void 0:k.querySelector("#loading-enabled");u&&(u.checked=a.enabled!==!1,u.addEventListener("change",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{enabled:u.checked})}));let g=(L=this.root)==null?void 0:L.querySelector("#loading-blur-enabled");g&&(g.checked=a.blur_enabled!==!1,g.addEventListener("change",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{blur_enabled:g.checked})}));let h=(I=this.root)==null?void 0:I.querySelector("#loading-blur-strength"),f=(M=this.root)==null?void 0:M.querySelector("#loading-blur-strength-value");h&&(h.value=String((D=a.blur_strength)!=null?D:8),f&&(f.textContent=h.value),h.addEventListener("input",()=>{var A,_;f&&(f.textContent=h.value),(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{blur_strength:Number(h.value)})}));let m=(j=this.root)==null?void 0:j.querySelector("#loading-show-btn"),b=($=this.root)==null?void 0:$.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onShowLoadingScreen)==null||_.call(A)}),b==null||b.addEventListener("click",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onHideLoadingScreen)==null||_.call(A)}),this.updateFieldVisibility(a.type==="image"?"image":"color")}updateFieldVisibility(e){var a,r;let t=(a=this.root)==null?void 0:a.querySelector("#loading-color-field"),n=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),n&&(n.style.display="none")):(t&&(t.style.display=""),n&&(n.style.display=""))}refresh(){}};var Ct=require("pixi.js");Xe();K();async function Nr(i,e,t){var n,a;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let r=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${r}`;console.log("[LIBRARY] Loading texture from:",o);let l=await Ct.Assets.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of p)se[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(n=c[u])!=null&&n.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 h=((a=g.getDisplayObject)==null?void 0:a.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Hr(i,e){var t,n,a;console.log("[LIBRARY] resetAsset called for:",e);try{let r=window.getEditableAssets,s=typeof r=="function"?r():null,o=(t=s==null?void 0:s.slots)==null?void 0:t.find(m=>m.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await Ct.Assets.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of h)se[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(n=u[m])!=null&&n.texture&&(u[m].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let f=window.gameObjectManager;if(f)for(let m of h){let b=f.get(m);if(b){let y=((a=b.getDisplayObject)==null?void 0:a.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Br(i,e,t,n){var a,r,s,o,l,c,p,d,u,g,h,f,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:n});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let x=Date.now(),w=`/raw/library/${n}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",w);let E=await Ct.Assets.load(w);if(!E){console.error("[LIBRARY] Failed to load texture:",w);return}console.log("[LIBRARY] \u2705 Texture loaded"),se[v]=E,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let C=window.CustomAssets;C!=null&&C[v]&&(C[v].texture=E,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let S=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!S),S){let B=Array.from(((a=S.keys)==null?void 0:a.call(S))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",B);let k=S.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!k),k){let L=((r=k.getDisplayObject)==null?void 0:r.call(k))||k.pixiObject||k.pixi||k,I=(s=L==null?void 0:L.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",L),console.log("[LIBRARY] displayObject type:",I),console.log("[LIBRARY] has texture?",!!(L!=null&&L.texture)),L!=null&&L.texture)L.texture=E,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(I==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:M}=await import("pixi.js"),D=L.parent,j=(l=(o=D==null?void 0:D.getChildIndex)==null?void 0:o.call(D,L))!=null?l:0,$={x:L.x,y:L.y},A={x:(p=(c=L.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=L.anchor)==null?void 0:d.y)!=null?u:.5},_={x:(h=(g=L.scale)==null?void 0:g.x)!=null?h:1,y:(m=(f=L.scale)==null?void 0:f.y)!=null?m:1},P=(b=L.alpha)!=null?b:1,q=(y=L.visible)!=null?y:!0,V=new M(E);V.anchor.set(A.x,A.y),V.position.set($.x,$.y),V.scale.set(_.x,_.y),V.alpha=P,V.visible=q,D&&(D.removeChild(L),D.addChildAt(V,j),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),k.pixiObject&&(k.pixiObject=V),k.pixi&&(k.pixi=V),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(L!=null&&L.children){let M=L.children.find(D=>D.texture);M?(M.texture=E,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let O=`raw/library/${n}/${t}`;Se({objectId:v,path:"render.asset.path",value:O}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",O)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function Fr(i,e,t,n){var a;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:n});try{let r=e.startsWith("json.")?e.replace("json.",""):e,s=Date.now(),o=`/raw/${t}?t=${s}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await Ct.Assets.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);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=((a=d.getDisplayObject)==null?void 0:a.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}Se({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 $i=require("pixi.js"),_e=()=>window.debugConfig||{},Ur=()=>window.resolveAnchorVec2||(i=>({x:.5,y:.5})),Gr=()=>window.resolveScreenAnchorPoint||(()=>new $i.Point),qr=()=>window.resolveScreenRatioPoint||(()=>new $i.Point);function Vr(i){In(i)&&(i.objectDebugRaf||(i.objectDebugRaf=window.requestAnimationFrame(()=>jn(i))))}function Wr(i){i.objectDebugRaf&&(window.cancelAnimationFrame(i.objectDebugRaf),i.objectDebugRaf=null),Tt(i)}function In(i){return i.isDebugOpen}function jn(i){var r,s,o;if(!In(i)){i.objectDebugRaf=null;return}i.objectDebugRaf=window.requestAnimationFrame(()=>jn(i));let e=zi(i);if(!e){Lt(i,null),Tt(i);return}let t=Ni(i,e);if(!t){Lt(i,null),Tt(i);return}let n=new _t.Point;(r=t.getGlobalPosition)==null||r.call(t,n);let a=Hi(i,t);Lt(i,{instanceId:e,worldX:n.x,worldY:n.y,configX:(s=a==null?void 0:a.x)!=null?s:null,configY:(o=a==null?void 0:a.y)!=null?o:null}),i.highlightObject?Gi(i,t):Vi(i),i.highlightAnchor&&a?qi(i,a):Wi(i)}function zi(i){var a;let e=i.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,n=(a=t==null?void 0:t.get)==null?void 0:a.call(t,e);return Array.isArray(n)&&n.length>0?n[0]:e}function Ni(i,e){var a,r;let t=window.gameObjectManager,n=(a=t==null?void 0:t.get)==null?void 0:a.call(t,e);return n?((r=n.getDisplayObject)==null?void 0:r.call(n))||n.pixiObject||n:null}function Pt(i){let e=i.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Hi(i,e){var s,o;let t=Pt(i);if(!t)return null;let n=(s=t.transform)!=null?s:{},a=Bi(i);if(!a)return null;if(n.position_ratio!=null)return qr()(a.width,a.height,n.position_ratio);let r=(o=n.anchor)!=null?o:"center";return Gr()(a.width,a.height,r)}function Bi(i){var r;let e=(r=i.container)==null?void 0:r.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),n=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(n)&&n>0)return{width:t,height:n};let a=window.gameApp;return a!=null&&a.renderer?{width:a.renderer.width,height:a.renderer.height}:null}function Fi(i){let e=window.gameApp;return e!=null&&e.stage?(i.objectBoundsGfx&&i.objectBoundsGfx.parent!==e.stage&&(i.objectBoundsGfx.destroy(),i.objectBoundsGfx=null),i.objectBoundsGfx||(i.objectBoundsGfx=new _t.Graphics,i.objectBoundsGfx.zIndex=999999,e.stage.addChild(i.objectBoundsGfx)),i.objectBoundsGfx):null}function Ui(i){let e=window.gameApp;return e!=null&&e.stage?(i.objectAnchorGfx&&i.objectAnchorGfx.parent!==e.stage&&(i.objectAnchorGfx.destroy(),i.objectAnchorGfx=null),i.objectAnchorGfx||(i.objectAnchorGfx=new _t.Graphics,i.objectAnchorGfx.zIndex=1e6,e.stage.addChild(i.objectAnchorGfx)),i.objectAnchorGfx):null}function Gi(i,e){var a;let t=Fi(i);if(!t)return;let n=(a=e.getBounds)==null?void 0:a.call(e);n&&(t.clear(),t.rect(n.x,n.y,n.width,n.height).stroke({width:2,color:16726832,alpha:.9}))}function qi(i,e){let t=Ui(i);if(!t)return;let n=6;t.clear(),t.moveTo(e.x-n,e.y),t.lineTo(e.x+n,e.y),t.moveTo(e.x,e.y-n),t.lineTo(e.x,e.y+n),t.stroke({width:2,color:3066993,alpha:.9})}function Vi(i){i.objectBoundsGfx&&i.objectBoundsGfx.clear()}function Wi(i){i.objectAnchorGfx&&i.objectAnchorGfx.clear()}function Tt(i){i.objectBoundsGfx&&(i.objectBoundsGfx.destroy(),i.objectBoundsGfx=null),i.objectAnchorGfx&&(i.objectAnchorGfx.destroy(),i.objectAnchorGfx=null)}function Lt(i,e){i.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function Yr(i,e){return e.split(".").reduce((t,n)=>t?t[n]:void 0,i)}function Kr(i,e,t){var s;let n=e.split("."),a=n.pop(),r=i;for(let o of n)r[o]=(s=r[o])!=null?s:{},r=r[o];r[a]=t}function Yi(i){var n,a,r,s,o;if(!i)return!1;if((n=i.transform)!=null&&n.offset)return!0;let e=((r=(a=i.identity)==null?void 0:a.category)!=null?r:"").toString().toLowerCase(),t=((o=(s=i.identity)==null?void 0:s.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Dn(i){let e=_e();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function Xr(i){window.location.reload()}function $n(i){let e=JSON.stringify(_e(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function Jr(i,e){var t,n,a;if(!(!i.configViewer||!i.container))try{let r=window.getEditableObjectConfig,s=typeof r=="function"?r(e):null;if(!s){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await Promise.resolve().then(()=>(dn(),Er)),d=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!d)return;let u=await l(d.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),Rn(i,u),(n=i.configViewer)==null||n.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),Rn(i,s),(a=i.configViewer)==null||a.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function Rn(i,e){var d,u,g,h,f,m,b,y,v,x;if(!i.container)return;let t=i.container.querySelector("#config-pos-x"),n=i.container.querySelector("#config-pos-y"),a=i.container.querySelector("#config-scale"),r=i.container.querySelector("#config-anchor-x"),s=i.container.querySelector("#config-anchor-y"),l=Yi(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)),n&&(n.value=String((h=l==null?void 0:l.y)!=null?h:0)),a&&(a.value=String((m=(f=e.transform)==null?void 0:f.scale)!=null?m:1));let c=(x=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?x:{x:.5,y:.5},p=Ur()(c);r&&(r.value=String(p.x)),s&&(s.value=String(p.y))}function Zr(i){var l,c,p,d,u,g,h,f,m,b;let e=i.selectedObjectId;if(!e||!i.container)return;let t=(c=(l=i.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",n=(d=(p=i.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",a=(g=(u=i.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",r=(f=(h=i.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?f:"0.5",s=(b=(m=i.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",o=`${e}:
966
+ `}initialize(e,t){var y,v,x,w,E,C,S,M,B,P,L,I,O,D,j,$;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let a=(()=>{var _;let A=window.getEditableEngineConfig;if(typeof A=="function"){let k=A();return(_=k==null?void 0:k.loading)!=null?_:{}}return{}})(),r=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");r&&(r.value=a.type==="image"?"image":"color",r.addEventListener("change",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{type:r.value}),this.updateFieldVisibility(r.value)}));let o=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");o&&(o.value=a.background_color||"#160a17",o.addEventListener("input",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{background_color:o.value})}));let s=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha-value");s&&(s.value=String((E=a.overlay_alpha)!=null?E:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var _,k;let A=Number(s.value);l&&(l.textContent=A.toFixed(2)),(k=(_=this.options)==null?void 0:_.onUpdateLoading)==null||k.call(_,{overlay_alpha:A})}));let c=(C=this.root)==null?void 0:C.querySelector("#loading-text");c&&(c.value=a.text||"",c.addEventListener("input",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{text:c.value})}));let p=(S=this.root)==null?void 0:S.querySelector("#loading-text-scale"),d=(M=this.root)==null?void 0:M.querySelector("#loading-text-scale-value");p&&(p.value=String((B=a.text_scale)!=null?B:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var _,k;let A=Number(p.value);d&&(d.textContent=A.toFixed(2)),(k=(_=this.options)==null?void 0:_.onUpdateLoading)==null||k.call(_,{text_scale:A})}));let u=(P=this.root)==null?void 0:P.querySelector("#loading-enabled");u&&(u.checked=a.enabled!==!1,u.addEventListener("change",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{enabled:u.checked})}));let g=(L=this.root)==null?void 0:L.querySelector("#loading-blur-enabled");g&&(g.checked=a.blur_enabled!==!1,g.addEventListener("change",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{blur_enabled:g.checked})}));let h=(I=this.root)==null?void 0:I.querySelector("#loading-blur-strength"),f=(O=this.root)==null?void 0:O.querySelector("#loading-blur-strength-value");h&&(h.value=String((D=a.blur_strength)!=null?D:8),f&&(f.textContent=h.value),h.addEventListener("input",()=>{var A,_;f&&(f.textContent=h.value),(_=(A=this.options)==null?void 0:A.onUpdateLoading)==null||_.call(A,{blur_strength:Number(h.value)})}));let m=(j=this.root)==null?void 0:j.querySelector("#loading-show-btn"),b=($=this.root)==null?void 0:$.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onShowLoadingScreen)==null||_.call(A)}),b==null||b.addEventListener("click",()=>{var A,_;(_=(A=this.options)==null?void 0:A.onHideLoadingScreen)==null||_.call(A)}),this.updateFieldVisibility(a.type==="image"?"image":"color")}updateFieldVisibility(e){var a,r;let t=(a=this.root)==null?void 0:a.querySelector("#loading-color-field"),n=(r=this.root)==null?void 0:r.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),n&&(n.style.display="none")):(t&&(t.style.display=""),n&&(n.style.display=""))}refresh(){}};var Ct=require("pixi.js");Xe();K();async function Nr(i,e,t){var n,a;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 Ct.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),(n=c[u])!=null&&n.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 h=((a=g.getDisplayObject)==null?void 0:a.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(r){console.error("[LIBRARY] Error applying asset change:",r)}}async function Hr(i,e){var t,n,a;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 Ct.Assets.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of h)oe[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(n=u[m])!=null&&n.texture&&(u[m].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let f=window.gameObjectManager;if(f)for(let m of h){let b=f.get(m);if(b){let y=((a=b.getDisplayObject)==null?void 0:a.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(r){console.error("[LIBRARY] Error resetting asset:",r)}}async function Br(i,e,t,n){var a,r,o,s,l,c,p,d,u,g,h,f,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:n});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let x=Date.now(),w=`/raw/library/${n}/${t}?t=${x}`;console.log("[LIBRARY] Loading texture from:",w);let E=await Ct.Assets.load(w);if(!E){console.error("[LIBRARY] Failed to load texture:",w);return}console.log("[LIBRARY] \u2705 Texture loaded"),oe[v]=E,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let C=window.CustomAssets;C!=null&&C[v]&&(C[v].texture=E,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let S=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!S),S){let B=Array.from(((a=S.keys)==null?void 0:a.call(S))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",B);let P=S.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!P),P){let L=((r=P.getDisplayObject)==null?void 0:r.call(P))||P.pixiObject||P.pixi||P,I=(o=L==null?void 0:L.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",L),console.log("[LIBRARY] displayObject type:",I),console.log("[LIBRARY] has texture?",!!(L!=null&&L.texture)),L!=null&&L.texture)L.texture=E,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(I==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:O}=await import("pixi.js"),D=L.parent,j=(l=(s=D==null?void 0:D.getChildIndex)==null?void 0:s.call(D,L))!=null?l:0,$={x:L.x,y:L.y},A={x:(p=(c=L.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=L.anchor)==null?void 0:d.y)!=null?u:.5},_={x:(h=(g=L.scale)==null?void 0:g.x)!=null?h:1,y:(m=(f=L.scale)==null?void 0:f.y)!=null?m:1},k=(b=L.alpha)!=null?b:1,q=(y=L.visible)!=null?y:!0,V=new O(E);V.anchor.set(A.x,A.y),V.position.set($.x,$.y),V.scale.set(_.x,_.y),V.alpha=k,V.visible=q,D&&(D.removeChild(L),D.addChildAt(V,j),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),P.pixiObject&&(P.pixiObject=V),P.pixi&&(P.pixi=V),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(L!=null&&L.children){let O=L.children.find(D=>D.texture);O?(O.texture=E,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let M=`raw/library/${n}/${t}`;Se({objectId:v,path:"render.asset.path",value:M}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",M)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function Fr(i,e,t,n){var a;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:n});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 Ct.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=((a=d.getDisplayObject)==null?void 0:a.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",r))}}Se({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 $i=require("pixi.js"),_e=()=>window.debugConfig||{},Ur=()=>window.resolveAnchorVec2||(i=>({x:.5,y:.5})),Gr=()=>window.resolveScreenAnchorPoint||(()=>new $i.Point),qr=()=>window.resolveScreenRatioPoint||(()=>new $i.Point);function Vr(i){In(i)&&(i.objectDebugRaf||(i.objectDebugRaf=window.requestAnimationFrame(()=>jn(i))))}function Wr(i){i.objectDebugRaf&&(window.cancelAnimationFrame(i.objectDebugRaf),i.objectDebugRaf=null),Tt(i)}function In(i){return i.isDebugOpen}function jn(i){var r,o,s;if(!In(i)){i.objectDebugRaf=null;return}i.objectDebugRaf=window.requestAnimationFrame(()=>jn(i));let e=zi(i);if(!e){Lt(i,null),Tt(i);return}let t=Ni(i,e);if(!t){Lt(i,null),Tt(i);return}let n=new _t.Point;(r=t.getGlobalPosition)==null||r.call(t,n);let a=Hi(i,t);Lt(i,{instanceId:e,worldX:n.x,worldY:n.y,configX:(o=a==null?void 0:a.x)!=null?o:null,configY:(s=a==null?void 0:a.y)!=null?s:null}),i.highlightObject?Gi(i,t):Vi(i),i.highlightAnchor&&a?qi(i,a):Wi(i)}function zi(i){var a;let e=i.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,n=(a=t==null?void 0:t.get)==null?void 0:a.call(t,e);return Array.isArray(n)&&n.length>0?n[0]:e}function Ni(i,e){var a,r;let t=window.gameObjectManager,n=(a=t==null?void 0:t.get)==null?void 0:a.call(t,e);return n?((r=n.getDisplayObject)==null?void 0:r.call(n))||n.pixiObject||n:null}function kt(i){let e=i.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Hi(i,e){var o,s;let t=kt(i);if(!t)return null;let n=(o=t.transform)!=null?o:{},a=Bi(i);if(!a)return null;if(n.position_ratio!=null)return qr()(a.width,a.height,n.position_ratio);let r=(s=n.anchor)!=null?s:"center";return Gr()(a.width,a.height,r)}function Bi(i){var r;let e=(r=i.container)==null?void 0:r.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),n=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(n)&&n>0)return{width:t,height:n};let a=window.gameApp;return a!=null&&a.renderer?{width:a.renderer.width,height:a.renderer.height}:null}function Fi(i){let e=window.gameApp;return e!=null&&e.stage?(i.objectBoundsGfx&&i.objectBoundsGfx.parent!==e.stage&&(i.objectBoundsGfx.destroy(),i.objectBoundsGfx=null),i.objectBoundsGfx||(i.objectBoundsGfx=new _t.Graphics,i.objectBoundsGfx.zIndex=999999,e.stage.addChild(i.objectBoundsGfx)),i.objectBoundsGfx):null}function Ui(i){let e=window.gameApp;return e!=null&&e.stage?(i.objectAnchorGfx&&i.objectAnchorGfx.parent!==e.stage&&(i.objectAnchorGfx.destroy(),i.objectAnchorGfx=null),i.objectAnchorGfx||(i.objectAnchorGfx=new _t.Graphics,i.objectAnchorGfx.zIndex=1e6,e.stage.addChild(i.objectAnchorGfx)),i.objectAnchorGfx):null}function Gi(i,e){var a;let t=Fi(i);if(!t)return;let n=(a=e.getBounds)==null?void 0:a.call(e);n&&(t.clear(),t.rect(n.x,n.y,n.width,n.height).stroke({width:2,color:16726832,alpha:.9}))}function qi(i,e){let t=Ui(i);if(!t)return;let n=6;t.clear(),t.moveTo(e.x-n,e.y),t.lineTo(e.x+n,e.y),t.moveTo(e.x,e.y-n),t.lineTo(e.x,e.y+n),t.stroke({width:2,color:3066993,alpha:.9})}function Vi(i){i.objectBoundsGfx&&i.objectBoundsGfx.clear()}function Wi(i){i.objectAnchorGfx&&i.objectAnchorGfx.clear()}function Tt(i){i.objectBoundsGfx&&(i.objectBoundsGfx.destroy(),i.objectBoundsGfx=null),i.objectAnchorGfx&&(i.objectAnchorGfx.destroy(),i.objectAnchorGfx=null)}function Lt(i,e){i.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function Yr(i,e){return e.split(".").reduce((t,n)=>t?t[n]:void 0,i)}function Kr(i,e,t){var o;let n=e.split("."),a=n.pop(),r=i;for(let s of n)r[s]=(o=r[s])!=null?o:{},r=r[s];r[a]=t}function Yi(i){var n,a,r,o,s;if(!i)return!1;if((n=i.transform)!=null&&n.offset)return!0;let e=((r=(a=i.identity)==null?void 0:a.category)!=null?r:"").toString().toLowerCase(),t=((s=(o=i.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Dn(i){let e=_e();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function Xr(i){window.location.reload()}function $n(i){let e=JSON.stringify(_e(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function Jr(i,e){var t,n,a;if(!(!i.configViewer||!i.container))try{let r=window.getEditableObjectConfig,o=typeof r=="function"?r(e):null;if(!o){let{loadObjectCentricConfig:s,loadObjectConfig:l}=await Promise.resolve().then(()=>(dn(),Er)),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),Rn(i,u),(n=i.configViewer)==null||n.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),Rn(i,o),(a=i.configViewer)==null||a.style.setProperty("display","block");return}catch(r){console.error("[DEBUG] Failed to load object config:",r)}}function Rn(i,e){var d,u,g,h,f,m,b,y,v,x;if(!i.container)return;let t=i.container.querySelector("#config-pos-x"),n=i.container.querySelector("#config-pos-y"),a=i.container.querySelector("#config-scale"),r=i.container.querySelector("#config-anchor-x"),o=i.container.querySelector("#config-anchor-y"),l=Yi(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)),n&&(n.value=String((h=l==null?void 0:l.y)!=null?h:0)),a&&(a.value=String((m=(f=e.transform)==null?void 0:f.scale)!=null?m:1));let c=(x=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?x:{x:.5,y:.5},p=Ur()(c);r&&(r.value=String(p.x)),o&&(o.value=String(p.y))}function Zr(i){var l,c,p,d,u,g,h,f,m,b;let e=i.selectedObjectId;if(!e||!i.container)return;let t=(c=(l=i.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",n=(d=(p=i.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",a=(g=(u=i.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",r=(f=(h=i.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?f:"0.5",o=(b=(m=i.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",s=`${e}:
967
967
  position: (${t}, ${n})
968
968
  scale: ${a}
969
- anchor: (${r}, ${s})`;navigator.clipboard.writeText(o).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function Ki(i,e){var d,u,g,h,f,m,b,y,v,x,w;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!i.container)return;let t=i.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let n=Number((u=(d=i.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),a=Number((h=(g=i.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?h:0),r=Number((m=(f=i.container.querySelector("#config-scale"))==null?void 0:f.value)!=null?m:1),s=Number((y=(b=i.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),o=Number((x=(v=i.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:n,posY:a,scale:r,anchorX:s,anchorY:o});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Je));l({objectId:t,path:"transform.position",value:{x:n,y:a}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:r},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:s,y:o}},{silent:e==null?void 0:e.silent});let c=Pt(i);Yi(c)&&l({objectId:t,path:"transform.offset",value:{x:n,y:a}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let E=(w=window.getEditableObjectConfig)==null?void 0:w.call(window,t);E?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,E)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Qr(i,e,t){let{applyConfigOverride:n}=await Promise.resolve().then(()=>(K(),Je));Object.entries(e.assets).forEach(([l,c])=>{n({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{n({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{n({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{n({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{n({path:`runtime.audio.${l}`,value:c},{silent:!0})});let a=window.applyEditableEngineConfig;if(typeof a=="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("."),h=c;for(let f=0;f<g.length-1;f++){let m=g[f];h[m]=(u=h[m])!=null?u:{},h=h[m]}h[g[g.length-1]]=d}else c[p]=d}),l.ui=c,a({runtime:l,assets:e.assets})}let r=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!r,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function es(i){i.selectedObjectId&&(i.objectAutoApplyTimer&&window.clearTimeout(i.objectAutoApplyTimer),i.objectAutoApplyTimer=window.setTimeout(()=>{i.objectAutoApplyTimer=null,Ki(i,{silent:!0})},150))}var Go=3e3;function ts(i,e,t){let n=t!=null?t:i.offsetParent;if(!n)return;e.style.cursor="move";let a=0,r=0,s=0,o=0,l=!1,c=d=>{if(!l)return;let u=d.clientX-a,g=d.clientY-r;i.style.left=`${s+u}px`,i.style.top=`${o+g}px`},p=()=>{l&&(l=!1,window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",d=>{if(d.button!==0)return;let u=d.target;if(u!=null&&u.closest("button, input, select, textarea"))return;d.preventDefault();let g=i.getBoundingClientRect(),h=n.getBoundingClientRect();s=Math.max(0,g.left-h.left),o=Math.max(0,g.top-h.top);let f=g.width,m=g.height,b=h.width,y=h.height;s=Math.min(s,b-f),o=Math.min(o,y-m),a=d.clientX,r=d.clientY,i.style.left=`${s}px`,i.style.top=`${o}px`,i.style.right="auto",i.style.bottom="auto",i.style.zIndex=String(++Go);let v=i.getBoundingClientRect();(v.left<0||v.top<0||v.right>window.innerWidth||v.bottom>window.innerHeight)&&(i.style.left="16px",i.style.top="72px",i.style.right="auto",i.style.bottom="auto"),l=!0,window.addEventListener("pointermove",c),window.addEventListener("pointerup",p)})}function ns(i,e,t,n=280,a=200){e.style.cursor="nwse-resize";let r=0,s=0,o=0,l=0,c=!1,p=u=>{if(!c)return;let g=u.clientX-o,h=u.clientY-l,f=Math.max(n,r+g),m=Math.max(a,s+h);i.style.width=`${f}px`,i.style.height=`${m}px`,t==null||t(f,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=i.getBoundingClientRect();r=g.width,s=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function Xi(i,e){var f,m,b;let t=(b=(m=(f=i.container)==null?void 0:f.querySelector("#debug-overlay"))!=null?m:i.debugOverlay)!=null?b:e.offsetParent;if(!t)return;let n=t.getBoundingClientRect(),a=e.getBoundingClientRect(),r=12,s=Math.max(250,Math.floor(n.width-r*2)),o=Math.max(200,Math.floor(n.height-r*2));a.width>s&&(e.style.width=`${s}px`),a.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-n.left,p=l.top-n.top,d=Math.max(r,n.width-l.width-r),u=Math.max(r,n.height-l.height-r),g=Math.min(Math.max(c,r),d),h=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function He(i){if(!i.container)return;let e=i.container.querySelector("#debug-workbench");if(!e)return;Xi(i,e);let t={activeTab:i.activeTab,width:e.style.width,height:e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function zn(i){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(i.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var a;let n=(a=i.container)==null?void 0:a.querySelector("#debug-workbench");n&&(t.width&&(n.style.width=t.width),t.height&&(n.style.height=t.height),t.left&&(n.style.left=t.left,n.style.right="auto"),t.top&&(n.style.top=t.top,n.style.bottom="auto"),Xi(i,n))})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function is(i,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",Xi(i,e),He(i))}function as(i){var a,r,s;if(!i.container)return;let e=i.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=i.toggleDebug)==null||o.call(i)}),(a=e.querySelector("#debug-close"))==null||a.addEventListener("click",()=>{var o;return(o=i.toggleDebug)==null?void 0:o.call(i,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>Dn(i)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>$n(i)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;i.activeTab=l,Ji(i),He(i)})}),Qi(i,e),Zi(i,e)}function Ji(i){if(!i.container)return;let e=i.container;e.querySelectorAll(".workbench-tab").forEach(a=>{let r=a.dataset.tab;a.classList.toggle("active",r===i.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(a=>{let r=a.dataset.tabPanel;a.classList.toggle("active",r===i.activeTab)})}function Zi(i,e){te(i,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),te(i,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),te(i,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),te(i,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),te(i,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),te(i,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),te(i,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),te(i,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),te(i,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let a=_e();a.layout&&(a.layout.debug_rect_visible=!!t.checked)});let n=e.querySelector("#debug-rect-color");n==null||n.addEventListener("input",()=>{let a=n.value.replace("#",""),r=parseInt(a,16),s=_e();s.layout&&(s.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function rs(i){if(!i.container||!i.debugOverlay)return;let e=i.container.querySelector("#debug-workbench"),t=i.container.querySelector("#workbench-handle"),n=i.container.querySelector("#workbench-resize");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),ts(e,t,i.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{He(i),is(i,e)},10)})),e&&n&&ns(e,n,()=>He(i)),zn(i)}function Qi(i,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(n=>{n.addEventListener("click",()=>{let a=n.closest(".scene-panel");a&&a.classList.toggle("collapsed")})})}function te(i,e,t,n,a){let r=e.querySelector(`#${t}`),s=e.querySelector(a);if(!r||!s)return;let o=Yr(_e(),n);typeof o=="number"&&(r.value=String(o),s.textContent=String(o)),r.addEventListener("input",()=>{let l=Number(r.value);s.textContent=String(l),Kr(_e(),n,l)})}K();var Nn=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=nn(),{hasChanges:t,overrideCount:n,overrides:a}=e,r={};for(let l of a){let c=l.objectId||"Engine";r[c]||(r[c]=[]),r[c].push(l)}let s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never";return`
969
+ anchor: (${r}, ${o})`;navigator.clipboard.writeText(s).then(()=>console.log("[DEBUG] Config values copied to clipboard")).catch(y=>console.error("[DEBUG] Failed to copy config values:",y))}async function Ki(i,e){var d,u,g,h,f,m,b,y,v,x,w;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!i.container)return;let t=i.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let n=Number((u=(d=i.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),a=Number((h=(g=i.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?h:0),r=Number((m=(f=i.container.querySelector("#config-scale"))==null?void 0:f.value)!=null?m:1),o=Number((y=(b=i.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),s=Number((x=(v=i.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:n,posY:a,scale:r,anchorX:o,anchorY:s});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Je));l({objectId:t,path:"transform.position",value:{x:n,y:a}},{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=kt(i);Yi(c)&&l({objectId:t,path:"transform.offset",value:{x:n,y:a}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let E=(w=window.getEditableObjectConfig)==null?void 0:w.call(window,t);E?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,E)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Qr(i,e,t){let{applyConfigOverride:n}=await Promise.resolve().then(()=>(K(),Je));Object.entries(e.assets).forEach(([l,c])=>{n({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{n({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{n({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{n({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{n({path:`runtime.audio.${l}`,value:c},{silent:!0})});let a=window.applyEditableEngineConfig;if(typeof a=="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("."),h=c;for(let f=0;f<g.length-1;f++){let m=g[f];h[m]=(u=h[m])!=null?u:{},h=h[m]}h[g[g.length-1]]=d}else c[p]=d}),l.ui=c,a({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 eo(i){i.selectedObjectId&&(i.objectAutoApplyTimer&&window.clearTimeout(i.objectAutoApplyTimer),i.objectAutoApplyTimer=window.setTimeout(()=>{i.objectAutoApplyTimer=null,Ki(i,{silent:!0})},150))}var Gs=3e3;function to(i,e,t){let n=t!=null?t:i.offsetParent;if(!n)return;e.style.cursor="move";let a=0,r=0,o=0,s=0,l=!1,c=d=>{if(!l)return;let u=d.clientX-a,g=d.clientY-r;i.style.left=`${o+u}px`,i.style.top=`${s+g}px`},p=()=>{l&&(l=!1,window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",d=>{if(d.button!==0)return;let u=d.target;if(u!=null&&u.closest("button, input, select, textarea"))return;d.preventDefault();let g=i.getBoundingClientRect(),h=n.getBoundingClientRect();o=Math.max(0,g.left-h.left),s=Math.max(0,g.top-h.top);let f=g.width,m=g.height,b=h.width,y=h.height;o=Math.min(o,b-f),s=Math.min(s,y-m),a=d.clientX,r=d.clientY,i.style.left=`${o}px`,i.style.top=`${s}px`,i.style.right="auto",i.style.bottom="auto",i.style.zIndex=String(++Gs);let v=i.getBoundingClientRect();(v.left<0||v.top<0||v.right>window.innerWidth||v.bottom>window.innerHeight)&&(i.style.left="16px",i.style.top="72px",i.style.right="auto",i.style.bottom="auto"),l=!0,window.addEventListener("pointermove",c),window.addEventListener("pointerup",p)})}function no(i,e,t,n=280,a=200){e.style.cursor="nwse-resize";let r=0,o=0,s=0,l=0,c=!1,p=u=>{if(!c)return;let g=u.clientX-s,h=u.clientY-l,f=Math.max(n,r+g),m=Math.max(a,o+h);i.style.width=`${f}px`,i.style.height=`${m}px`,t==null||t(f,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=i.getBoundingClientRect();r=g.width,o=g.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function Xi(i,e){var f,m,b;let t=(b=(m=(f=i.container)==null?void 0:f.querySelector("#debug-overlay"))!=null?m:i.debugOverlay)!=null?b:e.offsetParent;if(!t)return;let n=t.getBoundingClientRect(),a=e.getBoundingClientRect(),r=12,o=Math.max(250,Math.floor(n.width-r*2)),s=Math.max(200,Math.floor(n.height-r*2));a.width>o&&(e.style.width=`${o}px`),a.height>s&&(e.style.height=`${s}px`);let l=e.getBoundingClientRect(),c=l.left-n.left,p=l.top-n.top,d=Math.max(r,n.width-l.width-r),u=Math.max(r,n.height-l.height-r),g=Math.min(Math.max(c,r),d),h=Math.min(Math.max(p,r),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function He(i){if(!i.container)return;let e=i.container.querySelector("#debug-workbench");if(!e)return;Xi(i,e);let t={activeTab:i.activeTab,width:e.style.width,height:e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function zn(i){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(i.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var a;let n=(a=i.container)==null?void 0:a.querySelector("#debug-workbench");n&&(t.width&&(n.style.width=t.width),t.height&&(n.style.height=t.height),t.left&&(n.style.left=t.left,n.style.right="auto"),t.top&&(n.style.top=t.top,n.style.bottom="auto"),Xi(i,n))})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function io(i,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",Xi(i,e),He(i))}function ao(i){var a,r,o;if(!i.container)return;let e=i.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=i.toggleDebug)==null||s.call(i)}),(a=e.querySelector("#debug-close"))==null||a.addEventListener("click",()=>{var s;return(s=i.toggleDebug)==null?void 0:s.call(i,!1)}),(r=e.querySelector("#debug-reset"))==null||r.addEventListener("click",()=>Dn(i)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>$n(i)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;i.activeTab=l,Ji(i),He(i)})}),Qi(i,e),Zi(i,e)}function Ji(i){if(!i.container)return;let e=i.container;e.querySelectorAll(".workbench-tab").forEach(a=>{let r=a.dataset.tab;a.classList.toggle("active",r===i.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(a=>{let r=a.dataset.tabPanel;a.classList.toggle("active",r===i.activeTab)})}function Zi(i,e){te(i,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),te(i,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),te(i,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),te(i,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),te(i,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),te(i,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),te(i,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),te(i,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),te(i,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let a=_e();a.layout&&(a.layout.debug_rect_visible=!!t.checked)});let n=e.querySelector("#debug-rect-color");n==null||n.addEventListener("input",()=>{let a=n.value.replace("#",""),r=parseInt(a,16),o=_e();o.layout&&(o.layout.debug_rect_color=Number.isFinite(r)?r:16711680)})}function ro(i){if(!i.container||!i.debugOverlay)return;let e=i.container.querySelector("#debug-workbench"),t=i.container.querySelector("#workbench-handle"),n=i.container.querySelector("#workbench-resize");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),to(e,t,i.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{He(i),io(i,e)},10)})),e&&n&&no(e,n,()=>He(i)),zn(i)}function Qi(i,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(n=>{n.addEventListener("click",()=>{let a=n.closest(".scene-panel");a&&a.classList.toggle("collapsed")})})}function te(i,e,t,n,a){let r=e.querySelector(`#${t}`),o=e.querySelector(a);if(!r||!o)return;let s=Yr(_e(),n);typeof s=="number"&&(r.value=String(s),o.textContent=String(s)),r.addEventListener("input",()=>{let l=Number(r.value);o.textContent=String(l),Kr(_e(),n,l)})}K();var Nn=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=nn(),{hasChanges:t,overrideCount:n,overrides:a}=e,r={};for(let l of a){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`
970
970
  <div class="config-persistence-panel">
971
971
  <div class="persistence-status-bar ${t?"has-changes":"no-changes"}">
972
972
  ${t?`
@@ -1078,7 +1078,7 @@ Generate the requested asset matching the brand style.${i.needsTransparency?" Ba
1078
1078
  <div class="persistence-footer">
1079
1079
  <div class="footer-row">
1080
1080
  <span class="footer-label">Last Applied:</span>
1081
- <span class="footer-value">${o}</span>
1081
+ <span class="footer-value">${s}</span>
1082
1082
  </div>
1083
1083
  <div class="footer-secondary-actions">
1084
1084
  <button id="reset-to-applied-btn" class="footer-btn" ${t?"":"disabled"}>Reload State</button>
@@ -1095,7 +1095,7 @@ Generate the requested asset matching the brand style.${i.needsTransparency?" Ba
1095
1095
  </ul>
1096
1096
  </div>
1097
1097
  </div>
1098
- `}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 an(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=De(),d={};for(let[g,h]of Object.entries(p.objects)){let f=h,m=g;/^(json\.|ui\.|effects\.|engine\.)/.test(m)||(m=`json.${g}`),f&&typeof f=="object"&&(f.identity||(f.identity={}),f.identity.id=m),d[`objects/${m}.json`]=f}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,h]of Object.entries(p.scenes)){let f=g.startsWith("scene.")?g:`scene.${g}`;d[`scenes/${f}.json`]=h}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")}oe(),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 n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1098
+ `}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 an(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=De(),d={};for(let[g,h]of Object.entries(p.objects)){let f=h,m=g;/^(json\.|ui\.|effects\.|engine\.)/.test(m)||(m=`json.${g}`),f&&typeof f=="object"&&(f.identity||(f.identity={}),f.identity.id=m),d[`objects/${m}.json`]=f}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,h]of Object.entries(p.scenes)){let f=g.startsWith("scene.")?g:`scene.${g}`;d[`scenes/${f}.json`]=h}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 n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1099
1099
 
1100
1100
  This will DIRECTLY MODIFY base configuration files.
1101
1101
 
@@ -1105,7 +1105,7 @@ This is ONLY for active development.
1105
1105
 
1106
1106
  Make sure your project is under Git version control.
1107
1107
 
1108
- Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let p=De(),d={};for(let[g,h]of Object.entries(p.objects)){let f=h,m=g;/^(json\.|ui\.|effects\.|engine\.)/.test(m)||(m=`json.${g}`),f&&typeof f=="object"&&(f.identity||(f.identity={}),f.identity.id=m),d[`objects/${m}.json`]=f}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,h]of Object.entries(p.scenes)){let f=g.startsWith("scene.")?g:`scene.${g}`;d[`scenes/${f}.json`]=h}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")}oe(),this.showSuccessNotification(),this.refreshPanel()}catch(p){console.error("[ConfigPersistence] Apply to base failed:",p),alert(`\u274C Apply to base failed: ${p.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async 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;tn(d||void 0,p)})});let s=this.container.querySelector("#clear-all-overrides");s==null||s.addEventListener("click",()=>{confirm("Discard all staged changes?")&&Et()});let o=this.container.querySelector("#reset-to-applied-btn");o==null||o.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 rn()})}showSuccessNotification(){let e=document.createElement("div");e.className="persistence-notification success",e.innerHTML=`
1108
+ Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let p=De(),d={};for(let[g,h]of Object.entries(p.objects)){let f=h,m=g;/^(json\.|ui\.|effects\.|engine\.)/.test(m)||(m=`json.${g}`),f&&typeof f=="object"&&(f.identity||(f.identity={}),f.identity.id=m),d[`objects/${m}.json`]=f}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,h]of Object.entries(p.scenes)){let f=g.startsWith("scene.")?g:`scene.${g}`;d[`scenes/${f}.json`]=h}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}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async 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;tn(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 rn()})}showSuccessNotification(){let e=document.createElement("div");e.className="persistence-notification success",e.innerHTML=`
1109
1109
  <div class="notify-icon">\u2705</div>
1110
1110
  <div class="notify-content">
1111
1111
  <strong>Changes Applied!</strong>
@@ -1113,13 +1113,13 @@ Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabl
1113
1113
  </div>
1114
1114
  `,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"}"?
1115
1115
 
1116
- All unsaved changes in the current version will be lost.`))try{let n=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Failed to switch version")}oe(),window.location.reload()}catch(n){alert(`\u274C Failed to switch version: ${n.message}`)}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
1116
+ All unsaved changes in the current version will be lost.`))try{let n=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Failed to switch version")}se(),window.location.reload()}catch(n){alert(`\u274C Failed to switch version: ${n.message}`)}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
1117
1117
 
1118
1118
  This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snapshot.
1119
1119
 
1120
1120
  This cannot be undone unless you have git commits or backups.
1121
1121
 
1122
- Are you absolutely sure?`))try{let t=De(),n={};for(let[r,s]of Object.entries(t.objects)){let o=s,l=r;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${r}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),n[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(n["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(n["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(n["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(n["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(n["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(n["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(n["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(n["engine/engine.json"]=t.engine));for(let[r,s]of Object.entries(t.scenes)){let o=r.startsWith("scene.")?r:`scene.${r}`;n[`scenes/${o}.json`]=s}let a=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:n,assets:{}})});if(!a.ok){let r=await a.json();throw new Error(r.error||"Direct apply failed")}oe(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var kt=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 un;this.sceneToolsPanel=new gn;this.nudgePanel=new fn;this.inspectorPanel=new Tn;this.libraryPanel=new hn;this.brandVisionPanel=new kn;this.customizeSettingsPanel=new Mn;this.configPersistencePanel=new Nn;this.loadingScreenPanel=new On}applyAssetChange(e,t){return Nr(this,e,t)}resetAsset(e){return Hr(this,e)}applySlotAsset(e,t,n){return Br(this,e,t,n)}resetSlotAsset(e,t,n){return Fr(this,e,t,n)}startObjectVisuals(){return Vr(this)}stopObjectVisuals(){return Wr(this)}shouldRunObjectVisuals(){return In(this)}updateObjectVisuals(){return jn(this)}getSelectedInstanceId(){return zi(this)}getDisplayObjectById(e){return Ni(this,e)}getSelectedObjectConfig(){return Pt(this)}getConfigAnchorWorldPoint(e){return Hi(this,e)}getScreenSize(){return Bi(this)}ensureBoundsGfx(){return Fi(this)}ensureAnchorGfx(){return Ui(this)}drawBounds(e){return Gi(this,e)}drawAnchor(e){return qi(this,e)}clearBounds(){return Vi(this)}clearAnchor(){return Wi(this)}clearObjectVisuals(){return Tt(this)}updateObjectInfo(e){return Lt(this,e)}resetDebugConfig(){return Dn(this)}applyDebugConfig(){return Xr(this)}exportDebugConfig(){return $n(this)}loadObjectConfig(e){return Jr(this,e)}fillConfigViewer(e){return Rn(this,e)}copyConfigValues(){return Zr(this)}applyObjectConfig(e){return Ki(this,e)}applyCustomizeSettings(e,t){return Qr(this,e,t)}scheduleObjectAutoApply(){return es(this)}setupDebugEventListeners(){return as(this)}setupDebugInputListeners(e){return Zi(this,e)}setupPanelLayout(){return rs(this)}setupCollapsiblePanels(e){return Qi(this,e)}setupRangeInput(e,t,n,a){return te(this,e,t,n,a)}updateWorkbenchTabs(){return Ji(this)}saveWorkbenchState(){return He(this)}loadWorkbenchState(){return zn(this)}initialize(e){var r;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let s=localStorage.getItem("preview_workbench_state");if(s){let o=JSON.parse(s);o.activeTab&&(this.activeTab=o.activeTab)}}catch(s){console.warn("[PREVIEW] Failed to load workbench tab state",s)}this.sceneObjectsPanel.initialize(e,{onSelect:s=>this.handleObjectSelect(s)}),this.libraryPanel.initialize(e,{onApply:(s,o,l)=>this.applySlotAsset(s,o,l),onReset:(s,o,l)=>this.resetSlotAsset(s,o,l)}),this.inspectorPanel.initialize(e,{onPropertyChange:(s,o,l)=>{console.log("[Inspector] Property changed:",s,o,l)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let s="/dashboard";window.location.pathname!==s&&(window.location.href=s)}),this.customizeSettingsPanel.initialize(e,{onApply:(s,o)=>this.applyCustomizeSettings(s,o)});let t=e.querySelector("#scene-tools-container");t&&(t.innerHTML=this.sceneToolsPanel.render());let n=e.querySelector("#nudge-panel-container");n&&(n.innerHTML=this.nudgePanel.render()),this.sceneToolsPanel.initialize(t||e,{onHighlightObject:s=>{this.highlightObject=s,s?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:s=>{this.highlightAnchor=s,s?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(s,o)=>this.nudgeSelectedObject(s,o),onShowSplash:()=>{let s=window;typeof s.__previewShowSplash=="function"&&s.__previewShowSplash()},onUpdateSplash:s=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({splash:s})}}),this.nudgePanel.initialize(n||e,{onNudge:async(s,o)=>{var h,f,m,b,y,v;if(!this.selectedObjectId)return;let l=this.getSelectedObjectConfig();if(!l)return;let c=(h=l.transform)==null?void 0:h.position,p=((f=c==null?void 0:c.x)!=null?f:0)+s,d=((m=c==null?void 0:c.y)!=null?m:0)+o,{applyConfigOverride:u}=await Promise.resolve().then(()=>(K(),Je));u({objectId:this.selectedObjectId,path:"transform.position",value:{x:p,y:d}},{silent:!0,emitEvent:!0});let g=window.applyEditableObjectConfig;if(typeof g=="function"){let x=window.__editableConfig,w=(v=(y=(b=x==null?void 0:x.objects)==null?void 0:b.get)==null?void 0:y.call(b,this.selectedObjectId))!=null?v:l;await g(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async s=>{var u,g,h,f,m;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=(u=o.transform)==null?void 0:u.scale)!=null?g:1,c=Math.max(.1,l+s),{applyConfigOverride:p}=await Promise.resolve().then(()=>(K(),Je));p({objectId:this.selectedObjectId,path:"transform.scale",value:c},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let b=window.__editableConfig,y=(m=(f=(h=b==null?void 0:b.objects)==null?void 0:h.get)==null?void 0:f.call(h,this.selectedObjectId))!=null?m:o;await d(this.selectedObjectId,y)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let a=t==null?void 0:t.querySelector("#debug-nudge-enabled");a==null||a.addEventListener("change",()=>{a.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let s=window;typeof s.__previewShowLoading=="function"?s.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let s=window;typeof s.__previewHideLoading=="function"?s.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:s=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({loading:s}),typeof o.__previewUpdateLoading=="function"?o.__previewUpdateLoading(s):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(s,o,l,c)=>{this.customizeSettingsPanel.openAiEditor(s,o,l,c)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(r=this.debugOverlay)==null||r.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=s=>this.selectObject(s),window.addEventListener("config:changed",s=>{var o,l;((o=s.detail)==null?void 0:o.action)!=="remove"&&((l=s.detail)==null?void 0:l.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(s,o,l)=>this.applySlotAsset(s,o,l),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var o;let s=window.getActiveConfig;if(typeof s=="function"){let l=s();return((o=l==null?void 0:l.engine)==null?void 0:o.splash)||null}return null},window.addAssetToRegistry=(s,o)=>{let l=window.getEditableAssets;if(typeof l=="function"){let c=l();if(c!=null&&c.libraryAssets&&(c.libraryAssets[s]||(c.libraryAssets[s]=[]),!c.libraryAssets[s].some(d=>d.filename===o))){let d=o.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");c.libraryAssets[s].unshift({filename:o,displayName:d}),console.log(`[DEBUG] Added ${o} to registry category ${s}`)}}},window.__highlightLibrarySlot=(s,o)=>{this.libraryPanel.highlightSlot(s,o)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&(this.activeTab="inspector",this.updateWorkbenchTabs())}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
1122
+ Are you absolutely sure?`))try{let t=De(),n={};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),n[`objects/${l}.json`]=s}t.engine&&(t.engine.runtime&&(n["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(n["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(n["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(n["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(n["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(n["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(n["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(n["engine/engine.json"]=t.engine));for(let[r,o]of Object.entries(t.scenes)){let s=r.startsWith("scene.")?r:`scene.${r}`;n[`scenes/${s}.json`]=o}let a=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:n,assets:{}})});if(!a.ok){let r=await a.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 Pt=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 un;this.sceneToolsPanel=new gn;this.nudgePanel=new fn;this.inspectorPanel=new Tn;this.libraryPanel=new hn;this.brandVisionPanel=new Pn;this.customizeSettingsPanel=new On;this.configPersistencePanel=new Nn;this.loadingScreenPanel=new Mn}applyAssetChange(e,t){return Nr(this,e,t)}resetAsset(e){return Hr(this,e)}applySlotAsset(e,t,n){return Br(this,e,t,n)}resetSlotAsset(e,t,n){return Fr(this,e,t,n)}startObjectVisuals(){return Vr(this)}stopObjectVisuals(){return Wr(this)}shouldRunObjectVisuals(){return In(this)}updateObjectVisuals(){return jn(this)}getSelectedInstanceId(){return zi(this)}getDisplayObjectById(e){return Ni(this,e)}getSelectedObjectConfig(){return kt(this)}getConfigAnchorWorldPoint(e){return Hi(this,e)}getScreenSize(){return Bi(this)}ensureBoundsGfx(){return Fi(this)}ensureAnchorGfx(){return Ui(this)}drawBounds(e){return Gi(this,e)}drawAnchor(e){return qi(this,e)}clearBounds(){return Vi(this)}clearAnchor(){return Wi(this)}clearObjectVisuals(){return Tt(this)}updateObjectInfo(e){return Lt(this,e)}resetDebugConfig(){return Dn(this)}applyDebugConfig(){return Xr(this)}exportDebugConfig(){return $n(this)}loadObjectConfig(e){return Jr(this,e)}fillConfigViewer(e){return Rn(this,e)}copyConfigValues(){return Zr(this)}applyObjectConfig(e){return Ki(this,e)}applyCustomizeSettings(e,t){return Qr(this,e,t)}scheduleObjectAutoApply(){return eo(this)}setupDebugEventListeners(){return ao(this)}setupDebugInputListeners(e){return Zi(this,e)}setupPanelLayout(){return ro(this)}setupCollapsiblePanels(e){return Qi(this,e)}setupRangeInput(e,t,n,a){return te(this,e,t,n,a)}updateWorkbenchTabs(){return Ji(this)}saveWorkbenchState(){return He(this)}loadWorkbenchState(){return zn(this)}initialize(e){var r;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let o=localStorage.getItem("preview_workbench_state");if(o){let s=JSON.parse(o);s.activeTab&&(this.activeTab=s.activeTab)}}catch(o){console.warn("[PREVIEW] Failed to load workbench tab state",o)}this.sceneObjectsPanel.initialize(e,{onSelect:o=>this.handleObjectSelect(o)}),this.libraryPanel.initialize(e,{onApply:(o,s,l)=>this.applySlotAsset(o,s,l),onReset:(o,s,l)=>this.resetSlotAsset(o,s,l)}),this.inspectorPanel.initialize(e,{onPropertyChange:(o,s,l)=>{console.log("[Inspector] Property changed:",o,s,l)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let o="/dashboard";window.location.pathname!==o&&(window.location.href=o)}),this.customizeSettingsPanel.initialize(e,{onApply:(o,s)=>this.applyCustomizeSettings(o,s)});let t=e.querySelector("#scene-tools-container");t&&(t.innerHTML=this.sceneToolsPanel.render());let n=e.querySelector("#nudge-panel-container");n&&(n.innerHTML=this.nudgePanel.render()),this.sceneToolsPanel.initialize(t||e,{onHighlightObject:o=>{this.highlightObject=o,o?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:o=>{this.highlightAnchor=o,o?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(o,s)=>this.nudgeSelectedObject(o,s),onShowSplash:()=>{let o=window;typeof o.__previewShowSplash=="function"&&o.__previewShowSplash()},onUpdateSplash:o=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({splash:o})}}),this.nudgePanel.initialize(n||e,{onNudge:async(o,s)=>{var h,f,m,b,y,v;if(!this.selectedObjectId)return;let l=this.getSelectedObjectConfig();if(!l)return;let c=(h=l.transform)==null?void 0:h.position,p=((f=c==null?void 0:c.x)!=null?f:0)+o,d=((m=c==null?void 0:c.y)!=null?m:0)+s,{applyConfigOverride:u}=await Promise.resolve().then(()=>(K(),Je));u({objectId:this.selectedObjectId,path:"transform.position",value:{x:p,y:d}},{silent:!0,emitEvent:!0});let g=window.applyEditableObjectConfig;if(typeof g=="function"){let x=window.__editableConfig,w=(v=(y=(b=x==null?void 0:x.objects)==null?void 0:b.get)==null?void 0:y.call(b,this.selectedObjectId))!=null?v:l;await g(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async o=>{var u,g,h,f,m;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let l=(g=(u=s.transform)==null?void 0:u.scale)!=null?g:1,c=Math.max(.1,l+o),{applyConfigOverride:p}=await Promise.resolve().then(()=>(K(),Je));p({objectId:this.selectedObjectId,path:"transform.scale",value:c},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let b=window.__editableConfig,y=(m=(f=(h=b==null?void 0:b.objects)==null?void 0:h.get)==null?void 0:f.call(h,this.selectedObjectId))!=null?m:s;await d(this.selectedObjectId,y)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let a=t==null?void 0:t.querySelector("#debug-nudge-enabled");a==null||a.addEventListener("change",()=>{a.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let o=window;typeof o.__previewShowLoading=="function"?o.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let o=window;typeof o.__previewHideLoading=="function"?o.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:o=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({loading:o}),typeof s.__previewUpdateLoading=="function"?s.__previewUpdateLoading(o):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(o,s,l,c)=>{this.customizeSettingsPanel.openAiEditor(o,s,l,c)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(r=this.debugOverlay)==null||r.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=o=>this.selectObject(o),window.addEventListener("config:changed",o=>{var s,l;((s=o.detail)==null?void 0:s.action)!=="remove"&&((l=o.detail)==null?void 0:l.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(o,s,l)=>this.applySlotAsset(o,s,l),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var s;let o=window.getActiveConfig;if(typeof o=="function"){let l=o();return((s=l==null?void 0:l.engine)==null?void 0:s.splash)||null}return null},window.addAssetToRegistry=(o,s)=>{let l=window.getEditableAssets;if(typeof l=="function"){let c=l();if(c!=null&&c.libraryAssets&&(c.libraryAssets[o]||(c.libraryAssets[o]=[]),!c.libraryAssets[o].some(d=>d.filename===s))){let d=s.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");c.libraryAssets[o].unshift({filename:s,displayName:d}),console.log(`[DEBUG] Added ${s} to registry category ${o}`)}}},window.__highlightLibrarySlot=(o,s)=>{this.libraryPanel.highlightSlot(o,s)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&(this.activeTab="inspector",this.updateWorkbenchTabs())}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
1123
1123
  <div class="debug-overlay hidden" id="debug-overlay">
1124
1124
  <div class="debug-workbench" id="debug-workbench">
1125
1125
  <div class="workbench-header" id="workbench-handle">
@@ -1166,7 +1166,7 @@ Are you absolutely sure?`))try{let t=De(),n={};for(let[r,s]of Object.entries(t.o
1166
1166
  <div id="scene-tools-container"></div>
1167
1167
  <div id="nudge-panel-container"></div>
1168
1168
  </div>
1169
- `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}nudgeSelectedObject(e,t){var p,d,u;if(!this.selectedObjectId||!this.container)return;let n=this.nudgePanel.getNudgeStep(),a=this.container.querySelector("#config-pos-x"),r=this.container.querySelector("#config-pos-y");if(!a||!r)return;let s=Number((p=a.value)!=null?p:0),o=Number((d=r.value)!=null?d:0),l=s+e*n,c=o+t*n;a&&(a.value=String(l)),r&&(r.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function qo(i){return new Promise((e,t)=>{let n=new FileReader;n.onerror=()=>t(new Error("FileReader failed")),n.onload=()=>e(String(n.result||"")),n.readAsDataURL(i)})}function Vo(i){var a;let[e,t]=i.split(","),n=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(a=n==null?void 0:n[1])!=null?a:"image/png"}}function Wo(i){return`
1169
+ `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}nudgeSelectedObject(e,t){var p,d,u;if(!this.selectedObjectId||!this.container)return;let n=this.nudgePanel.getNudgeStep(),a=this.container.querySelector("#config-pos-x"),r=this.container.querySelector("#config-pos-y");if(!a||!r)return;let o=Number((p=a.value)!=null?p:0),s=Number((d=r.value)!=null?d:0),l=o+e*n,c=s+t*n;a&&(a.value=String(l)),r&&(r.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function qs(i){return new Promise((e,t)=>{let n=new FileReader;n.onerror=()=>t(new Error("FileReader failed")),n.onload=()=>e(String(n.result||"")),n.readAsDataURL(i)})}function Vs(i){var a;let[e,t]=i.split(","),n=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(a=n==null?void 0:n[1])!=null?a:"image/png"}}function Ws(i){return`
1170
1170
  Analyze these screenshots of a brand or game and extract its "Brand DNA".
1171
1171
 
1172
1172
  Provide a concise summary (2-3 sentences) covering:
@@ -1183,9 +1183,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
1183
1183
  ${i?`
1184
1184
  ADDITIONAL RULES/NOTES:
1185
1185
  ${i}`:""}
1186
- `.trim()}function ss(){let i=[],e="",t=null;return{async addSources(n){let a=[];for(let r of n){let s=await qo(r),o=Vo(s),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:r.name,base64:o.base64,mimeType:o.mimeType,dataUrl:s};i.push(l),a.push(l)}return a},getSources(){return i.slice()},async analyze(n,a,r){if(i.length===0)throw new Error("No screenshots to analyze.");let s=Wo(a),o=i.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await Pn(n,s,o,{model:r}),c=e,p=[],d=l.split(`
1186
+ `.trim()}function oo(){let i=[],e="",t=null;return{async addSources(n){let a=[];for(let r of n){let o=await qs(r),s=Vs(o),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:r.name,base64:s.base64,mimeType:s.mimeType,dataUrl:o};i.push(l),a.push(l)}return a},getSources(){return i.slice()},async analyze(n,a,r){if(i.length===0)throw new Error("No screenshots to analyze.");let o=Ws(a),s=i.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await kn(n,o,s,{model:r}),c=e,p=[],d=l.split(`
1187
1187
  `);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(h=>{p.includes(h.toUpperCase())||p.push(h.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
1188
- Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0,10)},t},setSummary(n){e=n,t&&(t={...t,summary:n})},getResult(){return t}}}var Be="handler_api_key_";var nt=class{static setKey(e,t,n){try{let a={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:n||e},r=`${Be}${e}`;localStorage.setItem(r,JSON.stringify(a))}catch(a){console.error("[ApiKeyStorage] Failed to store API key:",a)}}static getKey(e){try{let t=`${Be}${e}`,n=localStorage.getItem(t);if(!n)return null;let a=JSON.parse(n);return a.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(a)),this.decryptKey(a.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${Be}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Be}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);if(n&&n.startsWith(Be)){let a=n.substring(Be.length),r=localStorage.getItem(n);if(r){let s=JSON.parse(r);e.push({service:a,label:s.label,created:s.created,lastUsed:s.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,n)=>n.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&n.startsWith(Be)&&e.push(n)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let n="handler_preview_salt_2024"+e;return btoa(n)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),n="handler_preview_salt_2024";return t.startsWith(n)?t.substring(n.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},ea=()=>nt.getKey("gemini"),ta=(i,e)=>nt.setKey("gemini",i,e),Yo=()=>nt.hasKey("gemini");window.ApiKeyStorage=nt;window.getGeminiApiKey=ea;window.setGeminiApiKey=ta;window.hasGeminiApiKey=Yo;var ia=class{constructor(){this.modal=null;this.options=null;this.analyzer=ss();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,n;(t=this.promptInput)==null||t.focus(),(n=this.promptInput)==null||n.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
1188
+ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0,10)},t},setSummary(n){e=n,t&&(t={...t,summary:n})},getResult(){return t}}}var Be="handler_api_key_";var nt=class{static setKey(e,t,n){try{let a={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:n||e},r=`${Be}${e}`;localStorage.setItem(r,JSON.stringify(a))}catch(a){console.error("[ApiKeyStorage] Failed to store API key:",a)}}static getKey(e){try{let t=`${Be}${e}`,n=localStorage.getItem(t);if(!n)return null;let a=JSON.parse(n);return a.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(a)),this.decryptKey(a.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${Be}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Be}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);if(n&&n.startsWith(Be)){let a=n.substring(Be.length),r=localStorage.getItem(n);if(r){let o=JSON.parse(r);e.push({service:a,label:o.label,created:o.created,lastUsed:o.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,n)=>n.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&n.startsWith(Be)&&e.push(n)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let n="handler_preview_salt_2024"+e;return btoa(n)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),n="handler_preview_salt_2024";return t.startsWith(n)?t.substring(n.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},ea=()=>nt.getKey("gemini"),ta=(i,e)=>nt.setKey("gemini",i,e),Ys=()=>nt.hasKey("gemini");window.ApiKeyStorage=nt;window.getGeminiApiKey=ea;window.setGeminiApiKey=ta;window.hasGeminiApiKey=Ys;var ia=class{constructor(){this.modal=null;this.options=null;this.analyzer=oo();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,n;(t=this.promptInput)==null||t.focus(),(n=this.promptInput)==null||n.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
1189
1189
  <div class="ai-modal-card">
1190
1190
  <div class="ai-modal-header">
1191
1191
  <div class="ai-modal-actions">
@@ -1264,14 +1264,14 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0
1264
1264
  <button class="ai-btn primary" data-action="apply" disabled>Apply</button>
1265
1265
  </div>
1266
1266
  </div>
1267
- `,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var n;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(n=this.promptInput)==null||n.addEventListener("input",()=>{var a;this.currentPrompt=((a=this.promptInput)==null?void 0:a.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",a=>{var o;let r=a.target;switch(r.dataset.action||((o=r.closest("[data-action]"))==null?void 0:o.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",a=>{let r=a.target;if(r.classList.contains("ai-gallery-item")||r.closest(".ai-gallery-item")){let s=r.closest(".ai-gallery-item"),o=parseInt(s.dataset.index||"-1");o>=0&&this.selectImage(o)}}),this.modal.addEventListener("click",a=>{a.target===this.modal&&this.close()}),this.updateGenerateButton()}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var t;let e=(t=this.modal)==null?void 0:t.querySelector("#ai-use-dna");if(e!=null&&e.checked)try{let n=this.analyzer.getResult();if(n!=null&&n.summary&&this.promptInput){let a=`${this.currentPrompt}
1267
+ `,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var n;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(n=this.promptInput)==null||n.addEventListener("input",()=>{var a;this.currentPrompt=((a=this.promptInput)==null?void 0:a.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",a=>{var s;let r=a.target;switch(r.dataset.action||((s=r.closest("[data-action]"))==null?void 0:s.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",a=>{let r=a.target;if(r.classList.contains("ai-gallery-item")||r.closest(".ai-gallery-item")){let o=r.closest(".ai-gallery-item"),s=parseInt(o.dataset.index||"-1");s>=0&&this.selectImage(s)}}),this.modal.addEventListener("click",a=>{a.target===this.modal&&this.close()}),this.updateGenerateButton()}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var t;let e=(t=this.modal)==null?void 0:t.querySelector("#ai-use-dna");if(e!=null&&e.checked)try{let n=this.analyzer.getResult();if(n!=null&&n.summary&&this.promptInput){let a=`${this.currentPrompt}
1268
1268
 
1269
- Style guidelines: ${n.summary}`;this.promptInput.value=a,this.currentPrompt=a}}catch(n){console.warn("[AiEditorModal] Failed to apply brand DNA:",n)}}async generateImage(){var e,t,n,a;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let r=this.getApiKey();if(!r){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let s=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await _n(this.options.currentValue);c&&(s=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let o=await tt(r,this.currentPrompt,s,{aspectRatio:"1:1"}),l=await et(o);this.generatedImages.push(l||o),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(r){console.error("[AiEditorModal] Generation failed:",r),alert(`Generation failed: ${r instanceof Error?r.message:"Unknown error"}`)}finally{this.isGenerating=!1,(n=this.loadingEl)==null||n.classList.add("hidden"),(a=this.previewEl)==null||a.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,n)=>`
1269
+ Style guidelines: ${n.summary}`;this.promptInput.value=a,this.currentPrompt=a}}catch(n){console.warn("[AiEditorModal] Failed to apply brand DNA:",n)}}async generateImage(){var e,t,n,a;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let r=this.getApiKey();if(!r){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let o=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await _n(this.options.currentValue);c&&(o=[{base64:c.base64,mimeType:c.mimeType}])}catch(c){console.warn("[AiEditorModal] Failed to load current image:",c)}let s=await tt(r,this.currentPrompt,o,{aspectRatio:"1:1"}),l=await et(s);this.generatedImages.push(l||s),this.selectedImageIndex=this.generatedImages.length-1,this.updateGallery(),this.updatePreview(),this.updateApplyButton()}catch(r){console.error("[AiEditorModal] Generation failed:",r),alert(`Generation failed: ${r instanceof Error?r.message:"Unknown error"}`)}finally{this.isGenerating=!1,(n=this.loadingEl)==null||n.classList.add("hidden"),(a=this.previewEl)==null||a.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,n)=>`
1270
1270
  <div class="ai-gallery-item ${n===this.selectedImageIndex?"active":""}" data-index="${n}">
1271
1271
  <img class="ai-gallery-thumb" src="${t}" alt="Generated ${n+1}" />
1272
1272
  <div class="ai-gallery-label">#${n+1}</div>
1273
1273
  </div>
1274
- `).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=ea();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return ta(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},na=null;window.__openAiEditor=function(i,e,t,n){na||(na=new ia),na.open({objectId:i,initialPrompt:e,currentValue:t,path:n==null?void 0:n.path,onApply:a=>{if(n!=null&&n.path){let r=window.updateManager;if(r)r.updateProperty(i,n.path,a);else{let s=window.getEditableObjectConfig,o=s==null?void 0:s(i);if(o){let l=n.path.split("."),c=o;for(let p=0;p<l.length-1;p++)c[l[p]]||(c[l[p]]={}),c=c[l[p]];c[l[l.length-1]]=a}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};ra();var sa=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:n}=this.options,a=n||"Asset Preview",r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
1274
+ `).join(""))}updatePreview(){if(!this.previewEl||this.selectedImageIndex<0)return;let e=this.generatedImages[this.selectedImageIndex];this.previewEl.innerHTML=`<img src="${e}" alt="Selected image" />`}selectImage(e){e<0||e>=this.generatedImages.length||(this.selectedImageIndex=e,this.updateGallery(),this.updatePreview(),this.updateApplyButton())}toggleGallery(){this.galleryEl&&this.galleryEl.classList.toggle("hidden")}updateApplyButton(){var t;let e=(t=this.modal)==null?void 0:t.querySelector('[data-action="apply"]');e&&(e.disabled=this.selectedImageIndex<0)}applySelectedImage(){var t;if(this.selectedImageIndex<0||!((t=this.options)!=null&&t.onApply))return;let e=this.generatedImages[this.selectedImageIndex];this.options.onApply(e),this.close()}getApiKey(){let e=ea();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return ta(t.apiKey,"From Brand DNA"),t.apiKey}catch(t){console.warn("[AiEditorModal] Failed to get API key from brand DNA:",t)}return null}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}},na=null;window.__openAiEditor=function(i,e,t,n){na||(na=new ia),na.open({objectId:i,initialPrompt:e,currentValue:t,path:n==null?void 0:n.path,onApply:a=>{if(n!=null&&n.path){let r=window.updateManager;if(r)r.updateProperty(i,n.path,a);else{let o=window.getEditableObjectConfig,s=o==null?void 0:o(i);if(s){let l=n.path.split("."),c=s;for(let p=0;p<l.length-1;p++)c[l[p]]||(c[l[p]]={}),c=c[l[p]];c[l[l.length-1]]=a}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};ra();var oa=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:n}=this.options,a=n||"Asset Preview",r=document.createElement("div");r.className="asset-preview-modal",r.innerHTML=`
1275
1275
  <div class="asset-preview-card">
1276
1276
  <div class="asset-preview-header">
1277
1277
  <div class="asset-preview-title">${a}</div>
@@ -1298,7 +1298,7 @@ Style guidelines: ${n.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
1298
1298
  <source src="${a}" type="audio/wav">
1299
1299
  Your browser does not support the audio element.
1300
1300
  </audio>
1301
- `;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",n=>{let a=n.target;(a.dataset.action==="close"||a===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&Promise.resolve().then(()=>(ra(),os)).then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,n=>{var a;(a=this.options)!=null&&a.onChange&&this.options.onChange(n),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(i){new sa().open(i)};var oa=class{constructor(){this.modal=null;this.canvas=null;this.ctx=null;this.image=null;this.options=null;this.cropX=0;this.cropY=0;this.cropWidth=100;this.cropHeight=100;this.scale=1;this.panX=0;this.panY=0;this.isDragging=!1;this.dragStartX=0;this.dragStartY=0;this.lastPanX=0;this.lastPanY=0}open(e){this.options=e,this.createModal(),this.loadImage(),document.body.appendChild(this.modal)}createModal(){let e=document.createElement("div");e.className="asset-crop-modal",e.innerHTML=`
1301
+ `;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",n=>{let a=n.target;(a.dataset.action==="close"||a===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&Promise.resolve().then(()=>(ra(),so)).then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,n=>{var a;(a=this.options)!=null&&a.onChange&&this.options.onChange(n),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(i){new oa().open(i)};var sa=class{constructor(){this.modal=null;this.canvas=null;this.ctx=null;this.image=null;this.options=null;this.cropX=0;this.cropY=0;this.cropWidth=100;this.cropHeight=100;this.scale=1;this.panX=0;this.panY=0;this.isDragging=!1;this.dragStartX=0;this.dragStartY=0;this.lastPanX=0;this.lastPanY=0}open(e){this.options=e,this.createModal(),this.loadImage(),document.body.appendChild(this.modal)}createModal(){let e=document.createElement("div");e.className="asset-crop-modal",e.innerHTML=`
1302
1302
  <div class="asset-crop-card">
1303
1303
  <div class="asset-crop-header">
1304
1304
  <div>
@@ -1349,7 +1349,7 @@ Style guidelines: ${n.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
1349
1349
  <button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
1350
1350
  </div>
1351
1351
  </div>
1352
- `,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 n;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),(n=this.options)!=null&&n.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,n=this.cropX+this.cropWidth/2,a=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,n-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,a-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,n=this.cropWidth*this.scale,a=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,n,a),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,n,a),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+n-r,t],[e,t+a-r],[e+n-r,t+a-r]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,r,r)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let n=150;e.width=n,e.height=n;let a=n/this.cropWidth,r=n/this.cropHeight,s=Math.min(a,r),o=this.cropWidth*s,l=this.cropHeight*s,c=(n-o)/2,p=(n-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,p,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",n=>{let a=parseFloat(n.target.value);this.setZoom(a)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",n=>{let a=n.target.value;this.setAspectRatio(a)}),this.modal.addEventListener("click",n=>{switch(n.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",n=>{n.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,n=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+n,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,n=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+n,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 a;if(!this.image||!((a=this.options)!=null&&a.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 n=e.toDataURL("image/png");this.options.onCrop(n),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(i){new oa().open(i)};var Hn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.comparePresets=[Ne("playable-portrait"),Ne("iphone-14"),Ne("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,n=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+n,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=Ne(e.defaultDevice||pn.id),this.debugPanel=new kt,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var a,r;let n=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=Ne(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:n}),t.suppressCallback||(r=(a=this.options).onDeviceChange)==null||r.call(a,this.getEffectivePreset()),this.emitScreenChange()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell",e.innerHTML=`
1352
+ `,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 n;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),(n=this.options)!=null&&n.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,n=this.cropX+this.cropWidth/2,a=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,n-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,a-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,n=this.cropWidth*this.scale,a=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,n,a),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,n,a),this.ctx.fillStyle="#ffffff";let r=8;[[e,t],[e+n-r,t],[e,t+a-r],[e+n-r,t+a-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 n=150;e.width=n,e.height=n;let a=n/this.cropWidth,r=n/this.cropHeight,o=Math.min(a,r),s=this.cropWidth*o,l=this.cropHeight*o,c=(n-s)/2,p=(n-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",n=>{let a=parseFloat(n.target.value);this.setZoom(a)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",n=>{let a=n.target.value;this.setAspectRatio(a)}),this.modal.addEventListener("click",n=>{switch(n.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",n=>{n.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,n=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+n,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,n=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+n,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 a;if(!this.image||!((a=this.options)!=null&&a.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 n=e.toDataURL("image/png");this.options.onCrop(n),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(i){new sa().open(i)};var Hn=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.comparePresets=[Ne("playable-portrait"),Ne("iphone-14"),Ne("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,n=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+n,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=Ne(e.defaultDevice||pn.id),this.debugPanel=new Pt,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var a,r;let n=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=Ne(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:n}),t.suppressCallback||(r=(a=this.options).onDeviceChange)==null||r.call(a,this.getEffectivePreset()),this.emitScreenChange()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell",e.innerHTML=`
1353
1353
  <div class="preview-toolbar">
1354
1354
  <div class="preview-toolbar-left">
1355
1355
  <span class="preview-logo">PREVIEWER</span>
@@ -1358,7 +1358,7 @@ Style guidelines: ${n.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
1358
1358
  <div class="preview-toolbar-center">
1359
1359
  <div class="device-selector-wrapper">
1360
1360
  <select class="device-dropdown" id="device-select">
1361
- ${ki.map(n=>`
1361
+ ${Pi.map(n=>`
1362
1362
  <optgroup label="${n.label}">
1363
1363
  ${n.devices.map(a=>`
1364
1364
  <option value="${a.id}" ${a.id===this.currentPreset.id?"selected":""}>
@@ -1485,7 +1485,7 @@ Style guidelines: ${n.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
1485
1485
  <div class="console-messages" id="console-messages"></div>
1486
1486
  </div>
1487
1487
  </div>
1488
- `,this.setupEventListeners(e),e}setupEventListeners(e){var a,r,s,o,l,c,p,d,u,g;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",h=>{if(this.viewMode==="compare")return;let f=h.target.value;this.setDevice(f)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(h=>{h.addEventListener("click",()=>{let f=h.dataset.viewToggle;f&&this.setViewMode(f)})}),(a=e.querySelector("#rotate-btn"))==null||a.addEventListener("click",()=>this.toggleRotation()),(r=e.querySelector("#zoom-in-btn"))==null||r.addEventListener("click",()=>this.adjustUserZoom(.1)),(s=e.querySelector("#zoom-out-btn"))==null||s.addEventListener("click",()=>this.adjustUserZoom(-.1)),(o=e.querySelector("#refresh-btn"))==null||o.addEventListener("click",()=>this.refresh()),(l=e.querySelector("#console-toggle"))==null||l.addEventListener("click",()=>this.toggleConsole()),(c=e.querySelector("#console-close"))==null||c.addEventListener("click",()=>this.toggleConsole(!1)),(p=e.querySelector("#console-clear"))==null||p.addEventListener("click",()=>this.clearConsole()),(d=e.querySelector("#corner-zoom-in-btn"))==null||d.addEventListener("click",()=>this.adjustUserZoom(.1)),(u=e.querySelector("#corner-zoom-out-btn"))==null||u.addEventListener("click",()=>this.adjustUserZoom(-.1)),(g=e.querySelector("#corner-grab-btn"))==null||g.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)})}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"0 20px 50px rgba(0,0,0,0.5)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,n=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=n,this.gameContainer.style.width=t,this.gameContainer.style.height=n,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=n,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=n,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(),n=this.getFitBounds(),a=Math.max(0,n.width),r=Math.max(0,n.height);if(a<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let s=a/t.width,o=r/t.height;if(this.autoScale=Math.max(.01,Math.min(s,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector("#scene-tools-container"),t=this.container.querySelector("#nudge-panel-container");e&&e.children.length>0&&(e.style.position="absolute",e.style.left="50%",e.style.top="16px",e.style.transform="translateX(-50%)",e.style.zIndex="100"),t&&t.children.length>0&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,n;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(n=(t=this.options).onDeviceChange)==null||n.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 n=window.gameApp;if(!(n!=null&&n.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var n;let t=new WeakSet;try{return JSON.stringify(e,(a,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r},2)}catch{try{if(e&&((n=e.constructor)!=null&&n.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=console.log.bind(console),t=console.warn.bind(console),n=console.error.bind(console),a=console.info.bind(console),r=(s,...o)=>{let l=o.map(p=>typeof p=="object"?this.safeStringify(p):String(p)).join(" ");this.consoleMessages.push({type:s,message:l,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let c=this.container.querySelector("#console-badge");if(c){let p=this.consoleMessages.filter(d=>d.type==="error").length;c.textContent=p>0?`${p}!`:"0",c.classList.toggle("has-errors",p>0)}};console.log=(...s)=>{e(...s),r("log",...s)},console.warn=(...s)=>{t(...s),r("warn",...s)},console.error=(...s)=>{n(...s),r("error",...s)},console.info=(...s)=>{a(...s),r("info",...s)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let n=document.createElement("div");n.className=`console-msg type-${e.type}`;let a=e.timestamp.toLocaleTimeString();n.innerHTML=`<span class="time">${this.escapeHtml(a)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(n),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let n=t.dataset.viewport;if(!n)return;let a=this.comparePresets.find(d=>d.id===n);if(!a)return;let r=t.querySelector("[data-compare-slot]"),s=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!r||!s||!o||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(n);return}t.classList.contains("is-active")||this.activateCompareViewport(n)}),this.compareViewports.set(n,{preset:a,root:t,slot:r,ghost:s,wrapper:o,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let n=this.container.querySelector("#rotate-btn");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var r,s;let t=this.compareViewports.get(e);if(!t)return;let n=this.autoScale*this.userScaleMultiplier,a=this.activeCompareId;a&&a!==e&&this.captureCompareSnapshot(a),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:n}),(s=(r=this.options).onDeviceChange)==null||s.call(r,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,n=`${t.width}px`,a=`${t.height}px`;e.frame.style.width=n,e.frame.style.height=a,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 n=Math.max(0,t.clientWidth-24),a=Math.max(0,t.clientHeight-24);if(n<=0||a<=0)return;let r=n/e.preset.width,s=a/e.preset.height,o=Math.max(.01,Math.min(r,s));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let n=this.gameContainer.querySelector("canvas");if(!n)return;let a=t.canvas.getContext("2d");if(!a)return;let r=t.canvas.width,s=t.canvas.height,o=Math.min(r/n.width,s/n.height),l=n.width*o,c=n.height*o,p=(r-l)/2,d=(s-c)/2;a.clearRect(0,0,r,s),a.drawImage(n,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 la(i={}){let e=new Hn(i);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function ca(i){try{if(i&&typeof i.keys=="function")return Array.from(i.keys())}catch{}return[]}function ls(i){var e;return i?((e=i.getDisplayObject)==null?void 0:e.call(i))||i.pixiObject||i:null}function Ko(i,e){if(!i||!(e!=null&&e.interaction))return;let t=e.interaction,n=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);i.eventMode=n?"static":"none",i.interactive=n,n&&(i.cursor=t.draggable?"move":"pointer")}function cs(i,e){var l,c,p;if(!i||!e)return;let t=e.transform||{};Ko(i,e);let n=t.position||{},a=t.offset||{},r=(typeof n.x=="number"?n.x:0)+(typeof a.x=="number"?a.x:0),s=(typeof n.y=="number"?n.y:0)+(typeof a.y=="number"?a.y:0);(l=i.position)!=null&&l.set?i.position.set(r,s):(typeof i.x=="number"&&(i.x=r),typeof i.y=="number"&&(i.y=s)),typeof t.scale=="number"&&((c=i.scale)!=null&&c.set?i.scale.set(t.scale):i.scale&&(i.scale.x=t.scale,i.scale.y=t.scale));let o=t.anchor;if(o&&((p=i.anchor)!=null&&p.set)){let d=null;typeof window!="undefined"&&window.resolveAnchorVec2?d=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?d=o:Array.isArray(o)&&o.length===2&&(d={x:o[0],y:o[1]}),d&&typeof d.x=="number"&&typeof d.y=="number"&&i.anchor.set(d.x,d.y)}}function ds(i){if(typeof window=="undefined")return;let e=i==null?void 0:i.objects,t=ca(e),n=r=>{try{let s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return r;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?r.filter(c=>l[c]===s):r}catch{return r}};window.__editableObjectConfigs=e;let a=new Map;t.forEach(r=>a.set(r,[r])),window.__editableObjectInstances=a,window.refreshEditableConfigIndex=()=>ds(window.__editableConfig),window.getEditableObjectList=()=>{var r;return n(ca((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return ca((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,g,h;let s=(g=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,r))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return s;let l=window.__HANDLER_SCREEN_INDEX,c=(h=l==null?void 0:l.instanceToScreen)==null?void 0:h[r];return c&&c===o?s:null},window.getEditableEngineConfig=()=>{let r=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!r),!r)return null;if(r.engine&&r.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let s={...r.engine,objects:r.objects,scene:r.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return r}}function Xo(){if(typeof window=="undefined")return;let i=t=>{let n=String(t||"").trim();return n?/^(data:|blob:|https?:)/.test(n)||n.startsWith("/")?n:`/${n.replace(/^\.\//,"")}`:""},e=async(t,n)=>{var r,s,o;let a=i(n);if(a)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(Xe(),rr))]),p=Date.now(),d=/^(data:|blob:)/.test(a)?a:a+(a.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 h=window.gameObjectManager,f=(s=h==null?void 0:h.get)==null?void 0:s.call(h,t);if(f){let m=((o=f.getDisplayObject)==null?void 0:o.call(f))||f.pixiObject||f.pixi||f;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let n=Y();Array.isArray(n)&&n.length&&(window.__editableConfig=t,Ce(n,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let n=Y();Array.isArray(n)&&n.length&&(window.__editableConfig=t,Ce(n,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let n=window.__editableConfig;if(!(n!=null&&n.engine))return;let a=[];if(t.runtime)for(let[r,s]of Object.entries(t.runtime))a.push({path:`runtime.${r}`,value:s});if(t.assets)for(let[r,s]of Object.entries(t.assets))a.push({path:`assets.${r}`,value:s}),typeof s=="string"&&e(r,s);if(t.splash)for(let[r,s]of Object.entries(t.splash))a.push({path:`splash.${r}`,value:s});if(t.loading)for(let[r,s]of Object.entries(t.loading))a.push({path:`loading.${r}`,value:s});if(t.start)for(let[r,s]of Object.entries(t.start))a.push({path:`start.${r}`,value:s});a.length&&Ce(a,{silent:!0,persist:!0,emitEvent:!0})}}function Bn(i){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:n}=i;t&&(t.onObjectRebuildRequired=async(r,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${r} due to type change...`);let o=t.get(r),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);o?t.remove(r):l&&l.destroy();let d=window.gameApp,u=await Ae.create(r,s,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(r,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${r}`),g}),typeof window!="undefined"&&(Xo(),window.applyEditableObjectConfig=(r,s)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",r);try{let p=window.__editableConfig;(o=p==null?void 0:p.objects)!=null&&o.set&&(p.objects.set(r,s),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,r);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(s);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=ls(d);cs(u,s)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let a={async applyObjectConfig(r,s){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",r);let o=e();(p=o==null?void 0:o.objects)!=null&&p.set&&(o.objects.set(r,s),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,r);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(s);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=ls(l);cs(u,s)}let c=[r];n==null||n(r,s,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,ds(r))}};return a.rebuildIndexes(),a}K();var gs=Ve(require("lottie-web"),1);si(ai);typeof window!="undefined"&&!window.lottie&&(window.lottie=gs.default);var it=null,Jo=async()=>{if(!it){let i=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(i==null?void 0:i["handler.config"])||(i==null?void 0:i["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let n=atob(e.split(",")[1]);it=JSON.parse(n)}else it=JSON.parse(e);return it}catch(n){console.warn("[CONFIG] Failed to parse inline handler.config.json:",n)}it=await(await fetch("./handler.config.json")).json()}return it},ga,Ot,fs,at,pa,ua;function Zo(i){ga=i.initGame,Ot=i.CustomAssets,fs=i.updateScreenState,at=i.globalResponsiveMultipliers,pa=i.layout,ua=i.clearResponsiveElements}var Fn="web_embed",Mt="https://example.com",ps={profile_id:Fn},Pe=null,le=null,da={width:0,height:0},Qo=!0,el=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let i=await Jo();ps={...i.ids||{},profile_id:Fn},Mt=i.destination_url||((p=(c=i.export_profiles)==null?void 0:c[Fn])==null?void 0:p.destination_url)||Mt,Oe.init({ids:ps,profile:Fn,destinationUrl:Mt});let e=Oe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),le=la({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),us()},onRefresh:us});let g=le.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var v,x,w,E,C,S,O,B,k,L,I;let f=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=h.detail;if(da.width=b,da.height=y,fs(b,y),!(!f||!f.renderer)){m&&o(f,m);try{f.renderer.resize(b,y);let M=f.view;M&&(M.style.width="100%",M.style.height="100%",M.style.display="block")}catch(M){console.warn("[SCREEN] Error resizing renderer:",M);return}if(t&&m&&pa)try{let M=(v=window.__mainContainer)!=null?v:f.stage,D=(O=(S=(E=window.__tutorialLabel)!=null?E:(w=(x=m.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:w.call(x))!=null?S:(C=m.get("label_1"))==null?void 0:C.pixiObject)!=null?O:m.get("label_1"),j=m.get("background_1"),$=(I=(L=(k=window.__background)!=null?k:(B=j==null?void 0:j.getDisplayObject)==null?void 0:B.call(j))!=null?L:j==null?void 0:j.pixiObject)!=null?I:j;if(M){let A=M===f.stage;pa({mainContainer:M,label:D,background:$,backgroundTexture:($==null?void 0:$.texture)||null,app:f},t,0,da,m,{skipMainContainerTransform:A})}}catch(M){console.warn("[SCREEN] Error in layout:",M)}}})}let t=await be("scene.main");window.__editableConfig=t,s(),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 n=await ga(e,t,Mt,le);Pe=n.app;let a=n.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=a;try{window.__liveEditBridge=Bn({getConfig:()=>window.__editableConfig,gameObjectManager:a,assets:Ot})}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}`)),o(Pe,a);async function s(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,x=await fetch(v,{cache:"no-cache"});if(!x.ok)return null;let w=await x.text();try{return JSON.parse(w)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let f=h.screens;if(!f||typeof f!="object")return;let m={},b={};for(let[y,v]of Object.entries(f)){let x=v==null?void 0:v.source;if(typeof x!="string")continue;let w=await g(x),E=w==null?void 0:w.elements;if(!Array.isArray(E))continue;let C=E.map(S=>S==null?void 0:S.instance_id).filter(S=>typeof S=="string");m[y]=C;for(let S of C)b[S]||(b[S]=y)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,h){if(Qo){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${at.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((x,w)=>{if(x&&x.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let E=x.scale.x||1,C=x.scale.y||1;x.__originalScale||(x.__originalScale={x:E,y:C},console.log(`${v}[RESPONSIVE] Stored original scale for child[${w}]: ${E.toFixed(3)}, ${C.toFixed(3)}`));let S=x.__originalScale.x*at.scale,O=x.__originalScale.y*at.scale;typeof x.scale.set=="function"?x.scale.set(S,O):(x.scale.x=S,x.scale.y=O),console.log(`${v}[RESPONSIVE] Child[${w}] scale: ${E.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),m(x,y+1)}else x&&console.log(`${v}[RESPONSIVE] Child[${w}] has no scale (type: ${x.constructor.name})`)})};var f=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){at.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,f=window.gameObjectManager;h&&f?(o(h,f),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!f}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Oe.start()},us=async()=>{var e,t,n,a;console.log("[PREVIEW] Restarting game in 1 seconds...");let i=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(i){let r=((t=i.getDisplayObject)==null?void 0:t.call(i))||i;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((n=r.scale.x)!=null?n:1).toFixed(3)}, y: ${((a=r.scale.y)!=null?a:1).toFixed(3)}`)}if(le){le.notifyGameDestroyed();try{ua&&ua()}catch(r){console.warn("Failed to clear responsive elements",r)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let r=le.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),Pe){try{Pe.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}Pe=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof Ot.resetScene=="function"&&Ot.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{be("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=G(o)),ga(r,o,Mt).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Bn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Ot})}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)}};dn();K();var ce={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},hs=1.25,ms={fontFamily:"Inter, system-ui, sans-serif"};var Un=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=`
1488
+ `,this.setupEventListeners(e),e}setupEventListeners(e){var a,r,o,s,l,c,p,d,u,g;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",h=>{if(this.viewMode==="compare")return;let f=h.target.value;this.setDevice(f)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(h=>{h.addEventListener("click",()=>{let f=h.dataset.viewToggle;f&&this.setViewMode(f)})}),(a=e.querySelector("#rotate-btn"))==null||a.addEventListener("click",()=>this.toggleRotation()),(r=e.querySelector("#zoom-in-btn"))==null||r.addEventListener("click",()=>this.adjustUserZoom(.1)),(o=e.querySelector("#zoom-out-btn"))==null||o.addEventListener("click",()=>this.adjustUserZoom(-.1)),(s=e.querySelector("#refresh-btn"))==null||s.addEventListener("click",()=>this.refresh()),(l=e.querySelector("#console-toggle"))==null||l.addEventListener("click",()=>this.toggleConsole()),(c=e.querySelector("#console-close"))==null||c.addEventListener("click",()=>this.toggleConsole(!1)),(p=e.querySelector("#console-clear"))==null||p.addEventListener("click",()=>this.clearConsole()),(d=e.querySelector("#corner-zoom-in-btn"))==null||d.addEventListener("click",()=>this.adjustUserZoom(.1)),(u=e.querySelector("#corner-zoom-out-btn"))==null||u.addEventListener("click",()=>this.adjustUserZoom(-.1)),(g=e.querySelector("#corner-grab-btn"))==null||g.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)})}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"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.gameReady||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,n=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=n,this.gameContainer.style.width=t,this.gameContainer.style.height=n,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=n,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=n,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(),n=this.getFitBounds(),a=Math.max(0,n.width),r=Math.max(0,n.height);if(a<=0||r<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=a/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("#scene-tools-container"),t=this.container.querySelector("#nudge-panel-container");e&&e.children.length>0&&(e.style.position="absolute",e.style.left="50%",e.style.top="16px",e.style.transform="translateX(-50%)",e.style.zIndex="100"),t&&t.children.length>0&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,n;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(n=(t=this.options).onDeviceChange)==null||n.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 n=window.gameApp;if(!(n!=null&&n.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var n;let t=new WeakSet;try{return JSON.stringify(e,(a,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return"[Circular]";t.add(r)}return r},2)}catch{try{if(e&&((n=e.constructor)!=null&&n.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=console.log.bind(console),t=console.warn.bind(console),n=console.error.bind(console),a=console.info.bind(console),r=(o,...s)=>{let l=s.map(p=>typeof p=="object"?this.safeStringify(p):String(p)).join(" ");this.consoleMessages.push({type:o,message:l,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let c=this.container.querySelector("#console-badge");if(c){let p=this.consoleMessages.filter(d=>d.type==="error").length;c.textContent=p>0?`${p}!`:"0",c.classList.toggle("has-errors",p>0)}};console.log=(...o)=>{e(...o),r("log",...o)},console.warn=(...o)=>{t(...o),r("warn",...o)},console.error=(...o)=>{n(...o),r("error",...o)},console.info=(...o)=>{a(...o),r("info",...o)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let n=document.createElement("div");n.className=`console-msg type-${e.type}`;let a=e.timestamp.toLocaleTimeString();n.innerHTML=`<span class="time">${this.escapeHtml(a)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(n),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let n=t.dataset.viewport;if(!n)return;let a=this.comparePresets.find(d=>d.id===n);if(!a)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(n);return}t.classList.contains("is-active")||this.activateCompareViewport(n)}),this.compareViewports.set(n,{preset:a,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 n=this.container.querySelector("#rotate-btn");if(n&&(n.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 n=this.autoScale*this.userScaleMultiplier,a=this.activeCompareId;a&&a!==e&&this.captureCompareSnapshot(a),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:n}),(o=(r=this.options).onDeviceChange)==null||o.call(r,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,n=`${t.width}px`,a=`${t.height}px`;e.frame.style.width=n,e.frame.style.height=a,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 n=Math.max(0,t.clientWidth-24),a=Math.max(0,t.clientHeight-24);if(n<=0||a<=0)return;let r=n/e.preset.width,o=a/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 n=this.gameContainer.querySelector("canvas");if(!n)return;let a=t.canvas.getContext("2d");if(!a)return;let r=t.canvas.width,o=t.canvas.height,s=Math.min(r/n.width,o/n.height),l=n.width*s,c=n.height*s,p=(r-l)/2,d=(o-c)/2;a.clearRect(0,0,r,o),a.drawImage(n,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 la(i={}){let e=new Hn(i);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function ca(i){try{if(i&&typeof i.keys=="function")return Array.from(i.keys())}catch{}return[]}function lo(i){var e;return i?((e=i.getDisplayObject)==null?void 0:e.call(i))||i.pixiObject||i:null}function Ks(i,e){if(!i||!(e!=null&&e.interaction))return;let t=e.interaction,n=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);i.eventMode=n?"static":"none",i.interactive=n,n&&(i.cursor=t.draggable?"move":"pointer")}function co(i,e){var l,c,p;if(!i||!e)return;let t=e.transform||{};Ks(i,e);let n=t.position||{},a=t.offset||{},r=(typeof n.x=="number"?n.x:0)+(typeof a.x=="number"?a.x:0),o=(typeof n.y=="number"?n.y:0)+(typeof a.y=="number"?a.y:0);(l=i.position)!=null&&l.set?i.position.set(r,o):(typeof i.x=="number"&&(i.x=r),typeof i.y=="number"&&(i.y=o)),typeof t.scale=="number"&&((c=i.scale)!=null&&c.set?i.scale.set(t.scale):i.scale&&(i.scale.x=t.scale,i.scale.y=t.scale));let s=t.anchor;if(s&&((p=i.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"&&i.anchor.set(d.x,d.y)}}function po(i){if(typeof window=="undefined")return;let e=i==null?void 0:i.objects,t=ca(e),n=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 a=new Map;t.forEach(r=>a.set(r,[r])),window.__editableObjectInstances=a,window.refreshEditableConfigIndex=()=>po(window.__editableConfig),window.getEditableObjectList=()=>{var r;return n(ca((r=window.__editableConfig)==null?void 0:r.objects))},window.getEditableObjectListAll=()=>{var r;return ca((r=window.__editableConfig)==null?void 0:r.objects)},window.getEditableObjectConfig=r=>{var p,d,u,g,h;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=(h=l==null?void 0:l.instanceToScreen)==null?void 0:h[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 Xs(){if(typeof window=="undefined")return;let i=t=>{let n=String(t||"").trim();return n?/^(data:|blob:|https?:)/.test(n)||n.startsWith("/")?n:`/${n.replace(/^\.\//,"")}`:""},e=async(t,n)=>{var r,o,s;let a=i(n);if(a)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(Xe(),rr))]),p=Date.now(),d=/^(data:|blob:)/.test(a)?a:a+(a.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 h=window.gameObjectManager,f=(o=h==null?void 0:h.get)==null?void 0:o.call(h,t);if(f){let m=((s=f.getDisplayObject)==null?void 0:s.call(f))||f.pixiObject||f.pixi||f;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let n=Y();Array.isArray(n)&&n.length&&(window.__editableConfig=t,Ce(n,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let n=Y();Array.isArray(n)&&n.length&&(window.__editableConfig=t,Ce(n,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let n=window.__editableConfig;if(!(n!=null&&n.engine))return;let a=[];if(t.runtime)for(let[r,o]of Object.entries(t.runtime))a.push({path:`runtime.${r}`,value:o});if(t.assets)for(let[r,o]of Object.entries(t.assets))a.push({path:`assets.${r}`,value:o}),typeof o=="string"&&e(r,o);if(t.splash)for(let[r,o]of Object.entries(t.splash))a.push({path:`splash.${r}`,value:o});if(t.loading)for(let[r,o]of Object.entries(t.loading))a.push({path:`loading.${r}`,value:o});if(t.start)for(let[r,o]of Object.entries(t.start))a.push({path:`start.${r}`,value:o});a.length&&Ce(a,{silent:!0,persist:!0,emitEvent:!0})}}function Bn(i){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:n}=i;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 Ae.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"&&(Xs(),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=lo(d);co(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let a={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=lo(l);co(u,o)}let c=[r];n==null||n(r,o,c)},rebuildIndexes(){let r=e();typeof window!="undefined"&&(window.__editableConfig=r,po(r))}};return a.rebuildIndexes(),a}K();var fo=Ve(require("lottie-web"),1);oi(ai);typeof window!="undefined"&&!window.lottie&&(window.lottie=fo.default);var it=null,Js=async()=>{if(!it){let i=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(i==null?void 0:i["handler.config"])||(i==null?void 0:i["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let n=atob(e.split(",")[1]);it=JSON.parse(n)}else it=JSON.parse(e);return it}catch(n){console.warn("[CONFIG] Failed to parse inline handler.config.json:",n)}it=await(await fetch("./handler.config.json")).json()}return it},ga,Mt,ho,at,pa,ua;function Zs(i){ga=i.initGame,Mt=i.CustomAssets,ho=i.updateScreenState,at=i.globalResponsiveMultipliers,pa=i.layout,ua=i.clearResponsiveElements}var Fn="web_embed",Ot="https://example.com",uo={profile_id:Fn},ke=null,le=null,da={width:0,height:0},Qs=!0,el=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let i=await Js();uo={...i.ids||{},profile_id:Fn},Ot=i.destination_url||((p=(c=i.export_profiles)==null?void 0:c[Fn])==null?void 0:p.destination_url)||Ot,Me.init({ids:uo,profile:Fn,destinationUrl:Ot});let e=Me.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),le=la({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),go()},onRefresh:go});let g=le.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var v,x,w,E,C,S,M,B,P,L,I;let f=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=h.detail;if(da.width=b,da.height=y,ho(b,y),!(!f||!f.renderer)){m&&s(f,m);try{f.renderer.resize(b,y);let O=f.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&&pa)try{let O=(v=window.__mainContainer)!=null?v:f.stage,D=(M=(S=(E=window.__tutorialLabel)!=null?E:(w=(x=m.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:w.call(x))!=null?S:(C=m.get("label_1"))==null?void 0:C.pixiObject)!=null?M:m.get("label_1"),j=m.get("background_1"),$=(I=(L=(P=window.__background)!=null?P:(B=j==null?void 0:j.getDisplayObject)==null?void 0:B.call(j))!=null?L:j==null?void 0:j.pixiObject)!=null?I:j;if(O){let A=O===f.stage;pa({mainContainer:O,label:D,background:$,backgroundTexture:($==null?void 0:$.texture)||null,app:f},t,0,da,m,{skipMainContainerTransform:A})}}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 n=await ga(e,t,Ot,le);ke=n.app;let a=n.gameObjectManager;window.gameApp=ke,window.gameObjectManager=a;try{window.__liveEditBridge=Bn({getConfig:()=>window.__editableConfig,gameObjectManager:a,assets:Mt})}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(ke,a);async function o(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,x=await fetch(v,{cache:"no-cache"});if(!x.ok)return null;let w=await x.text();try{return JSON.parse(w)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let f=h.screens;if(!f||typeof f!="object")return;let m={},b={};for(let[y,v]of Object.entries(f)){let x=v==null?void 0:v.source;if(typeof x!="string")continue;let w=await g(x),E=w==null?void 0:w.elements;if(!Array.isArray(E))continue;let C=E.map(S=>S==null?void 0:S.instance_id).filter(S=>typeof S=="string");m[y]=C;for(let S of C)b[S]||(b[S]=y)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function s(g,h){if(Qs){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 m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((x,w)=>{if(x&&x.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let E=x.scale.x||1,C=x.scale.y||1;x.__originalScale||(x.__originalScale={x:E,y:C},console.log(`${v}[RESPONSIVE] Stored original scale for child[${w}]: ${E.toFixed(3)}, ${C.toFixed(3)}`));let S=x.__originalScale.x*at.scale,M=x.__originalScale.y*at.scale;typeof x.scale.set=="function"?x.scale.set(S,M):(x.scale.x=S,x.scale.y=M),console.log(`${v}[RESPONSIVE] Child[${w}] scale: ${E.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),m(x,y+1)}else x&&console.log(`${v}[RESPONSIVE] Child[${w}] has no scale (type: ${x.constructor.name})`)})};var f=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){at.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,f=window.gameObjectManager;h&&f?(s(h,f),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!f}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Me.start()},go=async()=>{var e,t,n,a;console.log("[PREVIEW] Restarting game in 1 seconds...");let i=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(i){let r=((t=i.getDisplayObject)==null?void 0:t.call(i))||i;r&&r.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((n=r.scale.x)!=null?n:1).toFixed(3)}, y: ${((a=r.scale.y)!=null?a:1).toFixed(3)}`)}if(le){le.notifyGameDestroyed();try{ua&&ua()}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()),ke){try{ke.destroy(!0,{children:!0,texture:!1})}catch(s){console.warn("[PREVIEW] Destroy warning:",s)}ke=null}window.gameApp=null,window.gameObjectManager=null,r&&(r.innerHTML="");try{typeof Mt.resetScene=="function"&&Mt.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{be("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=G(s)),ga(r,s,Ot).then(l=>{ke=l.app,window.gameApp=ke,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Bn({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Mt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}le&&le.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Me.start()}catch{}})})},100)},1e3)}};dn();K();var ce={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},mo=1.25,bo={fontFamily:"Inter, system-ui, sans-serif"};var Un=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=`
1489
1489
  position: fixed;
1490
1490
  inset: 0;
1491
1491
  display: flex;
@@ -1520,17 +1520,17 @@ Style guidelines: ${n.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
1520
1520
  justify-content: space-between;
1521
1521
  align-items: flex-end;
1522
1522
  margin-bottom: 8px;
1523
- `;let s=document.createElement("span");s.style.cssText=`
1523
+ `;let o=document.createElement("span");o.style.cssText=`
1524
1524
  font-size: 12px;
1525
1525
  font-weight: 900;
1526
1526
  letter-spacing: 0.15em;
1527
1527
  color: ${ce.ink};
1528
- `,s.innerHTML='LOADING<span class="loading-dots" style="animation: pulse 1.5s infinite;">..</span>',this.progressText=document.createElement("span"),this.progressText.style.cssText=`
1528
+ `,o.innerHTML='LOADING<span class="loading-dots" style="animation: pulse 1.5s infinite;">..</span>',this.progressText=document.createElement("span"),this.progressText.style.cssText=`
1529
1529
  font-size: 10px;
1530
1530
  font-family: monospace;
1531
1531
  font-weight: bold;
1532
1532
  color: ${ce.primaryAccent};
1533
- `,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,r.appendChild(s),r.appendChild(this.progressText);let o=document.createElement("div");o.style.cssText=`
1533
+ `,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,r.appendChild(o),r.appendChild(this.progressText);let s=document.createElement("div");s.style.cssText=`
1534
1534
  height: 4px;
1535
1535
  width: 100%;
1536
1536
  background-color: #E0DDD8;
@@ -1553,7 +1553,7 @@ Style guidelines: ${n.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
1553
1553
  width: 50%;
1554
1554
  filter: blur(4px);
1555
1555
  animation: shimmer 2s infinite;
1556
- `,this.progressBar.appendChild(l),o.appendChild(this.progressBar);let c=document.createElement("div");c.style.cssText=`
1556
+ `,this.progressBar.appendChild(l),s.appendChild(this.progressBar);let c=document.createElement("div");c.style.cssText=`
1557
1557
  display: flex;
1558
1558
  justify-content: space-between;
1559
1559
  width: 100%;
@@ -1564,7 +1564,7 @@ Style guidelines: ${n.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
1564
1564
  width: 1.5px;
1565
1565
  background-color: black;
1566
1566
  height: ${u%4===0?"6px":"2px"};
1567
- `,c.appendChild(g)}a.appendChild(r),a.appendChild(o),a.appendChild(c);let p=document.createElement("div");return p.id="handler-load-centered",p.style.cssText=`
1567
+ `,c.appendChild(g)}a.appendChild(r),a.appendChild(s),a.appendChild(c);let p=document.createElement("div");return p.id="handler-load-centered",p.style.cssText=`
1568
1568
  position: absolute;
1569
1569
  top: 48px;
1570
1570
  width: 600px;
@@ -1684,7 +1684,7 @@ Style guidelines: ${n.summary}`;this.promptInput.value=a,this.currentPrompt=a}}c
1684
1684
  0%, 100% { opacity: 1; }
1685
1685
  50% { opacity: 0.3; }
1686
1686
  }
1687
- `,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 fa=Ra.version,tl=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);ja();var As={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"},Ss=Math.random().toString(36).slice(2),ot=null,rt={...As},Cs="web_embed",ya={},jt,ha=!1,It=!1,Dt=!1,Ls=!1,Ea=1,qn=0,Yn=!1,ve=!1,st="",lt=Math.floor(window.innerWidth),ct=Math.floor(window.innerHeight),va=lt>ct,xe=!1,Rt=!1,bs=!1,ys=!1,ma=!1,Vn=null,Fe=null,xa=!1,wa=!1,Gn=new Map;function Ts(){if(!Fe)return null;let i=Date.now()-Fe;return!Number.isFinite(i)||i<0?null:i}function ba(i){if(xa)return;let e=Ts();e!==null&&(xa=!0,T("session_time",{duration_ms:e,reason:i}))}function vs(){if(ot)return ot;let i=document.createElement("div");return i.id="handler-root",i.setAttribute("data-handler-root","true"),document.body.appendChild(i),ot=i,i}function Wn(i){switch(i){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return i}}function _s(i,e){return{event_name:i,ts:Date.now(),session_id:Ss,deployment_id:rt.deployment_id,variant_id:rt.variant_id,export_profile_id:rt.profile_id,instance_id:rt.instance_id||"default",env:Cs==="mraid"?"mraid":"web",attribution:jt,payload:e}}function T(i,e){let t=Wn(i),n=_s(t,e);ti(n,!!ya.analytics),Ft(t,n),t!==i&&Ft(i,n)}function $t(){Vn&&(Vn(lt,ct),Vn=null)}function dt(i){Ea=i,T("volume",i)}function pt(i){i&&(Ls=!0),!Dt&&(Dt=!0,T("pause"),dt(0))}function zt(i){!i&&Ls||Dt&&(Dt=!1,T("resume"),dt(Ea))}function ke(i,e){lt=Math.floor(i||window.innerWidth),ct=Math.floor(e||window.innerHeight),va=lt>ct,T("resize",{width:lt,height:ct})}function nl(){if(Wa())try{let i=mraid.getMaxSize();ke(i.width,i.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?zt():pt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();ke(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();dt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&dt(t>0?1:0)}),mraid.addEventListener("error",(t,n)=>{console.warn("mraid error:",t,"action:",n)}),Yn=!0,mraid.isViewable()&&mraid.getState()!=="hidden")xe=!0,T("boot"),T("view"),T("ready"),ve=!0,$t();else{let t=()=>{xe=!0,T("boot"),T("view"),T("ready"),ve=!0,$t()};mraid.addEventListener("ready",t)}}catch(i){console.warn("MRAID hook skipped",i)}}function il(){if(Ya())try{let i=dapi.getScreenSize();ke(i.width,i.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?zt():pt()}),dapi.addEventListener("adResized",t=>{let n=dapi.getScreenSize();ke(t.width||n.width,t.height||n.height)});let e=dapi.getAudioVolume();if(dt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>dt(t?1:0)),Yn=!0,dapi.isViewable())xe=!0,T("boot"),T("view"),T("ready"),ve=!0,$t();else{let t=()=>{xe=!0,T("boot"),T("view"),T("ready"),ve=!0,$t()};dapi.addEventListener("ready",t)}}catch(i){console.warn("DAPI hook skipped",i)}}function xs(){let i=()=>{xe||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(xe=!0,T("boot"),T("view"),T("ready"),ve=!0,$t(),Rt&&(Rt=!1,ne.start()))};window.addEventListener("resize",()=>ke()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(zt(),i()):pt()}),document.readyState==="complete"||document.readyState==="interactive"?i():window.addEventListener("load",i),Yn=!0}function al(){let i=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(bs=!0),!(bs&&e instanceof MouseEvent)&&(qn+=1,wa||(wa=!0,T("first_interaction",{count:qn})),T("interaction",qn))};document.addEventListener("mousedown",i),document.addEventListener("touchstart",i)}function ws(i){var n,a,r,s,o,l,c,p,d,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(n=window.ExitApi)==null||n.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(i||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ke())(r=(a=window.TJ_API)==null?void 0:a.click)==null||r.call(a);else if(Ka())(o=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||o.call(s);else if(Qa())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Za())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(f){console.warn("Smadex redirect failed",f)}else if(Xa()){let f=window.ExitApi;f&&typeof f.exit=="function"?f.exit(i||st||""):i&&window.open(i)}else Ye()?(u=window.install)==null||u.call(window):Ja()?(g=window.openAppStore)==null||g.call(window):ni()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):i&&window.open(i)}function rl(){let i=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let n=new Image;n.src=t};if(i==="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 n=()=>e(t.complete);X("complete",n),Bt("engagement",a=>{var r;((r=a==null?void 0:a.payload)==null?void 0:r.count)>3&&n()}),X("cta_click",()=>e(t.click))}else if(i==="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(n=>setTimeout(()=>e(t[`Spent_${n}_Seconds`]),n*1e3))})}}function sl(){if(!Ke())return;let i=window.TJ_API;i&&i.setPlayableAPI&&i.setPlayableAPI({skipAd:()=>{try{ne.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Es(){var e,t,n;let i=window.TJ_API;(e=i==null?void 0:i.objectiveComplete)==null||e.call(i),(t=i==null?void 0:i.playableFinished)==null||t.call(i),(n=i==null?void 0:i.gameplayFinished)==null||n.call(i)}function ol(){Ye()&&(window.mintGameStart=()=>{zt(!0),ke()},window.mintGameClose=()=>{pt(!0)})}function ll(){if(!ii())return;let i=window.NUC;!i||!i.trigger||(ne.on("cta_click",()=>{var e,t;return(t=(e=i.trigger).convert)==null?void 0:t.call(e,st)}),ne.on("complete",()=>{var e,t;return(t=(e=i.trigger).tryAgain)==null?void 0:t.call(e)}))}var ne={init(i={},e){var t;if(Cs=i.profile||"web_embed",ya=i.consent||{},rt={...As,...i.ids||{}},ot=i.rootEl||ot,jt=void 0,Ta((t=i.telemetry)!=null&&t.endpoint?i.telemetry:null),Fe=null,xa=!1,wa=!1,Gn.clear(),st=i.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Vn=e),T("init"),document.body.oncontextmenu=()=>!1,vs(),dl(ot),er(),nl(),il(),!Yn){if(document.readyState==="complete")xs();else if(!ys){ys=!0;let n=()=>{xs(),window.removeEventListener("load",n),document.removeEventListener("DOMContentLoaded",n)};window.addEventListener("load",n),document.addEventListener("DOMContentLoaded",n)}}al(),rl(),sl(),ol(),ll(),console.log(`%c @handler/playable-sdk %c v${fa} `,"background: #007acc; color: #fff; font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: #e1e4e8; color: #333; font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),xe&&!ve&&(T("boot"),T("view"),T("ready"),Rt&&(Rt=!1,ne.start()),ve=!0),ve=xe},getRoot(){return vs()},get version(){return fa},get maxWidth(){return lt},get maxHeight(){return ct},get isLandscape(){return va},get isReady(){return ve},get isStarted(){return ha},get isPaused(){return Dt},get isFinished(){return It},get volume(){return Ea},get interactions(){return qn},on(i,e){Bt(Wn(i),e)},off(i,e){ei(Wn(i),e)},start(){var i,e;if(!ha){if(!xe){Rt=!0;return}if(ha=!0,Fe||(Fe=Date.now()),T("start"),ke(),Ye())pt(),(i=window.gameReady)==null||i.call(window);else if(Ke()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:va?"landscape":"portrait",buildID:fa})}}},finish(){var i,e;It||(It=!0,T("complete"),ba("complete"),Ye()?(i=window.gameEnd)==null||i.call(window):ni()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ke()&&Es())},install(i){if(!It){It=!0,Ke()?(Es(),setTimeout(()=>ne.install(i),300)):(T("complete"),setTimeout(()=>ne.install(i),0));return}ma||(ma=!0,setTimeout(()=>ma=!1,500),T("cta_click"),T("conversion"),ba("cta"),ws(i||st))},emit(i,e){let t=Wn(i);if(!tl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${i} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let n=_s(t,e);ti(n,!!ya.analytics),Ft(t,n)},gameStart(){ne.start()},gameEnd(){ne.finish()},ctaClick(i,e){T("cta_click",{url:i||st,manual:!0}),(e==null?void 0:e.open)!==!1&&ws(i||st)},ctaShow(i){T("cta_show",i)},ctaDismiss(i){T("cta_dismiss",i)},getGameTimeMs(){return Ts()},endSession(i="manual"){ba(i)},setAttribution(i){jt=i},abTest(i,e){if(!i)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(cl(`${Ss}:${i}`))%e.length,n=e[t];return jt={...jt||{},experiment_id:i},rt.variant_id=n,T("ab_assign",{experiment_id:i,variant_id:n}),n},levelStart(i,e){Fe||(Fe=Date.now()),T("level_start",{level_id:i,...e})},levelComplete(i,e){T("level_complete",{level_id:i,...e})},levelFail(i,e){T("level_fail",{level_id:i,...e})},checkpoint(i,e){T("checkpoint",{checkpoint_id:i,...e})},reward(i,e){T("reward",{reward_id:i,...e})},tutorialStart(i,e){T("tutorial_start",{step_id:i,...e})},tutorialComplete(i,e){T("tutorial_complete",{step_id:i,...e})},tutorialSkip(i,e){T("tutorial_skip",{step_id:i,...e})},timerStart(i){i&&Gn.set(i,Date.now())},timerEnd(i,e="custom",t){if(!i)return;let n=Gn.get(i);if(!n)return;Gn.delete(i);let a=Date.now()-n;if(!(!Number.isFinite(a)||a<0)){if(e==="custom"){T("engagement",{action:"timer",key:i,duration_ms:a,...t});return}T(e,{key:i,duration_ms:a,...t})}},fps(i,e){T("fps",{value:i,...e})},memory(i,e){T("memory",{bytes:i,...e})},assetLoadStart(i,e){T("asset_load_start",{asset_id:i,...e})},assetLoadComplete(i,e){T("asset_load_complete",{asset_id:i,...e})},reportError(i,e,t){T("error",{code:i,message:e,...t})},retry(){var i,e,t;if(Ye())(i=window.gameRetry)==null||i.call(window);else if(ii()){let n=window.NUC;(t=(e=n==null?void 0:n.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}T("engagement",{action:"retry"})},pause(){pt(!0)},resume(){zt(!0)},resize(i,e){ke(i,e)}},Oe=ne;function cl(i){let e=2166136261;for(let t=0;t<i.length;t++)e^=i.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function dl(i){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
1687
+ `,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 fa=Ra.version,tl=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);ja();var So={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"},Co=Math.random().toString(36).slice(2),st=null,rt={...So},Lo="web_embed",ya={},jt,ha=!1,It=!1,Dt=!1,To=!1,Ea=1,qn=0,Yn=!1,ve=!1,ot="",lt=Math.floor(window.innerWidth),ct=Math.floor(window.innerHeight),va=lt>ct,xe=!1,Rt=!1,yo=!1,vo=!1,ma=!1,Vn=null,Fe=null,xa=!1,wa=!1,Gn=new Map;function _o(){if(!Fe)return null;let i=Date.now()-Fe;return!Number.isFinite(i)||i<0?null:i}function ba(i){if(xa)return;let e=_o();e!==null&&(xa=!0,T("session_time",{duration_ms:e,reason:i}))}function xo(){if(st)return st;let i=document.createElement("div");return i.id="handler-root",i.setAttribute("data-handler-root","true"),document.body.appendChild(i),st=i,i}function Wn(i){switch(i){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return i}}function ko(i,e){return{event_name:i,ts:Date.now(),session_id:Co,deployment_id:rt.deployment_id,variant_id:rt.variant_id,export_profile_id:rt.profile_id,instance_id:rt.instance_id||"default",env:Lo==="mraid"?"mraid":"web",attribution:jt,payload:e}}function T(i,e){let t=Wn(i),n=ko(t,e);ti(n,!!ya.analytics),Ft(t,n),t!==i&&Ft(i,n)}function $t(){Vn&&(Vn(lt,ct),Vn=null)}function dt(i){Ea=i,T("volume",i)}function pt(i){i&&(To=!0),!Dt&&(Dt=!0,T("pause"),dt(0))}function zt(i){!i&&To||Dt&&(Dt=!1,T("resume"),dt(Ea))}function Pe(i,e){lt=Math.floor(i||window.innerWidth),ct=Math.floor(e||window.innerHeight),va=lt>ct,T("resize",{width:lt,height:ct})}function nl(){if(Wa())try{let i=mraid.getMaxSize();Pe(i.width,i.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?zt():pt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Pe(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,n)=>{console.warn("mraid error:",t,"action:",n)}),Yn=!0,mraid.isViewable()&&mraid.getState()!=="hidden")xe=!0,T("boot"),T("view"),T("ready"),ve=!0,$t();else{let t=()=>{xe=!0,T("boot"),T("view"),T("ready"),ve=!0,$t()};mraid.addEventListener("ready",t)}}catch(i){console.warn("MRAID hook skipped",i)}}function il(){if(Ya())try{let i=dapi.getScreenSize();Pe(i.width,i.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?zt():pt()}),dapi.addEventListener("adResized",t=>{let n=dapi.getScreenSize();Pe(t.width||n.width,t.height||n.height)});let e=dapi.getAudioVolume();if(dt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>dt(t?1:0)),Yn=!0,dapi.isViewable())xe=!0,T("boot"),T("view"),T("ready"),ve=!0,$t();else{let t=()=>{xe=!0,T("boot"),T("view"),T("ready"),ve=!0,$t()};dapi.addEventListener("ready",t)}}catch(i){console.warn("DAPI hook skipped",i)}}function wo(){let i=()=>{xe||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(xe=!0,T("boot"),T("view"),T("ready"),ve=!0,$t(),Rt&&(Rt=!1,ne.start()))};window.addEventListener("resize",()=>Pe()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(zt(),i()):pt()}),document.readyState==="complete"||document.readyState==="interactive"?i():window.addEventListener("load",i),Yn=!0}function al(){let i=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(yo=!0),!(yo&&e instanceof MouseEvent)&&(qn+=1,wa||(wa=!0,T("first_interaction",{count:qn})),T("interaction",qn))};document.addEventListener("mousedown",i),document.addEventListener("touchstart",i)}function Eo(i){var n,a,r,o,s,l,c,p,d,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(n=window.ExitApi)==null||n.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(i||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ke())(r=(a=window.TJ_API)==null?void 0:a.click)==null||r.call(a);else if(Ka())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if(Qa())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Za())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(f){console.warn("Smadex redirect failed",f)}else if(Xa()){let f=window.ExitApi;f&&typeof f.exit=="function"?f.exit(i||ot||""):i&&window.open(i)}else Ye()?(u=window.install)==null||u.call(window):Ja()?(g=window.openAppStore)==null||g.call(window):ni()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):i&&window.open(i)}function rl(){let i=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let n=new Image;n.src=t};if(i==="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 n=()=>e(t.complete);X("complete",n),Bt("engagement",a=>{var r;((r=a==null?void 0:a.payload)==null?void 0:r.count)>3&&n()}),X("cta_click",()=>e(t.click))}else if(i==="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(n=>setTimeout(()=>e(t[`Spent_${n}_Seconds`]),n*1e3))})}}function ol(){if(!Ke())return;let i=window.TJ_API;i&&i.setPlayableAPI&&i.setPlayableAPI({skipAd:()=>{try{ne.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Ao(){var e,t,n;let i=window.TJ_API;(e=i==null?void 0:i.objectiveComplete)==null||e.call(i),(t=i==null?void 0:i.playableFinished)==null||t.call(i),(n=i==null?void 0:i.gameplayFinished)==null||n.call(i)}function sl(){Ye()&&(window.mintGameStart=()=>{zt(!0),Pe()},window.mintGameClose=()=>{pt(!0)})}function ll(){if(!ii())return;let i=window.NUC;!i||!i.trigger||(ne.on("cta_click",()=>{var e,t;return(t=(e=i.trigger).convert)==null?void 0:t.call(e,ot)}),ne.on("complete",()=>{var e,t;return(t=(e=i.trigger).tryAgain)==null?void 0:t.call(e)}))}var ne={init(i={},e){var t;if(Lo=i.profile||"web_embed",ya=i.consent||{},rt={...So,...i.ids||{}},st=i.rootEl||st,jt=void 0,Ta((t=i.telemetry)!=null&&t.endpoint?i.telemetry:null),Fe=null,xa=!1,wa=!1,Gn.clear(),ot=i.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Vn=e),T("init"),document.body.oncontextmenu=()=>!1,xo(),dl(st),er(),nl(),il(),!Yn){if(document.readyState==="complete")wo();else if(!vo){vo=!0;let n=()=>{wo(),window.removeEventListener("load",n),document.removeEventListener("DOMContentLoaded",n)};window.addEventListener("load",n),document.addEventListener("DOMContentLoaded",n)}}al(),rl(),ol(),sl(),ll(),console.log(`%c @handler/playable-sdk %c v${fa} `,"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;"),xe&&!ve&&(T("boot"),T("view"),T("ready"),Rt&&(Rt=!1,ne.start()),ve=!0),ve=xe},getRoot(){return xo()},get version(){return fa},get maxWidth(){return lt},get maxHeight(){return ct},get isLandscape(){return va},get isReady(){return ve},get isStarted(){return ha},get isPaused(){return Dt},get isFinished(){return It},get volume(){return Ea},get interactions(){return qn},on(i,e){Bt(Wn(i),e)},off(i,e){ei(Wn(i),e)},start(){var i,e;if(!ha){if(!xe){Rt=!0;return}if(ha=!0,Fe||(Fe=Date.now()),T("start"),Pe(),Ye())pt(),(i=window.gameReady)==null||i.call(window);else if(Ke()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:va?"landscape":"portrait",buildID:fa})}}},finish(){var i,e;It||(It=!0,T("complete"),ba("complete"),Ye()?(i=window.gameEnd)==null||i.call(window):ni()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ke()&&Ao())},install(i){if(!It){It=!0,Ke()?(Ao(),setTimeout(()=>ne.install(i),300)):(T("complete"),setTimeout(()=>ne.install(i),0));return}ma||(ma=!0,setTimeout(()=>ma=!1,500),T("cta_click"),T("conversion"),ba("cta"),Eo(i||ot))},emit(i,e){let t=Wn(i);if(!tl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${i} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let n=ko(t,e);ti(n,!!ya.analytics),Ft(t,n)},gameStart(){ne.start()},gameEnd(){ne.finish()},ctaClick(i,e){T("cta_click",{url:i||ot,manual:!0}),(e==null?void 0:e.open)!==!1&&Eo(i||ot)},ctaShow(i){T("cta_show",i)},ctaDismiss(i){T("cta_dismiss",i)},getGameTimeMs(){return _o()},endSession(i="manual"){ba(i)},setAttribution(i){jt=i},abTest(i,e){if(!i)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(cl(`${Co}:${i}`))%e.length,n=e[t];return jt={...jt||{},experiment_id:i},rt.variant_id=n,T("ab_assign",{experiment_id:i,variant_id:n}),n},levelStart(i,e){Fe||(Fe=Date.now()),T("level_start",{level_id:i,...e})},levelComplete(i,e){T("level_complete",{level_id:i,...e})},levelFail(i,e){T("level_fail",{level_id:i,...e})},checkpoint(i,e){T("checkpoint",{checkpoint_id:i,...e})},reward(i,e){T("reward",{reward_id:i,...e})},tutorialStart(i,e){T("tutorial_start",{step_id:i,...e})},tutorialComplete(i,e){T("tutorial_complete",{step_id:i,...e})},tutorialSkip(i,e){T("tutorial_skip",{step_id:i,...e})},timerStart(i){i&&Gn.set(i,Date.now())},timerEnd(i,e="custom",t){if(!i)return;let n=Gn.get(i);if(!n)return;Gn.delete(i);let a=Date.now()-n;if(!(!Number.isFinite(a)||a<0)){if(e==="custom"){T("engagement",{action:"timer",key:i,duration_ms:a,...t});return}T(e,{key:i,duration_ms:a,...t})}},fps(i,e){T("fps",{value:i,...e})},memory(i,e){T("memory",{bytes:i,...e})},assetLoadStart(i,e){T("asset_load_start",{asset_id:i,...e})},assetLoadComplete(i,e){T("asset_load_complete",{asset_id:i,...e})},reportError(i,e,t){T("error",{code:i,message:e,...t})},retry(){var i,e,t;if(Ye())(i=window.gameRetry)==null||i.call(window);else if(ii()){let n=window.NUC;(t=(e=n==null?void 0:n.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}T("engagement",{action:"retry"})},pause(){pt(!0)},resume(){zt(!0)},resize(i,e){Pe(i,e)}},Me=ne;function cl(i){let e=2166136261;for(let t=0;t<i.length;t++)e^=i.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function dl(i){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
1688
1688
  (function(){
1689
1689
  var events = ['touchstart','touchend','mousedown','keydown'];
1690
1690
  function unlock(){