handler-playable-sdk 0.5.34 → 0.5.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var Bo=Object.create;var Ut=Object.defineProperty;var Uo=Object.getOwnPropertyDescriptor;var Go=Object.getOwnPropertyNames;var qo=Object.getPrototypeOf,Vo=Object.prototype.hasOwnProperty;var de=(r,e)=>()=>(r&&(e=r(r=0)),e);var ft=(r,e)=>{for(var t in e)Ut(r,t,{get:e[t],enumerable:!0})},Ia=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Go(e))!Vo.call(r,n)&&n!==t&&Ut(r,n,{get:()=>e[n],enumerable:!(i=Uo(e,n))||i.enumerable});return r};var qe=(r,e,t)=>(t=r!=null?Bo(qo(r)):{},Ia(e||!r||!r.__esModule?Ut(t,"default",{value:r,enumerable:!0}):t,r)),Wo=r=>Ia(Ut({},"__esModule",{value:!0}),r);var pe,hn=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 ts(){var r,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(r=document.querySelector("script"))==null?void 0:r.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),i=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(t&&!i)}catch{return!1}}async function is(){try{if(typeof window!="undefined"){let r=await fetch("./build-settings.json");if(r.ok){let e=await r.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function ns(){try{if(typeof window!="undefined"){let r=new XMLHttpRequest;if(r.open("GET","./build-settings.json",!1),r.send(),r.status===200&&r.responseText){let e=JSON.parse(r.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function as(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${N}`),Object.keys(ue).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(ue)),ue;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),ue={...window.INLINE_ASSETS},ue;if(!(N==="publish"&&oe!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ue;if(!fn){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),fn=(async()=>{try{try{let a=await import(e+"?t="+Date.now());if(a.INLINE_ASSETS)return console.log("[AssetLoader] Loaded INLINE_ASSETS via ES module:",Object.keys(a.INLINE_ASSETS)),a.INLINE_ASSETS}catch(a){console.warn("[AssetLoader] ES module import failed, trying text parse:",a)}let t=await fetch(e);if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);let i=await t.text();console.log("[AssetLoader] Received JS code, length:",i.length);let n=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(n)try{let a=n[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let o=new Function("return "+a)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(o)),o}catch(a){return console.warn("[AssetLoader] Failed to parse inline assets:",a),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ue=await fn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ue)),ue}function mn(r){return r===null||typeof r!="object"||(Object.freeze(r),Object.values(r).forEach(e=>mn(e))),r}function rs(r=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=r,i.height=e;let n=i.getContext("2d");return n.fillStyle=`#${t.toString(16).padStart(6,"0")}`,n.fillRect(0,0,r,e),n.strokeStyle="#000",n.strokeRect(0,0,r,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",r/2,e/2),ge.Texture.from(i)}function bn(r,e){ur.set(r,e)}var ge,dr,pr,Ie,N,oe,Ee,ue,fn,ur,je,Wt=de(()=>{"use strict";ge=require("pixi.js");hn();dr=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",pr=ts(),Ie=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,N=pr?"publish":dr,oe=Ie==null?void 0:Ie.assetsInlined;Ie!=null&&Ie.buildMode&&(N=Ie.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${N}`));Ee=ns();Ee!=null&&Ee.buildMode&&(N=Ee.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${N}`));(Ee==null?void 0:Ee.assetsInlined)!==void 0&&(oe=Ee.assetsInlined);is().then(r=>{r!=null&&r.buildMode&&r.buildMode!==N&&(N=r.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${N}`)),(r==null?void 0:r.assetsInlined)!==void 0&&(oe=r.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${dr}, Runtime: ${pr?"publish":"dev"}, Effective: ${N}`);ue={},fn=null;ur=new Map;je=class{static async load(e,t,i,n){let a=`${e}:${t.path}`,o=pe.get(a);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 as(),l=s[e];if(!l&&n&&(l=s[n],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${n}`)),!l&&t.path){let d=t.path.split("/");if(d.length>=2){let u=d[d.length-1].split(".")[0];s[u]&&(l=s[u],console.log(`[AssetLoader] Found inline data for ${e} using assetName: ${u}`))}}if(console.log("[AssetLoader] Inline data for",e,":",l?"FOUND":"NOT FOUND"),N==="publish"&&oe!==!1&&(console.log("[AssetLoader] \u26A0\uFE0F PUBLISH MODE DETECTED - inline assets are MANDATORY"),!l))throw new Error(`[AssetLoader] PUBLISH MODE: Inline asset required but NOT FOUND for object: ${e}, path: ${t.path}`);let p=ur.get(t.type);if(p)try{let d=await p(t.path,l,e,i);return pe.set(a,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=mn(d);break;default:throw new Error(`Unknown asset type: ${t.type}`)}return pe.set(a,d),d}catch(d){return this.handleFailure(e,t.type,d)}}static async loadImage(e,t){let i=N==="publish",n=i&&oe!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof t!="string"||!t.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof t}`);try{return await ge.Assets.load(t)}catch(a){throw console.error("[AssetLoader] Failed to load texture from data URI:",a),a}}if(t&&typeof t=="string"&&t.startsWith("data:"))try{return await ge.Assets.load(t)}catch(a){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",a),await ge.Assets.load(e)}return await ge.Assets.load(e)}static async loadJSON(e,t){let i=N==="publish",n=i&&oe!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let o=atob(t.split(",")[1]);return JSON.parse(o)}return JSON.parse(t)}let a=await fetch(e);if(!a.ok)throw new Error(`JSON fetch failed: ${e}`);return a.json()}static handleFailure(e,t,i){if(N==="dev"){let a=t==="image"?rs():mn({__placeholder:!0,type:t});return pe.set(e+":"+((i==null?void 0:i.path)||"missing"),a),a}throw i}};bn("image",async(r,e)=>{let t=N==="publish",i=t&&oe!==!1,n=N==="brand",a=t&&oe===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${r}`);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=r;return(n||a)&&r&&!r.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=r,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${r}" as-is`)):(o=`assets/${r}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${r}" -> "${o}"`))),ge.Assets.load(e||o)});bn("json",async(r,e)=>{let t=N==="publish",i=t&&oe!==!1,n=N==="brand",a=t&&oe===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${r}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let o=r;if((n||a)&&r&&!r.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(o=r,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${r}" as-is`)):(o=`assets/${r}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${r}" -> "${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: ${r}`);return s.json()})});var hr={};ft(hr,{AssetTextures:()=>se,initAssetTextures:()=>wn});function wn(r,e){gr.init(r,e),typeof window!="undefined"&&(window.__AssetTextures=se)}var vn,gr,se,Ke=de(()=>{"use strict";Wt();vn=class{constructor(){this.textures=new Map;this.readyPromise=null;this.priorityReadyPromise=null;this.priorityReadyResolve=null;this.config=null;this.app=null;this.attempted=new Set;this.waiters=new Set}init(e,t){if(this.config===e&&this.app===t&&this.priorityReadyPromise){console.log("[AssetTextures] init called with same config/app; keeping existing state");return}this.textures.clear(),this.readyPromise=null,this.priorityReadyPromise=null,this.priorityReadyResolve=null,this.attempted.clear(),this.waiters.clear(),this.priorityReadyPromise=new Promise(i=>{this.priorityReadyResolve=i}),this.config=e,this.app=t,console.log("[AssetTextures] Initialized with config, cleared previous textures")}async ready(){if(this.readyPromise){await this.readyPromise;return}if(!this.config)throw new Error("[AssetTextures] Must call init() before ready() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before ready() - app is null");let e=this.config,t=this.app;return this.readyPromise=(async()=>{var o;console.log("[AssetTextures] Loading all assets...");let i=new Set(["background_loading_1"]),n=[],a=[];for(let[s,l]of e.objects.entries()){let c=(o=l.render)==null?void 0:o.asset;if(!c)continue;let p=async()=>{var d;try{let u=(d=l.identity)==null?void 0:d.id;console.log(`[AssetTextures] Loading ${c.type}: ${s} (${u})`);let g=await je.load(s,c,t,u);this.textures.set(s,g),console.log(`[AssetTextures] \u2713 Loaded: ${s}`)}catch(u){console.error(`[AssetTextures] \u2717 Failed to load: ${s}`,u)}finally{this.attempted.add(s);try{for(let u of Array.from(this.waiters))u()}catch{}}};i.has(s)?n.push(p()):a.push(p())}n.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(n),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(a),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,t={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let n=Array.from(new Set((e||[]).filter(s=>typeof s=="string"&&s))).filter(s=>{var l,c,p,d;try{let u=(p=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:p.call(c,s);return!!((d=u==null?void 0:u.render)!=null&&d.asset)}catch{return!1}});if(n.length===0)return;this.ready().catch(()=>{});let a=()=>n.every(s=>this.textures.has(s)||this.attempted.has(s));if(a())return;let o=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(s=>{let l=!1,c=()=>{l||a()&&(l=!0,this.waiters.delete(c),s())};this.waiters.add(c),c(),o>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:n}),s())},o)})}get(e){return this.textures.get(e)}set(e,t){this.textures.set(e,t),console.log(`[AssetTextures] Updated texture: ${e}`)}clear(){this.textures.clear(),this.readyPromise=null,console.log("[AssetTextures] Cleared all textures")}getAllIds(){return Array.from(this.textures.keys())}},gr=new vn,se=new Proxy(gr,{get(r,e){return e in r&&typeof r[e]=="function"?r[e].bind(r):r.get(e)},set(r,e,t){return r.set(e,t),!0}})});var Je={};ft(Je,{applyConfigOverride:()=>Ae,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,clearConfigOverrides:()=>ee,clearConfigOverridesForObject:()=>Tr,configOverrideManager:()=>Lr,deepClone:()=>V,exportConfigsAsJSON:()=>ze,getConfigOverrides:()=>Y,getConfigStateSummary:()=>Xe,getOverrideMode:()=>Et,removeConfigOverride:()=>ai,resetToApplied:()=>St,resetToOriginal:()=>oi,setOverrideMode:()=>An});function ii(){return typeof window=="undefined"?null:window.__editableConfig||null}function xr(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function vr(r,e){var t,i;if(!r)return null;try{if(r instanceof Map)return(t=r.get(e))!=null?t:null;if(typeof r=="object")return(i=r[e])!=null?i:null}catch{}return null}function _s(r,e,t){if(r){if(r instanceof Map){r.set(e,t);return}typeof r=="object"&&(r[e]=t)}}function Er(r,e){for(let t of e)xt(r,t.path,t.value)}function Sr(r){var s;if(typeof window=="undefined")return;let e=ii();if(!e)return;let t=xr(),i=(s=t?vr(t.objects,r):null)!=null?s:vr(e.objects,r);if(!i)return;let n=V(i),a=Y().filter(l=>l.objectId===r);try{Er(n,a)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",r,l);return}_s(e.objects,r,n);let o=window.applyEditableObjectConfig;if(typeof o=="function")try{o(r,n)}catch{}}function Os(){var n;if(typeof window=="undefined")return;let r=ii();if(!(r!=null&&r.engine))return;let e=xr(),t=V(((n=e==null?void 0:e.engine)!=null?n:r.engine)||{}),i=Y().filter(a=>!a.objectId&&!a.sceneId);try{Er(t,i)}catch(a){console.error("[CONFIG] Failed to reapply engine overrides",a);return}try{let a=r.engine;for(let o of Object.keys(a))o in t||delete a[o];for(let[o,s]of Object.entries(t))a[o]=s}catch{r.engine=t}}function Is(){if(typeof window=="undefined")return"unknown";let r=window;return typeof r.__HANDLER_PROJECT_ID=="string"?r.__HANDLER_PROJECT_ID:"handler-default"}function Ar(){return`handler_preview_config_overrides::${Is()}`}function js(){if(typeof window=="undefined")return[];try{let r=window.localStorage.getItem(Ar());if(!r)return[];let e=JSON.parse(r);return Array.isArray(e)?e:[]}catch{return[]}}function ni(r){if(typeof window!="undefined")try{window.localStorage.setItem(Ar(),JSON.stringify(r))}catch{}}function Et(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function An(r){if(typeof window!="undefined"){window.__enableConfigOverrides=r;try{window.localStorage.setItem(Cr,r?"true":"false")}catch{}}}function Ae(r,e={}){var u,g;let{objectId:t,path:i,value:n}=r,{silent:a=!1,persist:o=!0,emitEvent:s=!0}=e,l=ii();if(!l){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let c=t?(g=(u=l.objects)==null?void 0:u.get)==null?void 0:g.call(u,t):l.engine;if(!c){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:t,path:i,hasObjects:!!l.objects});return}a||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:i,value:n});let p;try{p=zs(c,i),xt(c,i,n)}catch(f){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:n},f);return}window.__configChanges=window.__configChanges||[];let d=window.__configChanges;if(d.push({objectId:t,path:i,oldValue:p,newValue:n,ts:Date.now()}),d.length>Rs&&d.shift(),o){let f=Y(),h=f.findIndex(m=>m.objectId===t&&m.sceneId===r.sceneId&&m.path===i);h>=0?f[h].value=n:f.push(r),window.__configOverrides=f,ni(f),Et()||An(!0)}a||console.log("[CONFIG] Applied override:",r),s&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:r}))}function Ce(r,e={}){let t=e.emitEvent!==!1,i=[];for(let n of r)n!=null&&n.objectId&&typeof n.objectId=="string"&&i.push(n.objectId),Ae(n,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let n=Array.from(new Set(i));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:n,count:r.length}}))}}function ee(){window.__configOverrides=[],window.__configChanges=[],ni([]),console.log("[CONFIG] Cleared all overrides")}function Tr(r){let e=Y().filter(i=>i.objectId!==r);window.__configOverrides=e,ni(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==r),Sr(r),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:r}}))}function ai(r,e){let t=Y().filter(n=>n.objectId!==r||n.path!==e);window.__configOverrides=t,ni(t);let i=window.__configChanges||[];window.__configChanges=i.filter(n=>n.objectId!==r||n.path!==e),r?Sr(r):Os(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:r,path:e}}))}function Y(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=js()),window.__configOverrides||[])}function xt(r,e,t){var o;let i=e.split("."),n=i.pop(),a=r;for(let s of i){if(a[s]!==void 0&&typeof a[s]!="object")throw new Error(`Invalid override path: ${e} (hit primitive at ${s})`);a[s]=(o=a[s])!=null?o:{},a=a[s]}a[n]=t}function zs(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function V(r){if(r===null||typeof r!="object")return r;if(r instanceof Date)return new Date(r.getTime());if(r instanceof Set)return new Set([...r].map(t=>V(t)));if(ArrayBuffer.isView(r))return r.slice();if(r instanceof Array)return r.map(t=>V(t));if(r instanceof Map){let t=new Map;return r.forEach((i,n)=>t.set(n,V(i))),t}let e={};for(let t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=V(r[t]));return e}function ze(){let r=window.__editableConfigBaseline;if(!r){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return wr(e)}return wr(r)}function wr(r){let e={objects:{},scenes:{},engine:V(r.engine||{})},t=r.objects;if(t instanceof Map)t.forEach((a,o)=>{e.objects[o]=V(a)});else if(t&&typeof t=="object")for(let a in t)e.objects[a]=V(t[a]);let i=r.scenes;if(i instanceof Map)i.forEach((a,o)=>{e.scenes[o]=V(a)});else if(i&&typeof i=="object")for(let a in i)e.scenes[a]=V(i[a]);let n=Y();for(let a of n)a.objectId?(e.objects[a.objectId]||(e.objects[a.objectId]={}),xt(e.objects[a.objectId],a.path,a.value)):a.sceneId?(e.scenes[a.sceneId]||(e.scenes[a.sceneId]={}),xt(e.scenes[a.sceneId],a.path,a.value)):xt(e.engine,a.path,a.value);return e}function Xe(){let r=Y(),e=new Set;for(let t of r)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:r.length,hasChanges:r.length>0,overrides:r}}async function ri(r){let e=ze(),t={};for(let[n,a]of Object.entries(e.objects)){let o=a,s=n;/^(json\.|ui\.|effects\.|engine\.)/.test(s)||(s=`json.${n}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=s),t[`objects/${s}.json`]=o}e.engine&&(e.engine.runtime&&(t["engine/engine.runtime.json"]=e.engine.runtime),e.engine.assets&&(t["engine/engine.assets.json"]=e.engine.assets),e.engine.splash&&(t["engine/engine.splash.json"]=e.engine.splash),e.engine.loading&&(t["engine/engine.loading.json"]=e.engine.loading),e.engine.start&&(t["engine/engine.start.json"]=e.engine.start),e.engine.tutorial&&(t["engine/engine.tutorial.json"]=e.engine.tutorial),e.engine.endgame&&(t["engine/engine.endgame.json"]=e.engine.endgame),!e.engine.runtime&&!e.engine.assets&&(t["engine/engine.json"]=e.engine));for(let[n,a]of Object.entries(e.scenes)){let o=n.startsWith("scene.")?n:`scene.${n}`;t[`scenes/${o}.json`]=a}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Y().length>0,versionName:r})});if(!i.ok){let n=await i.json();throw new Error(`Apply failed: ${n.error||"Unknown error"}`)}ee();try{let n=ii();n&&(window.__editableConfigBaseline=V(n))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function St(){ee(),window.location.reload()}async function oi(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let e=await fetch("/api/reset-to-original",{method:"POST"});if(!e.ok){let t=await e.json();throw new Error(`Reset failed: ${t.error||"Unknown error"}`)}ee(),window.location.reload()}var Cr,Rs,Lr,X=de(()=>{"use strict";Cr="handler_preview_override_mode";if(typeof window!="undefined"){let r=window.localStorage.getItem(Cr);window.__enableConfigOverrides=r===null?!0:r==="true"}Rs=500;Lr={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[]}}});function $s(r,e){try{if(typeof r=="object"&&r!==null)return r;if(typeof r!="string")return null;if(r.startsWith("data:")){let i=r.indexOf(",");if(i===-1)return null;let n=r.slice(0,i);if(!n.includes("application/json")&&!n.includes("text/plain"))return null;let a=r.slice(i+1),o=n.includes("base64")?typeof atob=="function"?atob(a):a:decodeURIComponent(a);return JSON.parse(o)}let t=r.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(r):null}catch{return null}}function Ds(r){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=r.replace(/^\.\/+/,""),i=t.split("/").pop()||t,n=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let a of n){let o=e[a];if(o){let s=$s(o,a);if(s!==null)return s}}return null}async function At(r){if(Cn.has(r)&&!Tn)return console.log(`[CONFIG] Using cached config for: "${r}"`),Cn.get(r);if(console.log(`[CONFIG] loadConfigFile called with: "${r}", MODE: ${H.toUpperCase()}, CACHE: ${Tn?"DISABLED":"ENABLED"}`),H==="publish"){let i=Ds(r);return i?(console.log(`[CONFIG] \u2713 Loaded ${r} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${r} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}H==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${r}"`);let e;H==="brand"?e=[`./${r.split("/").pop()||r}`,`./${r}`,`./${r.replace(/^configs\//,"")}`,`./${r.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${r}`,`./${r.replace(/^configs\//,"")}`,`./${r.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(i=>i.startsWith("./")?[i,`/${i.slice(2)}`]:i.startsWith("/")?[i]:[i,`/${i}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let i=Tn?"no-store":"force-cache";for(let n of e)try{let a=await fetch(n,{cache:i});if(!a.ok)continue;let o=await a.json();return console.log(`[CONFIG] \u2713 Loaded ${r} via ${n}`,o),o}catch(a){console.warn(`[CONFIG] \u2717 Failed to load ${n} (mode: ${H}):`,a)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${r}; using defaults`),{}})();return Cn.set(r,t),t}async function si(){console.log("[CONFIG] Loading component schemas...");let r=["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 r)try{let i=H==="publish"||H==="brand"?t.split("/").pop()||t:`configs/${t}`,n=await At(i);n.component&&(e.set(n.component,n),console.log(`[CONFIG] \u2713 Schema loaded: ${n.component} ${H==="publish"||H==="brand"?"(flattened)":"(nested)"}`))}catch(i){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,i)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function Te(r){console.log(`[CONFIG] Loading object config: ${r}`);let e=H==="publish"||H==="brand"?`${r}.json`:`configs/objects/${r}.json`;return await At(e)}async function li(r){let e=new Map;if(r.objects&&Array.isArray(r.objects)){for(let t of r.objects)if(t.enabled&&t.object_config)try{let i=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(i)||(i=`json.${i}`);let n=await Te(i);(!n||Object.keys(n).length===0)&&i!==t.instance_id&&(n=await Te(t.instance_id)),!n||Object.keys(n).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),n=await Te(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...n,instance_id:t.instance_id,object_config:t.object_config})}catch(i){console.warn(`Failed to load object ${t.object_config}:`,i)}}return e}async function ci(){console.log("[CONFIG] Loading engine configs...");let r=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(r.map(i=>{let n=`engine.${i}.json`,a=H==="publish"||H==="brand"?n:`configs/engine/${n}`;return At(a)})),t=Object.fromEntries(r.map((i,n)=>[i,e[n]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(r.map(i=>{var o;let n=(o=t[i])!=null?o:{},a=Object.keys(n);return[i,a.length>0?a:"empty"]}))),t}async function Ln(){return await At(H==="publish"||H==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function di(r="scene.main"){console.log(`[CONFIG] Loading scene config: ${r}`);let e=H==="publish"||H==="brand"?`${r}.json`:`configs/scenes/${r}.json`;return await At(e)}function Ze(r,e){let t=[];if(!r.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let i=e.get("identity");if(i)for(let n of i.required||[])r.identity[n]||t.push(`Missing required identity field: ${n}`);for(let[n,a]of Object.entries(r)){if(n==="identity")continue;let o=e.get(n);if(o&&a&&typeof a=="object"){let s=a;for(let l of o.required||[])s[l]===void 0&&t.push(`Missing required field in ${n}: ${l}`);if(o.constraints&&typeof o.constraints=="object")for(let[l,c]of Object.entries(o.constraints)){let p=s[l];if(p!==void 0&&c&&typeof c=="object"){let d=c;typeof p=="number"&&(d.min!==void 0&&p<d.min&&t.push(`${n}.${l} value ${p} is below minimum ${d.min}`),d.max!==void 0&&p>d.max&&t.push(`${n}.${l} value ${p} is above maximum ${d.max}`))}}}}return{valid:t.length===0,errors:t}}function $e(r,e){let t={...r},i=["identity","transform","render"];for(let[n,a]of e.entries())a.defaults&&Object.keys(a.defaults).length>0&&(i.includes(n)||t[n])&&(t[n]||(t[n]={}),t[n]={...a.defaults,...t[n]});return t}function te(r,e,t,i){return typeof r!="number"||!Number.isFinite(r)?e:Math.min(Math.max(r,t),i)}function Pr(r,e){if(Array.isArray(r))return{x:te(r[0],e.x,-2e3,2e3),y:te(r[1],e.y,-2e3,2e3)};if(!r||typeof r!="object")return e;let{x:t,y:i}=r;return{x:te(t,e.x,-2e3,2e3),y:te(i,e.y,-2e3,2e3)}}function Hs(r,e){if(Array.isArray(r))return{x:te(r[0],e.x,0,1),y:te(r[1],e.y,0,1)};if(!r||typeof r!="object")return e;let{x:t,y:i}=r;return{x:te(t,e.x,0,1),y:te(i,e.y,0,1)}}function Ns(r){if(Array.isArray(r))return{x:te(r[0],.5,-10,10),y:te(r[1],.5,-10,10)};if(r&&typeof r=="object"){let{x:e,y:t}=r;return{x:te(e,.5,-10,10),y:te(t,.5,-10,10)}}return typeof r=="string"?r:null}async function be(r="scene.main",e){var l,c,p,d,u,g,f,h,m,b,y,v,w,A;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await si(),i=Y();i.length>0&&console.log(`[CONFIG] Applying ${i.length} active overrides`);let n=await di(r);console.log(`[CONFIG] Scene config loaded: ${((l=n.objects)==null?void 0:l.length)||0} objects`);let a=await ci();console.log("[CONFIG] Loading object configs...");let o=await li(n);console.log(`[CONFIG] Loaded ${o.size} object configs:`,Array.from(o.keys()));for(let[L,$]of o.entries()){let x=$e($,t),_=Ze(x,t);_.valid||console.warn(`Object ${L} validation errors:`,_.errors),(c=x.transform)!=null&&c.position&&(x.transform.position=Pr(x.transform.position,{x:0,y:0})),(p=x.transform)!=null&&p.offset&&(x.transform.offset=Pr(x.transform.offset,{x:0,y:0})),((d=x.transform)==null?void 0:d.anchor)!==void 0&&(x.transform.anchor=Ns(x.transform.anchor)),((u=x.transform)==null?void 0:u.position_ratio)!==void 0&&x.transform.position_ratio!==null&&(x.transform.position_ratio=Hs(x.transform.position_ratio,{x:.5,y:.5})),o.set(L,x)}if(e){if(e.objects)for(let[L,$]of e.objects.entries())o.set(L,$);e.engine&&(a.runtime={...a.runtime,...e.engine.runtime},a.assets={...a.assets,...e.engine.assets},a.splash={...(g=a.splash)!=null?g:{},...(f=e.engine.splash)!=null?f:{}})}let s={objects:o,engine:a,scene:n,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=$e(s,t))),i.length>0&&Et()&&Ce(i,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(o.keys()),engine:{runtime:Object.keys((h=a.runtime)!=null?h:{}),assets:Object.keys((m=a.assets)!=null?m:{}),splash:Object.keys((b=a.splash)!=null?b:{}),loading:Object.keys((y=a.loading)!=null?y:{}),start:Object.keys((v=a.start)!=null?v:{}),tutorial:Object.keys((w=a.tutorial)!=null?w:{}),endgame:Object.keys((A=a.endgame)!=null?A:{})},scene:n.scene_id||"unknown"}),s}function kn(r){var t,i,n,a,o,s,l,c,p,d,u,g,f,h,m,b,y,v,w,A,L,$,x,_,O,S,E,k,T,M,P,z,C;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[I,j]of r.objects.entries()){let F=((t=j.identity)==null?void 0:t.id)||I;F.includes("character")&&(e.gameplay.character_pos=((i=j.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((n=j.transform)==null?void 0:n.scale)||1,e.gameplay.character_anim_speed=((o=(a=j.gameplay)==null?void 0:a.tuning)==null?void 0:o.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(s=j.gameplay)==null?void 0:s.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((p=(c=j.gameplay)==null?void 0:c.tuning)==null?void 0:p.relief_speed)||.22),(F.includes("gun")||F.includes("flame"))&&(e.gameplay.gun=j.gun||{},e.gameplay.gunmuzzle=((d=j.effects)==null?void 0:d.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=j.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=j.effects)==null?void 0:g.flame)||{}),F.includes("diamond")&&(e.gameplay.diamond=j),F.includes("ice")&&(e.gameplay.melt=j.melt||{},e.gameplay.melt_anchor=((f=j.transform)==null?void 0:f.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((h=j.transform)==null?void 0:h.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=j.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((b=j.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=j.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=j.hard_ice||{}),F.includes("water")&&(e.gameplay.water_drops=j),F.includes("crack")&&(e.gameplay.crack=j),F.includes("hand")&&(e.gameplay.hand=((v=j.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((w=j.transform)==null?void 0:w.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((A=j.transform)==null?void 0:A.scale)||1.5),F.includes("hazard")&&(e.gameplay.hazard=((L=j.gameplay)==null?void 0:L.tuning)||{},e.gameplay.danger_pos=(($=j.transform)==null?void 0:$.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((_=(x=j.gameplay)==null?void 0:x.tuning)==null?void 0:_.danger_pulse)||{},e.gameplay.hazard_height=((S=(O=j.gameplay)==null?void 0:O.tuning)==null?void 0:S.hazard_height)||140)}return e.gameplay.timeline=((E=r.engine.runtime)==null?void 0:E.timeline)||{},e.gameplay.drag_surface=((k=r.engine.runtime)==null?void 0:k.drag_surface)||{},e.gameplay.background=((T=r.engine.runtime)==null?void 0:T.background)||{},e.gameplay.ui_styles=((M=r.engine.runtime)==null?void 0:M.ui_styles)||{},e.gameplay.label_pulse=((P=r.engine.runtime)==null?void 0:P.label_pulse)||{},e.ui=((z=r.engine.runtime)==null?void 0:z.ui)||{},e.theme=((C=r.engine.runtime)==null?void 0:C.theme)||{},e.assets=r.engine.assets||{},e}var kr,H,Cn,Tn,Pn=de(()=>{"use strict";X();kr=null,H="dev";if(typeof window!="undefined"){let r=window.__BUILD_SETTINGS__;if(r!=null&&r.buildMode)kr=r,H=r.buildMode,console.log("[CONFIG] Loaded inline build settings:",r,"buildMode:",H);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);kr=t,H=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",H)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",H)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",H);Cn=new Map,Tn=H==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function Mn(r,e){let t=[];function i(n,a,o=""){if(n!==a){if(typeof n!=typeof a){t.push(`${o}: type changed`);return}if(typeof n=="object"&&n!==null&&a!==null){let s=new Set([...Object.keys(n),...Object.keys(a)]);for(let l of s){let c=o?`${o}.${l}`:l;l in n?l in a?i(n[l],a[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${o}: changed`)}}return i(r,e),t}function _n(r,e,t,i){let n={...t};for(let[a,o]of i.entries())n[a]&&o.defaults&&(n[a]={...o.defaults,...n[a]});return n}var Ct,De,On=de(()=>{"use strict";Ct=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},De=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let i=`${e}?t=${Date.now()}&r=${Math.random()}`,n=await fetch(i,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(n.ok){let a=await n.text(),o=this.hashString(a),s=this.fileHashes.get(e);if(s&&s!==o&&console.log(`[HOT-RELOAD] File changed: ${e}`),s&&s!==o){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,o)}else s||this.fileHashes.set(e,o)}}catch(i){console.warn(`Failed to check ${e}:`,i)}}determineEventType(e){var t,i;return e.includes("/components/")?{type:"component",path:e,componentName:(t=e.split("/").pop())==null?void 0:t.replace(".schema.json","")}:e.includes("/engine/")?{type:"engine",path:e}:e.includes("/scenes/")?{type:"scene",path:e}:e.includes("/objects/")?{type:"object",path:e,objectId:(i=e.split("/").pop())==null?void 0:i.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let i=0;i<e.length;i++){let n=e.charCodeAt(i);t=(t<<5)-t+n,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}}});function jn(r){if(typeof window=="undefined")return;let e=typeof In!="undefined"&&!!In.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let n=null,a=!1,o=null;if(t){o=new De;let f=window.__configWatcher;f!=null&&f.stop&&f.stop(),window.__configWatcher=o}let s=new Set,l=f=>{var b,y;if(!o)return;let h=new Set;h.add("configs/engine/engine.runtime.json"),h.add("configs/engine/engine.assets.json"),h.add("configs/engine/engine.splash.json"),h.add("configs/scenes/scene.main.json");let m=(y=(b=f.scene)==null?void 0:b.objects)!=null?y:[];for(let v of m)v!=null&&v.object_config&&h.add(`configs/objects/${v.object_config}.json`);for(let v of s)h.has(v)||o.unwatch(v);for(let v of h)s.has(v)||o.watch(v,w=>g(w));s=h},c=new Set,p=!1,d=async f=>{let h=await Te(f),m=$e(h,r.activeConfig.schemas),b=Ze(m,r.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${f} validation errors:`,b.errors),await r.liveEditBridge.applyObjectConfig(f,m)};async function u(f){if(!a){a=!0;try{if(p||c.size===0){r.audioSystem.destroy();let h=await be("scene.main");r.setActiveConfig(h),r.gameObjectManager.updateConfig(h),r.CustomAssets.updateConfig(h),await r.CustomAssets.ready();let m=r.createAudioSystem(h);r.setAudioSystem(m),window.__audioSystem=m,await m.start(),r.liveEditBridge.rebuildIndexes(),l(h),console.log(`[GAME] Hot-reload complete (${f})`)}else{let h=Array.from(c);c.clear();for(let m of h)await d(m);console.log(`[GAME] Hot-reload updated objects: ${h.join(", ")}`)}}catch(h){console.warn("[GAME] Hot-reload failed:",h)}finally{a=!1,p=!1,c.clear()}}}function g(f){f.type==="object"&&f.objectId?c.add(f.objectId):p=!0,n&&window.clearTimeout(n),n=window.setTimeout(()=>{u(f.type)},120)}e&&In.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(r.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${s.size} files)`))}var In,Mr=de(()=>{"use strict";On();Pn();In={}});var _r={};ft(_r,{ConfigWatcher:()=>De,DefaultReloadStrategy:()=>Ct,applyDefaults:()=>$e,diffConfigs:()=>Mn,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>Ln,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>_n,setupHotReload:()=>jn,toLegacyFormat:()=>kn,validateObjectConfig:()=>Ze});var pi=de(()=>{"use strict";Pn();On();Mr()});var bo={};ft(bo,{AssetEditorModal:()=>ga});var ga,ha=de(()=>{"use strict";ga=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,i,n){this.currentObjectId=e,this.currentPath=t,this.currentAsset=i,this.onApplyCallback=n,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let i=document.createElement("div");i.className="asset-editor-modal",i.innerHTML=`
1
+ "use strict";var qs=Object.create;var Gt=Object.defineProperty;var Vs=Object.getOwnPropertyDescriptor;var Ws=Object.getOwnPropertyNames;var Ys=Object.getPrototypeOf,Ks=Object.prototype.hasOwnProperty;var pe=(r,e)=>()=>(r&&(e=r(r=0)),e);var ft=(r,e)=>{for(var t in e)Gt(r,t,{get:e[t],enumerable:!0})},Ha=(r,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ws(e))!Ks.call(r,n)&&n!==t&&Gt(r,n,{get:()=>e[n],enumerable:!(i=Vs(e,n))||i.enumerable});return r};var Ve=(r,e,t)=>(t=r!=null?qs(Ys(r)):{},Ha(e||!r||!r.__esModule?Gt(t,"default",{value:r,enumerable:!0}):t,r)),Xs=r=>Ha(Gt({},"__esModule",{value:!0}),r);var ue,bn=pe(()=>{"use strict";ue=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()}};ue.store=new Map});function ao(){var r,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(r=document.querySelector("script"))==null?void 0:r.textContent)==null?void 0:e.includes("inline-assets.js"))||window.INLINE_ASSETS),i=typeof window!="undefined"&&document.querySelector('link[href*="assets/"], script[src*="assets/"]');return!!(t&&!i)}catch{return!1}}async function ro(){try{if(typeof window!="undefined"){let r=await fetch("./build-settings.json");if(r.ok){let e=await r.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function so(){try{if(typeof window!="undefined"){let r=new XMLHttpRequest;if(r.open("GET","./build-settings.json",!1),r.send(),r.status===200&&r.responseText){let e=JSON.parse(r.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function oo(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${N}`),Object.keys(ge).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(ge)),ge;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),ge={...window.INLINE_ASSETS},ge;if(!(N==="publish"&&se!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ge;if(!yn){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),yn=(async()=>{try{try{let a=await import(e+"?t="+Date.now());if(a.INLINE_ASSETS)return console.log("[AssetLoader] Loaded INLINE_ASSETS via ES module:",Object.keys(a.INLINE_ASSETS)),a.INLINE_ASSETS}catch(a){console.warn("[AssetLoader] ES module import failed, trying text parse:",a)}let t=await fetch(e);if(!t.ok)throw new Error(`HTTP ${t.status}: ${t.statusText}`);let i=await t.text();console.log("[AssetLoader] Received JS code, length:",i.length);let n=i.match(/export\s+const\s+INLINE_ASSETS\s*=\s*({[\s\S]*?});?\s*$/m);if(n)try{let a=n[1];console.log("[AssetLoader] Found INLINE_ASSETS export, parsing...");let s=new Function("return "+a)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(s)),s}catch(a){return console.warn("[AssetLoader] Failed to parse inline assets:",a),{}}else return console.warn("[AssetLoader] INLINE_ASSETS export not found in response"),console.log("[AssetLoader] JS code preview:",i.substring(0,500)),{}}catch(t){return console.warn("[AssetLoader] Failed to load inline assets:",t),{}}})()}return ge=await yn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ge)),ge}function vn(r){return r===null||typeof r!="object"||(Object.freeze(r),Object.values(r).forEach(e=>vn(e))),r}function lo(r=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=r,i.height=e;let n=i.getContext("2d");return n.fillStyle=`#${t.toString(16).padStart(6,"0")}`,n.fillRect(0,0,r,e),n.strokeStyle="#000",n.strokeRect(0,0,r,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",r/2,e/2),he.Texture.from(i)}function wn(r,e){yr.set(r,e)}var he,mr,br,je,N,se,Ae,ge,yn,yr,Re,Yt=pe(()=>{"use strict";he=require("pixi.js");bn();mr=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",br=ao(),je=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,N=br?"publish":mr,se=je==null?void 0:je.assetsInlined;je!=null&&je.buildMode&&(N=je.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${N}`));Ae=so();Ae!=null&&Ae.buildMode&&(N=Ae.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${N}`));(Ae==null?void 0:Ae.assetsInlined)!==void 0&&(se=Ae.assetsInlined);ro().then(r=>{r!=null&&r.buildMode&&r.buildMode!==N&&(N=r.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${N}`)),(r==null?void 0:r.assetsInlined)!==void 0&&(se=r.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${mr}, Runtime: ${br?"publish":"dev"}, Effective: ${N}`);ge={},yn=null;yr=new Map;Re=class{static async load(e,t,i,n){let a=`${e}:${t.path}`,s=ue.get(a);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 oo(),l=o[e];if(!l&&n&&(l=o[n],l&&console.log(`[AssetLoader] Found inline data for ${e} using configId: ${n}`)),!l&&t.path){let d=t.path.split("/");if(d.length>=2){let u=d[d.length-1].split(".")[0];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"&&se!==!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=yr.get(t.type);if(p)try{let d=await p(t.path,l,e,i);return ue.set(a,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=vn(d);break;default:throw new Error(`Unknown asset type: ${t.type}`)}return ue.set(a,d),d}catch(d){return this.handleFailure(e,t.type,d)}}static async loadImage(e,t){let i=N==="publish",n=i&&se!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for object. Path: ${e}`);if(typeof t!="string"||!t.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof t}`);try{return await he.Assets.load(t)}catch(a){throw console.error("[AssetLoader] Failed to load texture from data URI:",a),a}}if(t&&typeof t=="string"&&t.startsWith("data:"))try{return await he.Assets.load(t)}catch(a){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",a),await he.Assets.load(e)}return await he.Assets.load(e)}static async loadJSON(e,t){let i=N==="publish",n=i&&se!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${N}, isPublishMode: ${i}, inlineData: ${t?"EXISTS":"MISSING"}`),n){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!t)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${e}`);if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let 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 a=await fetch(e);if(!a.ok)throw new Error(`JSON fetch failed: ${e}`);return a.json()}static handleFailure(e,t,i){if(N==="dev"){let a=t==="image"?lo():vn({__placeholder:!0,type:t});return ue.set(e+":"+((i==null?void 0:i.path)||"missing"),a),a}throw i}};wn("image",async(r,e)=>{let t=N==="publish",i=t&&se!==!1,n=N==="brand",a=t&&se===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${r}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return he.Assets.load(e)}let s=r;return(n||a)&&r&&!r.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(s=r,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${r}" as-is`)):(s=`assets/${r}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${r}" -> "${s}"`))),he.Assets.load(e||s)});wn("json",async(r,e)=>{let t=N==="publish",i=t&&se!==!1,n=N==="brand",a=t&&se===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${N}, isPublishMode: ${t}, isBrandMode: ${n}, inlineData: ${e?"EXISTS":"MISSING"}`),i){if(console.log("[AssetLoader] PUBLISH MODE ACTIVATED - inline assets are MANDATORY"),!e)throw new Error(`[AssetLoader] Publish mode: inline asset required but not found for path: ${r}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let s=r;if((n||a)&&r&&!r.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(s=r,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${r}" as-is`)):(s=`assets/${r}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${r}" -> "${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: ${r}`);return o.json()})});var wr={};ft(wr,{AssetTextures:()=>oe,initAssetTextures:()=>Sn});function Sn(r,e){vr.init(r,e),typeof window!="undefined"&&(window.__AssetTextures=oe)}var En,vr,oe,Xe=pe(()=>{"use strict";Yt();En=class{constructor(){this.textures=new Map;this.readyPromise=null;this.priorityReadyPromise=null;this.priorityReadyResolve=null;this.config=null;this.app=null;this.attempted=new Set;this.waiters=new Set}init(e,t){if(this.config===e&&this.app===t&&this.priorityReadyPromise){console.log("[AssetTextures] init called with same config/app; keeping existing state");return}this.textures.clear(),this.readyPromise=null,this.priorityReadyPromise=null,this.priorityReadyResolve=null,this.attempted.clear(),this.waiters.clear(),this.priorityReadyPromise=new Promise(i=>{this.priorityReadyResolve=i}),this.config=e,this.app=t,console.log("[AssetTextures] Initialized with config, cleared previous textures")}async ready(){if(this.readyPromise){await this.readyPromise;return}if(!this.config)throw new Error("[AssetTextures] Must call init() before ready() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before ready() - app is null");let e=this.config,t=this.app;return this.readyPromise=(async()=>{var s;console.log("[AssetTextures] Loading all assets...");let i=new Set(["background_loading_1"]),n=[],a=[];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 Re.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{}}};i.has(o)?n.push(p()):a.push(p())}n.length>0&&(console.log("[AssetTextures] Phase 1: Loading priority assets (loading screen)..."),await Promise.all(n),console.log("[AssetTextures] Phase 1: Priority assets ready")),this.priorityReadyResolve&&this.priorityReadyResolve(),console.log("[AssetTextures] Phase 2: Loading remaining assets..."),await Promise.all(a),console.log("[AssetTextures] All textures loaded:",Array.from(this.textures.keys()))})(),this.readyPromise}async priorityReady(){return this.priorityReadyPromise?this.priorityReadyPromise:Promise.resolve()}async waitFor(e,t={}){if(!this.config)throw new Error("[AssetTextures] Must call init() before waitFor() - config is null");if(!this.app)throw new Error("[AssetTextures] Must call init() before waitFor() - app is null");let n=Array.from(new Set((e||[]).filter(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(n.length===0)return;this.ready().catch(()=>{});let a=()=>n.every(o=>this.textures.has(o)||this.attempted.has(o));if(a())return;let s=typeof t.timeoutMs=="number"?t.timeoutMs:15e3;await new Promise(o=>{let l=!1,c=()=>{l||a()&&(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:n}),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())}},vr=new En,oe=new Proxy(vr,{get(r,e){return e in r&&typeof r[e]=="function"?r[e].bind(r):r.get(e)},set(r,e,t){return r.set(e,t),!0}})});var Je={};ft(Je,{applyConfigOverride:()=>le,applyConfigOverrides:()=>Te,applyConfigsToDisk:()=>li,clearConfigOverrides:()=>ee,clearConfigOverridesForObject:()=>Mr,configOverrideManager:()=>Pr,deepClone:()=>V,exportConfigsAsJSON:()=>$e,getConfigOverrides:()=>Y,getConfigStateSummary:()=>ye,getOverrideMode:()=>Et,redoLastConfigChange:()=>oi,removeConfigOverride:()=>St,resetToApplied:()=>At,resetToOriginal:()=>ci,setOverrideMode:()=>Pn,undoLastConfigChange:()=>si});function ni(){return typeof window=="undefined"?null:window.__editableConfig||null}function kn(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function Ln(r,e){var t,i;if(!r)return null;try{if(r instanceof Map)return(t=r.get(e))!=null?t:null;if(typeof r=="object")return(i=r[e])!=null?i:null}catch{}return null}function Ro(r,e,t){if(r){if(r instanceof Map){r.set(e,t);return}typeof r=="object"&&(r[e]=t)}}function Tr(r,e){for(let t of e)xt(r,t.path,t.value)}function ai(r){var o;if(typeof window=="undefined")return;let e=ni();if(!e)return;let t=kn(),i=(o=t?Ln(t.objects,r):null)!=null?o:Ln(e.objects,r);if(!i)return;let n=V(i),a=Y().filter(l=>l.objectId===r);try{Tr(n,a)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",r,l);return}Ro(e.objects,r,n);let s=window.applyEditableObjectConfig;if(typeof s=="function")try{s(r,n)}catch{}}function Mn(){var n;if(typeof window=="undefined")return;let r=ni();if(!(r!=null&&r.engine))return;let e=kn(),t=V(((n=e==null?void 0:e.engine)!=null?n:r.engine)||{}),i=Y().filter(a=>!a.objectId&&!a.sceneId);try{Tr(t,i)}catch(a){console.error("[CONFIG] Failed to reapply engine overrides",a);return}try{let a=r.engine;for(let s of Object.keys(a))s in t||delete a[s];for(let[s,o]of Object.entries(t))a[s]=o}catch{r.engine=t}}function zo(){if(typeof window=="undefined")return"unknown";let r=window;return typeof r.__HANDLER_PROJECT_ID=="string"?r.__HANDLER_PROJECT_ID:"handler-default"}function Lr(){return`handler_preview_config_overrides::${zo()}`}function $o(){if(typeof window=="undefined")return[];try{let r=window.localStorage.getItem(Lr());if(!r)return[];let e=JSON.parse(r);return Array.isArray(e)?e:[]}catch{return[]}}function ri(r){if(typeof window!="undefined")try{window.localStorage.setItem(Lr(),JSON.stringify(r))}catch{}}function Et(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function Pn(r){if(typeof window!="undefined"){window.__enableConfigOverrides=r;try{window.localStorage.setItem(kr,r?"true":"false")}catch{}}}function le(r,e={}){var u,g;let{objectId:t,path:i,value:n}=r,{silent:a=!1,persist:s=!0,emitEvent:o=!0}=e,l=ni();if(!l){console.warn("[CONFIG] applyConfigOverride: No editable config found in window.__editableConfig");return}let c=t?(g=(u=l.objects)==null?void 0:u.get)==null?void 0:g.call(u,t):l.engine;if(!c){console.warn("[CONFIG] applyConfigOverride: Override target not found:",{objectId:t,path:i,hasObjects:!!l.objects});return}a||console.log("[CONFIG] applyConfigOverride: Target found, applying...",{objectId:t,path:i,value:n});let p;try{p=_r(c,i),xt(c,i,n)}catch(f){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:n},f);return}if(e.trackHistory!==!1){window.__configChanges=window.__configChanges||[];let f=window.__configChanges;f.push({objectId:t,path:i,oldValue:p,newValue:n,ts:Date.now()}),f.length>Do&&f.shift(),window.__configChangeRedo=[]}if(s){let f=Y(),h=f.findIndex(m=>m.objectId===t&&m.sceneId===r.sceneId&&m.path===i);h>=0?f[h].value=n:f.push(r),window.__configOverrides=f,ri(f),Et()||Pn(!0)}a||console.log("[CONFIG] Applied override:",r),o&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:r}))}function Te(r,e={}){let t=e.emitEvent!==!1,i=[];for(let n of r)n!=null&&n.objectId&&typeof n.objectId=="string"&&i.push(n.objectId),le(n,{...e,emitEvent:!1});if(t&&typeof window!="undefined"){let n=Array.from(new Set(i));window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch",objectIds:n,count:r.length}}))}}function ee(){window.__configOverrides=[],window.__configChanges=[],window.__configChangeRedo=[],ri([]),console.log("[CONFIG] Cleared all overrides")}function Mr(r){let e=Y().filter(i=>i.objectId!==r);window.__configOverrides=e,ri(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==r),ai(r),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:r}}))}function St(r,e){let t=Y().filter(n=>n.objectId!==r||n.path!==e);window.__configOverrides=t,ri(t);let i=window.__configChanges||[];window.__configChanges=i.filter(n=>n.objectId!==r||n.path!==e),r?ai(r):Mn(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:r,path:e}}))}function Y(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=$o()),window.__configOverrides||[])}function si(){if(typeof window=="undefined")return!1;let r=window.__configChanges||[];if(r.length===0)return!1;let e=r.pop();window.__configChangeRedo=window.__configChangeRedo||[],window.__configChangeRedo.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now()});let i=kn(),n=!1;if(i){let a=e.objectId?Ln(i.objects,e.objectId):i.engine;if(a){let s=_r(a,e.path);JSON.stringify(s)===JSON.stringify(e.oldValue)&&(n=!0)}}return n?St(e.objectId,e.path):(le({objectId:e.objectId,path:e.path,value:e.oldValue},{trackHistory:!1,persist:!0,emitEvent:!0}),e.objectId?ai(e.objectId):Mn()),console.log("[CONFIG] Undo:",e.path),!0}function oi(){if(typeof window=="undefined")return!1;let r=window.__configChangeRedo||[];if(r.length===0)return!1;let e=r.pop();return window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now()}),le({objectId:e.objectId,path:e.path,value:e.oldValue},{trackHistory:!1,persist:!0,emitEvent:!0}),e.objectId?ai(e.objectId):Mn(),console.log("[CONFIG] Redo:",e.path),!0}function xt(r,e,t){var s;let i=e.split("."),n=i.pop(),a=r;for(let o of i){if(a[o]!==void 0&&typeof a[o]!="object")throw new Error(`Invalid override path: ${e} (hit primitive at ${o})`);a[o]=(s=a[o])!=null?s:{},a=a[o]}a[n]=t}function _r(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function V(r){if(r===null||typeof r!="object")return r;if(r instanceof Date)return new Date(r.getTime());if(r instanceof Set)return new Set([...r].map(t=>V(t)));if(ArrayBuffer.isView(r))return r.slice();if(r instanceof Array)return r.map(t=>V(t));if(r instanceof Map){let t=new Map;return r.forEach((i,n)=>t.set(n,V(i))),t}let e={};for(let t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=V(r[t]));return e}function $e(){let r=window.__editableConfigBaseline;if(!r){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return Cr(e)}return Cr(r)}function Cr(r){let e={objects:{},scenes:{},engine:V(r.engine||{})},t=r.objects;if(t instanceof Map)t.forEach((a,s)=>{e.objects[s]=V(a)});else if(t&&typeof t=="object")for(let a in t)e.objects[a]=V(t[a]);let i=r.scenes;if(i instanceof Map)i.forEach((a,s)=>{e.scenes[s]=V(a)});else if(i&&typeof i=="object")for(let a in i)e.scenes[a]=V(i[a]);let n=Y();for(let a of n)a.objectId?(e.objects[a.objectId]||(e.objects[a.objectId]={}),xt(e.objects[a.objectId],a.path,a.value)):a.sceneId?(e.scenes[a.sceneId]||(e.scenes[a.sceneId]={}),xt(e.scenes[a.sceneId],a.path,a.value)):xt(e.engine,a.path,a.value);return e}function ye(){let r=Y(),e=new Set;for(let t of r)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:r.length,hasChanges:r.length>0,overrides:r}}async function li(r){let e=$e(),t={};for(let[n,a]of Object.entries(e.objects)){let s=a,o=n;/^(json\.|ui\.|effects\.|engine\.)/.test(o)||(o=`json.${n}`),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[n,a]of Object.entries(e.scenes)){let s=n.startsWith("scene.")?n:`scene.${n}`;t[`scenes/${s}.json`]=a}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Y().length>0,versionName:r})});if(!i.ok){let n=await i.json();throw new Error(`Apply failed: ${n.error||"Unknown error"}`)}ee();try{let n=ni();n&&(window.__editableConfigBaseline=V(n))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function At(){ee(),window.location.reload()}async function ci(){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"}`)}ee(),window.location.reload()}var kr,Do,Pr,K=pe(()=>{"use strict";kr="handler_preview_override_mode";if(typeof window!="undefined"){let r=window.localStorage.getItem(kr);window.__enableConfigOverrides=r===null?!0:r==="true"}Do=500;Pr={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[],window.__configChangeRedo=[]}}});function Ho(r,e){try{if(typeof r=="object"&&r!==null)return r;if(typeof r!="string")return null;if(r.startsWith("data:")){let i=r.indexOf(",");if(i===-1)return null;let n=r.slice(0,i);if(!n.includes("application/json")&&!n.includes("text/plain"))return null;let a=r.slice(i+1),s=n.includes("base64")?typeof atob=="function"?atob(a):a:decodeURIComponent(a);return JSON.parse(s)}let t=r.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(r):null}catch{return null}}function No(r){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=r.replace(/^\.\/+/,""),i=t.split("/").pop()||t,n=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let a of n){let s=e[a];if(s){let o=Ho(s,a);if(o!==null)return o}}return null}async function Ct(r){if(_n.has(r)&&!On)return console.log(`[CONFIG] Using cached config for: "${r}"`),_n.get(r);if(console.log(`[CONFIG] loadConfigFile called with: "${r}", MODE: ${H.toUpperCase()}, CACHE: ${On?"DISABLED":"ENABLED"}`),H==="publish"){let i=No(r);return i?(console.log(`[CONFIG] \u2713 Loaded ${r} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${r} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}H==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${r}"`);let e;H==="brand"?e=[`./${r.split("/").pop()||r}`,`./${r}`,`./${r.replace(/^configs\//,"")}`,`./${r.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${r}`,`./${r.replace(/^configs\//,"")}`,`./${r.replace(/^configs\//,"").replace(/\//g,".")}`],e=Array.from(new Set(e.flatMap(i=>i.startsWith("./")?[i,`/${i.slice(2)}`]:i.startsWith("/")?[i]:[i,`/${i}`]))),console.log("[CONFIG] Will try candidates:",e);let t=(async()=>{let i=On?"no-store":"force-cache";for(let n of e)try{let a=await fetch(n,{cache:i});if(!a.ok)continue;let s=await a.json();return console.log(`[CONFIG] \u2713 Loaded ${r} via ${n}`,s),s}catch(a){console.warn(`[CONFIG] \u2717 Failed to load ${n} (mode: ${H}):`,a)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${r}; using defaults`),{}})();return _n.set(r,t),t}async function di(){console.log("[CONFIG] Loading component schemas...");let r=["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 r)try{let i=H==="publish"||H==="brand"?t.split("/").pop()||t:`configs/${t}`,n=await Ct(i);n.component&&(e.set(n.component,n),console.log(`[CONFIG] \u2713 Schema loaded: ${n.component} ${H==="publish"||H==="brand"?"(flattened)":"(nested)"}`))}catch(i){console.warn(`[CONFIG] \u2717 Failed to load schema ${t}:`,i)}return console.log(`[CONFIG] Loaded ${e.size} component schemas`),e}async function Le(r){console.log(`[CONFIG] Loading object config: ${r}`);let e=H==="publish"||H==="brand"?`${r}.json`:`configs/objects/${r}.json`;return await Ct(e)}async function pi(r){let e=new Map;if(r.objects&&Array.isArray(r.objects)){for(let t of r.objects)if(t.enabled&&t.object_config)try{let i=t.instance_id;/^(json\.|ui\.|effects\.|engine\.)/.test(i)||(i=`json.${i}`);let n=await Le(i);(!n||Object.keys(n).length===0)&&i!==t.instance_id&&(n=await Le(t.instance_id)),!n||Object.keys(n).length===0?(console.log(`[CONFIG] No instance snapshot for ${t.instance_id}, using template ${t.object_config}`),n=await Le(t.object_config)):console.log(`[CONFIG] \u2713 Loaded instance snapshot for ${t.instance_id}`),e.set(t.instance_id,{...n,instance_id:t.instance_id,object_config:t.object_config})}catch(i){console.warn(`Failed to load object ${t.object_config}:`,i)}}return e}async function ui(){console.log("[CONFIG] Loading engine configs...");let r=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(r.map(i=>{let n=`engine.${i}.json`,a=H==="publish"||H==="brand"?n:`configs/engine/${n}`;return Ct(a)})),t=Object.fromEntries(r.map((i,n)=>[i,e[n]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(r.map(i=>{var s;let n=(s=t[i])!=null?s:{},a=Object.keys(n);return[i,a.length>0?a:"empty"]}))),t}async function In(){return await Ct(H==="publish"||H==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function gi(r="scene.main"){console.log(`[CONFIG] Loading scene config: ${r}`);let e=H==="publish"||H==="brand"?`${r}.json`:`configs/scenes/${r}.json`;return await Ct(e)}function Ze(r,e){let t=[];if(!r.identity)return t.push("Missing required identity component"),{valid:!1,errors:t};let i=e.get("identity");if(i)for(let n of i.required||[])r.identity[n]||t.push(`Missing required identity field: ${n}`);for(let[n,a]of Object.entries(r)){if(n==="identity")continue;let s=e.get(n);if(s&&a&&typeof a=="object"){let o=a;for(let l of s.required||[])o[l]===void 0&&t.push(`Missing required field in ${n}: ${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(`${n}.${l} value ${p} is below minimum ${d.min}`),d.max!==void 0&&p>d.max&&t.push(`${n}.${l} value ${p} is above maximum ${d.max}`))}}}}return{valid:t.length===0,errors:t}}function De(r,e){let t={...r},i=["identity","transform","render"];for(let[n,a]of e.entries())a.defaults&&Object.keys(a.defaults).length>0&&(i.includes(n)||t[n])&&(t[n]||(t[n]={}),t[n]={...a.defaults,...t[n]});return t}function te(r,e,t,i){return typeof r!="number"||!Number.isFinite(r)?e:Math.min(Math.max(r,t),i)}function Ir(r,e){if(Array.isArray(r))return{x:te(r[0],e.x,-2e3,2e3),y:te(r[1],e.y,-2e3,2e3)};if(!r||typeof r!="object")return e;let{x:t,y:i}=r;return{x:te(t,e.x,-2e3,2e3),y:te(i,e.y,-2e3,2e3)}}function Fo(r,e){if(Array.isArray(r))return{x:te(r[0],e.x,0,1),y:te(r[1],e.y,0,1)};if(!r||typeof r!="object")return e;let{x:t,y:i}=r;return{x:te(t,e.x,0,1),y:te(i,e.y,0,1)}}function Bo(r){if(Array.isArray(r))return{x:te(r[0],.5,-10,10),y:te(r[1],.5,-10,10)};if(r&&typeof r=="object"){let{x:e,y:t}=r;return{x:te(e,.5,-10,10),y:te(t,.5,-10,10)}}return typeof r=="string"?r:null}async function ve(r="scene.main",e){var l,c,p,d,u,g,f,h,m,b,y,v,S,x;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await di(),i=Y();i.length>0&&console.log(`[CONFIG] Applying ${i.length} active overrides`);let n=await gi(r);console.log(`[CONFIG] Scene config loaded: ${((l=n.objects)==null?void 0:l.length)||0} objects`);let a=await ui();console.log("[CONFIG] Loading object configs...");let s=await pi(n);console.log(`[CONFIG] Loaded ${s.size} object configs:`,Array.from(s.keys()));for(let[w,O]of s.entries()){let E=De(O,t),k=Ze(E,t);k.valid||console.warn(`Object ${w} validation errors:`,k.errors),(c=E.transform)!=null&&c.position&&(E.transform.position=Ir(E.transform.position,{x:0,y:0})),(p=E.transform)!=null&&p.offset&&(E.transform.offset=Ir(E.transform.offset,{x:0,y:0})),((d=E.transform)==null?void 0:d.anchor)!==void 0&&(E.transform.anchor=Bo(E.transform.anchor)),((u=E.transform)==null?void 0:u.position_ratio)!==void 0&&E.transform.position_ratio!==null&&(E.transform.position_ratio=Fo(E.transform.position_ratio,{x:.5,y:.5})),s.set(w,E)}if(e){if(e.objects)for(let[w,O]of e.objects.entries())s.set(w,O);e.engine&&(a.runtime={...a.runtime,...e.engine.runtime},a.assets={...a.assets,...e.engine.assets},a.splash={...(g=a.splash)!=null?g:{},...(f=e.engine.splash)!=null?f:{}})}let o={objects:s,engine:a,scene:n,schemas:t,theme:{background_color:"#ffffff",text_color:"#000000",square_color:"#cccccc",cta_background:"#007bff",cta_text:"#ffffff"},gameplay:{}};return typeof window!="undefined"&&(window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=De(o,t))),i.length>0&&Et()&&Te(i,{silent:!0,persist:!1}),console.log("[CONFIG] ===== Object-Centric Config Load Complete ====="),console.log("[CONFIG] Summary:",{schemas:Array.from(t.keys()),objects:Array.from(s.keys()),engine:{runtime:Object.keys((h=a.runtime)!=null?h:{}),assets:Object.keys((m=a.assets)!=null?m:{}),splash:Object.keys((b=a.splash)!=null?b:{}),loading:Object.keys((y=a.loading)!=null?y:{}),start:Object.keys((v=a.start)!=null?v:{}),tutorial:Object.keys((S=a.tutorial)!=null?S:{}),endgame:Object.keys((x=a.endgame)!=null?x:{})},scene:n.scene_id||"unknown"}),o}function jn(r){var t,i,n,a,s,o,l,c,p,d,u,g,f,h,m,b,y,v,S,x,w,O,E,k,I,C,A,M,L,_,P,$,T;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[j,R]of r.objects.entries()){let F=((t=R.identity)==null?void 0:t.id)||j;F.includes("character")&&(e.gameplay.character_pos=((i=R.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((n=R.transform)==null?void 0:n.scale)||1,e.gameplay.character_anim_speed=((s=(a=R.gameplay)==null?void 0:a.tuning)==null?void 0:s.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(o=R.gameplay)==null?void 0:o.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((p=(c=R.gameplay)==null?void 0:c.tuning)==null?void 0:p.relief_speed)||.22),(F.includes("gun")||F.includes("flame"))&&(e.gameplay.gun=R.gun||{},e.gameplay.gunmuzzle=((d=R.effects)==null?void 0:d.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=R.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=R.effects)==null?void 0:g.flame)||{}),F.includes("diamond")&&(e.gameplay.diamond=R),F.includes("ice")&&(e.gameplay.melt=R.melt||{},e.gameplay.melt_anchor=((f=R.transform)==null?void 0:f.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((h=R.transform)==null?void 0:h.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=R.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((b=R.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=R.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=R.hard_ice||{}),F.includes("water")&&(e.gameplay.water_drops=R),F.includes("crack")&&(e.gameplay.crack=R),F.includes("hand")&&(e.gameplay.hand=((v=R.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((S=R.transform)==null?void 0:S.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((x=R.transform)==null?void 0:x.scale)||1.5),F.includes("hazard")&&(e.gameplay.hazard=((w=R.gameplay)==null?void 0:w.tuning)||{},e.gameplay.danger_pos=((O=R.transform)==null?void 0:O.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((k=(E=R.gameplay)==null?void 0:E.tuning)==null?void 0:k.danger_pulse)||{},e.gameplay.hazard_height=((C=(I=R.gameplay)==null?void 0:I.tuning)==null?void 0:C.hazard_height)||140)}return e.gameplay.timeline=((A=r.engine.runtime)==null?void 0:A.timeline)||{},e.gameplay.drag_surface=((M=r.engine.runtime)==null?void 0:M.drag_surface)||{},e.gameplay.background=((L=r.engine.runtime)==null?void 0:L.background)||{},e.gameplay.ui_styles=((_=r.engine.runtime)==null?void 0:_.ui_styles)||{},e.gameplay.label_pulse=((P=r.engine.runtime)==null?void 0:P.label_pulse)||{},e.ui=(($=r.engine.runtime)==null?void 0:$.ui)||{},e.theme=((T=r.engine.runtime)==null?void 0:T.theme)||{},e.assets=r.engine.assets||{},e}var Or,H,_n,On,Rn=pe(()=>{"use strict";K();Or=null,H="dev";if(typeof window!="undefined"){let r=window.__BUILD_SETTINGS__;if(r!=null&&r.buildMode)Or=r,H=r.buildMode,console.log("[CONFIG] Loaded inline build settings:",r,"buildMode:",H);else try{let e=new XMLHttpRequest;if(e.open("GET","./build-settings.json",!1),e.send(),e.status===200&&e.responseText){let t=JSON.parse(e.responseText);Or=t,H=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",H)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",H)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",H);_n=new Map,On=H==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function zn(r,e){let t=[];function i(n,a,s=""){if(n!==a){if(typeof n!=typeof a){t.push(`${s}: type changed`);return}if(typeof n=="object"&&n!==null&&a!==null){let o=new Set([...Object.keys(n),...Object.keys(a)]);for(let l of o){let c=s?`${s}.${l}`:l;l in n?l in a?i(n[l],a[l],c):t.push(`${c}: removed`):t.push(`${c}: added`)}}else t.push(`${s}: changed`)}}return i(r,e),t}function $n(r,e,t,i){let n={...t};for(let[a,s]of i.entries())n[a]&&s.defaults&&(n[a]={...s.defaults,...n[a]});return n}var Tt,He,Dn=pe(()=>{"use strict";Tt=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},He=class{constructor(e=1e3){this.pollingInterval=null;this.fileHashes=new Map;this.callbacks=new Map;this.intervalMs=e}watch(e,t){this.callbacks.set(e,t),this.pollingInterval===null&&(this.pollingInterval=window.setInterval(()=>{this.checkAllFiles()},this.intervalMs))}async checkAllFiles(){for(let[e,t]of this.callbacks.entries())try{let i=`${e}?t=${Date.now()}&r=${Math.random()}`,n=await fetch(i,{cache:"no-cache",headers:{"Cache-Control":"no-cache"}});if(n.ok){let a=await n.text(),s=this.hashString(a),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(i){console.warn(`Failed to check ${e}:`,i)}}determineEventType(e){var t,i;return e.includes("/components/")?{type:"component",path:e,componentName:(t=e.split("/").pop())==null?void 0:t.replace(".schema.json","")}:e.includes("/engine/")?{type:"engine",path:e}:e.includes("/scenes/")?{type:"scene",path:e}:e.includes("/objects/")?{type:"object",path:e,objectId:(i=e.split("/").pop())==null?void 0:i.replace(".json","")}:{type:"object",path:e}}hashString(e){let t=0;for(let i=0;i<e.length;i++){let n=e.charCodeAt(i);t=(t<<5)-t+n,t=t&t}return t.toString()}unwatch(e){this.callbacks.delete(e),this.fileHashes.delete(e)}stop(){this.pollingInterval!==null&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.callbacks.clear(),this.fileHashes.clear()}}});function Nn(r){if(typeof window=="undefined")return;let e=typeof Hn!="undefined"&&!!Hn.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let n=null,a=!1,s=null;if(t){s=new He;let f=window.__configWatcher;f!=null&&f.stop&&f.stop(),window.__configWatcher=s}let o=new Set,l=f=>{var b,y;if(!s)return;let h=new Set;h.add("configs/engine/engine.runtime.json"),h.add("configs/engine/engine.assets.json"),h.add("configs/engine/engine.splash.json"),h.add("configs/scenes/scene.main.json");let m=(y=(b=f.scene)==null?void 0:b.objects)!=null?y:[];for(let v of m)v!=null&&v.object_config&&h.add(`configs/objects/${v.object_config}.json`);for(let v of o)h.has(v)||s.unwatch(v);for(let v of h)o.has(v)||s.watch(v,S=>g(S));o=h},c=new Set,p=!1,d=async f=>{let h=await Le(f),m=De(h,r.activeConfig.schemas),b=Ze(m,r.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${f} validation errors:`,b.errors),await r.liveEditBridge.applyObjectConfig(f,m)};async function u(f){if(!a){a=!0;try{if(p||c.size===0){r.audioSystem.destroy();let h=await ve("scene.main");r.setActiveConfig(h),r.gameObjectManager.updateConfig(h),r.CustomAssets.updateConfig(h),await r.CustomAssets.ready();let m=r.createAudioSystem(h);r.setAudioSystem(m),window.__audioSystem=m,await m.start(),r.liveEditBridge.rebuildIndexes(),l(h),console.log(`[GAME] Hot-reload complete (${f})`)}else{let h=Array.from(c);c.clear();for(let m of h)await d(m);console.log(`[GAME] Hot-reload updated objects: ${h.join(", ")}`)}}catch(h){console.warn("[GAME] Hot-reload failed:",h)}finally{a=!1,p=!1,c.clear()}}}function g(f){f.type==="object"&&f.objectId?c.add(f.objectId):p=!0,n&&window.clearTimeout(n),n=window.setTimeout(()=>{u(f.type)},120)}e&&Hn.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(r.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${o.size} files)`))}var Hn,jr=pe(()=>{"use strict";Dn();Rn();Hn={}});var Rr={};ft(Rr,{ConfigWatcher:()=>He,DefaultReloadStrategy:()=>Tt,applyDefaults:()=>De,diffConfigs:()=>zn,loadAllObjectConfigs:()=>pi,loadComponentSchemas:()=>di,loadEngineConfig:()=>ui,loadGamePromptConfig:()=>In,loadObjectCentricConfig:()=>ve,loadObjectConfig:()=>Le,loadSceneConfig:()=>gi,rehydrateObject:()=>$n,setupHotReload:()=>Nn,toLegacyFormat:()=>jn,validateObjectConfig:()=>Ze});var hi=pe(()=>{"use strict";Rn();Dn();jr()});var ws={};ft(ws,{AssetEditorModal:()=>va});var va,wa=pe(()=>{"use strict";va=class{constructor(){this.modal=null;this.currentObjectId=null;this.currentPath=null;this.currentAsset="";this.onApplyCallback=null}show(e,t,i,n){this.currentObjectId=e,this.currentPath=t,this.currentAsset=i,this.onApplyCallback=n,this.createModal(e,i),document.body.appendChild(this.modal),this.attachModalListeners()}createModal(e,t){let i=document.createElement("div");i.className="asset-editor-modal",i.innerHTML=`
2
2
  <div class="asset-editor-card">
3
3
  <div class="asset-editor-header">
4
4
  <div>
@@ -43,7 +43,7 @@
43
43
  <button class="debug-btn primary" data-modal-apply>Apply</button>
44
44
  </div>
45
45
  </div>
46
- `,this.modal=i}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(o=>{o.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(o=>{o.addEventListener("click",s=>{let c=s.target.dataset.tab;c&&this.switchTab(c)})});let i=this.modal.querySelector("[data-ai-generate]");i==null||i.addEventListener("click",()=>{this.openAiEditor("generate")});let n=this.modal.querySelector("[data-ai-edit]");n==null||n.addEventListener("click",()=>{this.openAiEditor("edit")});let a=this.modal.querySelector("[data-modal-apply]");a==null||a.addEventListener("click",()=>{this.apply()}),this.modal.addEventListener("click",o=>{o.target===this.modal&&this.close()})}switchTab(e){if(!this.modal)return;this.modal.querySelectorAll("[data-tab]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let t=window.__openAiEditor;if(typeof t!="function"){alert("AI Editor not available. Please check your setup.");return}let i="";e==="edit"&&this.currentAsset?i=`Edit this image: ${this.currentObjectId}`:i=`Create an image for: ${this.currentObjectId}`,t(this.currentObjectId||"unknown",i,this.currentAsset,{path:this.currentPath,onApply:n=>{this.onApplyCallback&&this.onApplyCallback(n),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var Sl={};ft(Sl,{COLORS:()=>ce,ConfigWatcher:()=>De,DebugPanel:()=>It,DefaultReloadStrategy:()=>Ct,Handler:()=>ae,PlayableLoadingScreen:()=>Ki,PreviewShell:()=>Vi,STROKE_WIDTH:()=>Co,THEME:()=>To,applyConfigOverride:()=>Ae,applyConfigOverrides:()=>Ce,applyConfigsToDisk:()=>ri,applyDefaults:()=>$e,baseLottie:()=>pn,bootstrap:()=>ul,clearConfigOverrides:()=>ee,clearConfigOverridesForObject:()=>Tr,configOverrideManager:()=>Lr,createPreviewShell:()=>ba,deepClone:()=>V,default:()=>Oe,defaultPreset:()=>ui,deviceGroups:()=>$n,devicePresets:()=>zn,diffConfigs:()=>Mn,exportConfigsAsJSON:()=>ze,getConfigOverrides:()=>Y,getConfigStateSummary:()=>Xe,getOverrideMode:()=>Et,getPresetById:()=>He,getPresetsByCategory:()=>Fs,loadAllObjectConfigs:()=>li,loadComponentSchemas:()=>si,loadEngineConfig:()=>ci,loadGamePromptConfig:()=>Ln,loadObjectCentricConfig:()=>be,loadObjectConfig:()=>Te,loadSceneConfig:()=>di,rehydrateObject:()=>_n,removeConfigOverride:()=>ai,resetToApplied:()=>St,resetToOriginal:()=>oi,setBootstrapDependencies:()=>dl,setOverrideMode:()=>An,setupHotReload:()=>jn,setupLiveEditBridge:()=>Wi,toLegacyFormat:()=>kn,validateObjectConfig:()=>Ze});module.exports=Wo(Sl);var xe={};function Gt(r,e,t=!1){xe[r]||(xe[r]=[]),xe[r].push({fn:e,once:t})}function sn(r,e){if(xe[r]){if(!e){delete xe[r];return}xe[r]=xe[r].filter(t=>t.fn!==e)}}function qt(r,...e){let t=xe[r];if(t)for(let i of[...t])i.fn(...e),i.once&&sn(r,i.fn)}function J(r,e){Gt(r,e,!0)}var G=null,ie=[],Ve=null;function za(r){G=r,ie=[],Ve!==null&&(clearTimeout(Ve),Ve=null)}function $a(){var r,e,t;return{endpoint:(G==null?void 0:G.endpoint)||"",transport:(G==null?void 0:G.transport)||"beacon",batchSize:(r=G==null?void 0:G.batchSize)!=null?r:10,flushIntervalMs:(e=G==null?void 0:G.flushIntervalMs)!=null?e:300,maxQueue:(t=G==null?void 0:G.maxQueue)!=null?t:200,debug:!!(G!=null&&G.debug)}}async function ja(r,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(r,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function ln(r,e){let t=$a();if(e&&t.endpoint){if(ie.push(r),ie.length>t.maxQueue&&(ie=ie.slice(ie.length-t.maxQueue)),ie.length>=t.batchSize){Ra();return}Ve===null&&(Ve=window.setTimeout(()=>{Ve=null,Ra()},t.flushIntervalMs))}}async function Ra(){let r=$a();if(!r.endpoint||ie.length===0)return;let e=ie.splice(0,r.batchSize);await ja(r.endpoint,{events:e},r.transport,r.debug),ie.length>0&&await ja(r.endpoint,{events:ie.splice(0,r.batchSize)},r.transport,r.debug)}function Da(r){return Math.max(0,Math.min(1,r))}function Yo(r){let e=String(r!=null?r:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function mt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Ko(r,e){let t=r==null?void 0:r[e];return typeof t=="number"?t:0}function Ha(r,e,t){try{r[e]=t}catch{}}function Xo(r){let e=r==null?void 0:r.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function Na(r,e){let t=r==null?void 0:r.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Fa(r,e){let t=Xo(r);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function Ba(){let r=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,s(),r.size>0&&i()})},n=p=>{var u;r.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},a=p=>{r.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},o=p=>{p.killed||(p.killed=!0,a(p))},s=()=>{var d,u;let p=mt();for(let g of Array.from(r)){if(g.killed||g.paused)continue;let f=p-g.startMs-g.delayMs;if(f<0)continue;let h=g.durationMs>0?f/g.durationMs:1,m=Da(h),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(h),b-1):0;if(g.repeat>0&&h>=1){let A=h-y;m=Da(A)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let A of g.props)Ha(g.target,A.key,A.from+(A.to-A.from)*v);g.scaleFrom&&g.scaleTo&&Na(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(d=g.onUpdate)==null||d.call(g)}catch{}if(h>=b){o(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(p,d,u)=>{var A;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),f=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((A=u==null?void 0:u.delayMsOverride)!=null?A:0)),h=Yo(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 L of Object.keys(d)){if(y.has(L))continue;let $=d[L];typeof $=="number"&&v.push({key:L,from:Ko(p,L),to:$})}let w=Fa(p,d);return{target:p,startMs:mt(),delayMs:f,durationMs:g,ease:h,props:v,scaleFrom:w.from,scaleTo:w.to,repeat:m,yoyo:b,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return n(u),{kill:()=>o(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=mt())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:mt(),f=mt()-g;u.startMs+=f,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let g of Object.keys(d)){let f=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof f=="number"&&Ha(p,g,f)}let u=Fa(p,d);u.to&&Na(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,f=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{d.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,w){return m({kind:"to",target:y,vars:v,atMs:h(w)}),b},fromTo(y,v,w,A){return m({kind:"fromTo",target:y,vars:w,from:v,atMs:h(A)}),b},play(){var y,v;if(g)return b;g=!0,f=[];for(let w of d)w.kind==="fromTo"&&c.set(w.target,(y=w.from)!=null?y:{}),f.push(c.to(w.target,{...w.vars,delay:w.atMs/1e3+((v=w.vars.delay)!=null?v:0)}));return b},pause(){for(let y of f)y.pause();return b},kill(){for(let y of f)y.kill();f=[],g=!1}};return p.paused||b.play(),b}};return c}function Ua(){if(typeof window=="undefined")return;let r=window;if(!r.gsap)try{r.gsap=Ba()}catch{}}var Ga={name:"handler-playable-sdk",version:"0.5.34",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 Z=0,Zo=Z++,qa=Z++,Va=Z++,Wa=Z++,Ya=Z++,Ka=Z++,Xa=Z++,Ja=Z++,Za=Z++,Qa=Z++,er=Z++,tr=Z++,B=Zo;function ir(){return B===qa}function nr(){return B===Va}function ar(){return B===Wa}function rr(){return B===Ya}function We(){return B===Ka}function Ye(){return B===Xa}function or(){return B===Ja}function sr(){return B===Za}function lr(){return B===Qa}function cn(){return B===er}function dn(){return B===tr}function cr(){let r=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(r==="mraid")try{mraid.getState(),B=qa;return}catch{}else if(r==="dapi")try{dapi.isReady(),B=Va;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(B=Wa)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(B=Ya)}catch{}else if(e==="mintegral")window.gameReady&&(B=Ka);else if(e==="tapjoy")window.TJ_API&&(B=Xa);else if(e==="tiktok")window.openAppStore&&(B=Ja);else if(e==="smadex")try{window.smxTracking&&(B=Za)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(B=Qa)}catch{}else e==="vungle"?B=er:(r==="nucleo"||e==="nucleo")&&(B=tr)}var Vt=qe(require("lottie-web"),1),pn=Vt.default;typeof window!="undefined"&&(window.lottie=Vt.default,window.__baseLottie=Vt.default);var Qo=require("pixi.js");var un=require("pixi.js");var es=null;function gn(r){es=r}Wt();hn();var bt=require("pixi.js");Wt();var os=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",yn=os;if(typeof window!="undefined")try{let r=new XMLHttpRequest;if(r.open("GET","./build-settings.json",!1),r.send(),r.status===200&&r.responseText){let e=JSON.parse(r.responseText);e!=null&&e.buildMode&&(yn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${yn}`))}}catch{}function ss(r){var t,i,n,a,o;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(r);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(r))return{x:(t=r[0])!=null?t:.5,y:(i=r[1])!=null?i:.5};if(r&&typeof r=="object"&&"x"in r&&"y"in r)return{x:(n=r.x)!=null?n:.5,y:(a=r.y)!=null?a:.5};if(typeof r=="string"){let s=r.trim().toLowerCase();return(o=e[s])!=null?o:{x:.5,y:.5}}return null}var Se=class{static async create(e,t,i){var l,c,p,d,u,g,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${yn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let h=new bt.Container;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let o=await je.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=o==null?void 0:o.constructor)==null?void 0:p.name}`);let s;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",o,"for object:",e),s=new bt.Sprite(o),console.log("[ObjectFactory] Created object:",s,"type:",(d=s==null?void 0:s.constructor)==null?void 0:d.name),this.applyTransform(s,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=o==null?void 0:o.constructor)==null?void 0:u.name,o),o&&(((g=o.constructor)==null?void 0:g.name)==="Container"||o instanceof bt.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let b of h)try{let y=await fetch(b);if(y.ok){s=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(f=s==null?void 0:s.constructor)==null?void 0:f.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),s=o)}else s=o;else s=o,s&&typeof s=="object"&&("x"in s||"position"in s)&&this.applyTransform(s,t==null?void 0:t.transform,t);return s}static applyTransform(e,t,i){var n,a,o,s;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((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=ss(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 yt=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 ds=qe(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=ds);Ke();var Yt=require("pixi.js");Ke();var xn=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new yt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var s;let o=this.registry.get(a);if(!o){console.warn("[Assets] No config found for object:",a);return}try{let l=await Se.create(a,o,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(s=l==null?void 0:l.constructor)==null?void 0:s.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Se.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},ps=new xn,us=new Proxy(ps,{get(r,e){if(e in r&&typeof r[e]=="function")return r[e].bind(r);if(r.get(e))return r.get(e)}});Ke();var fr=require("pixi.js"),he={width:400,height:600,designWidth:400,scaleFactor:1},Xt={scale:1,position:1},Sn=[];function hs(r,e,t,i,n,a,o){Sn.push({element:r,originalScale:a,positionHelper:e,heightPercent:n}),e(r,t,i,n,a,o,!1)}function fs(){Sn.forEach(({element:r,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*he.scaleFactor;t(r,he.width,he.height,i,n,!0,!1)})}function En(r,e){console.log(`[SCREEN] updateScreenState called: ${r}x${e}`),he.width=r,he.height=e,he.scaleFactor=Math.min(r/he.designWidth,1.15),Xt.scale=he.scaleFactor,Xt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Xt.scale.toFixed(3)}`),fs()}var wt={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 ms(r,e,t){let i=wt[r];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${r}.${e} = ${t}`))}function bs(){return wt}var ys={center:{x:.5,y:.5},"center-center":{x:.5,y:.5},middle:{x:.5,y:.5},"middle-center":{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},"left-center":{x:0,y:.5},"right-center":{x:1,y:.5},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};function Kt(r,e){return typeof r=="number"&&Number.isFinite(r)?r:e}function Jt(r,e={x:.5,y:.5}){var t;if(Array.isArray(r))return{x:Kt(r[0],e.x),y:Kt(r[1],e.y)};if(r&&typeof r=="object"){let i=r;return{x:Kt(i.x,e.x),y:Kt(i.y,e.y)}}if(typeof r=="string"){let i=r.trim().toLowerCase();return(t=ys[i])!=null?t:e}return e}function mr(r,e,t,i={}){var g,f,h,m,b,y;let n=Jt(t),a=(g=i.inset)!=null?g:{},o=(f=i.padding)!=null?f:{x:0,y:0},s=((h=a.left)!=null?h:0)+o.x,l=((m=a.right)!=null?m:0)+o.x,c=((b=a.top)!=null?b:0)+o.y,p=((y=a.bottom)!=null?y:0)+o.y,d=Math.max(0,r-s-l),u=Math.max(0,e-c-p);return{x:s+d*n.x,y:c+u*n.y}}function br(r,e,t,i={}){var h,m,b,y,v,w;let n=(h=i.inset)!=null?h:{},a=(m=i.padding)!=null?m:{x:0,y:0},o=((b=n.left)!=null?b:0)+a.x,s=((y=n.right)!=null?y:0)+a.x,l=((v=n.top)!=null?v:0)+a.y,c=((w=n.bottom)!=null?w:0)+a.y,p=Math.max(0,r-o-s),d=Math.max(0,e-l-c),u=Jt(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:o+p*g,y:l+d*f}}if(typeof window!="undefined"){let r=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==r||n!==e)&&(r=i,e=n,En(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),En(window.innerWidth,window.innerHeight),window.updateDebugConfig=ms,window.getDebugConfig=bs,window.copyConfig=Ps,window.applyConfig=vt,window.applyConfigForRatio=Ms,window.positionAtBottom=yr,window.positionAtTop=xs,window.positionAtCenter=Es,window.positionAtLeft=Ss,window.positionAtRight=As,window.positionAtBottomLeft=Cs,window.positionAtBottomRight=Ts,window.positionAtTopLeft=Ls,window.positionAtTopRight=ks,window.applyPositionContract=ws,console.log("\u{1F3AE} Debug Config Functions Available:"),console.log("\u2022 updateDebugConfig(category, key, value)"),console.log("\u2022 getDebugConfig()"),console.log("\u2022 copyConfig(presetName)"),console.log("\u2022 applyConfig(config)"),console.log("\u2022 applyConfigForRatio(width, height)"),console.log("\u{1F4CD} Positioning Helpers Available (with scale):"),console.log("\u2022 positionAtBottom(element, w, h, percent, scale)"),console.log("\u2022 positionAtTop(element, w, h, percent, scale)"),console.log("\u2022 positionAtCenter(element, w, h, offsetX, offsetY, scale)"),console.log("\u2022 positionAtLeft/Right(element, w, h, percent, scale)"),console.log("\u2022 Corner positions: BottomLeft/Right, TopLeft/Right (all with scale)"),console.log("\u2022 applyPositionContract(element, w, h, contract)"),console.log("Example: positionAtCenter(mySprite, 400, 600, 0, -50, 1.2)")}function Zt(r,e,t=0){return r*e+t}function Qt(r,e,t=0){return r*(1-e)+t}function ei(r,e,t=0){return r*e+t}function ti(r,e,t=0){return r*(1-e)+t}function Q(r,e=0){return r/2+e}function vs(r,e){return r*e}function ws(r,e,t,i){var o,s,l,c,p,d,u,g,f,h,m,b,y,v,w,A,L,$,x,_;let n=0,a=0;switch(i.type){case"top":n=Q(e,(s=(o=i.offset)==null?void 0:o.x)!=null?s:0),a=Zt(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=Q(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),a=Qt(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=ei(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),a=Q(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=ti(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),a=Q(t,(A=(w=i.offset)==null?void 0:w.y)!=null?A:0);break;case"center":n=Q(e,($=(L=i.offset)==null?void 0:L.x)!=null?$:0),a=Q(t,(_=(x=i.offset)==null?void 0:x.y)!=null?_:0);break}r.position?r.position.set(n,a):(r.x=n,r.y=a),i.scale!==void 0&&i.scale!==1&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(i.scale,i.scale):(r.scale.x=i.scale,r.scale.y=i.scale))}function yr(r,e,t,i=.2,n=1,a=!0,o=!1){let s=vs(t,i),l=Qt(t,i/2);fe(r,Q(e),l);let c=a?n*he.scaleFactor:n;me(r,c),o&&!Sn.find(p=>p.element===r)&&hs(r,yr,e,t,i,n,a)}function xs(r,e,t,i=.1,n=1){fe(r,Q(e),Zt(t,i)),me(r,n)}function Es(r,e,t,i=0,n=0,a=1){fe(r,Q(e,i),Q(t,n)),me(r,a)}function Ss(r,e,t,i=.1,n=1){fe(r,ei(e,i),Q(t)),me(r,n)}function As(r,e,t,i=.1,n=1){fe(r,ti(e,i),Q(t)),me(r,n)}function Cs(r,e,t,i=.05,n=.05,a=1){fe(r,ei(e,n),Qt(t,i)),me(r,a)}function Ts(r,e,t,i=.05,n=.05,a=1){fe(r,ti(e,n),Qt(t,i)),me(r,a)}function Ls(r,e,t,i=.05,n=.05,a=1){fe(r,ei(e,n),Zt(t,i)),me(r,a)}function ks(r,e,t,i=.05,n=.05,a=1){fe(r,ti(e,n),Zt(t,i)),me(r,a)}function fe(r,e,t){r&&r.position?typeof r.position.set=="function"?r.position.set(e,t):(r.position.x=e,r.position.y=t):r&&(r.x=e,r.y=t)}function me(r,e){e!==1&&r&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(e,e):r.scale.x!==void 0&&r.scale.y!==void 0&&(r.scale.x=e,r.scale.y=e))}var 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 Ps(r){return r&&Re[r]?JSON.parse(JSON.stringify(Re[r])):JSON.parse(JSON.stringify(wt))}function vt(r){Object.keys(r).forEach(e=>{let t=e;wt[t]&&r[t]&&Object.assign(wt[t],r[t])}),console.log("Config applied:",r)}function Ms(r,e){let t=r/e;t>1.6?(vt(Re.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(vt(Re.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(vt(Re.square),console.log("Applied SQUARE config for ratio:",t)):(vt(Re.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let r=window;r.configPresets=Re,r.resolveAnchorVec2=r.resolveAnchorVec2||Jt,r.resolveScreenAnchorPoint=r.resolveScreenAnchorPoint||mr,r.resolveScreenRatioPoint=r.resolveScreenRatioPoint||br}pi();function q(r,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(r,e);return`${r/i}:${e/i}`}var Jc=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:q(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:q(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:q(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:q(360,780)}],Zc=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:q(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:q(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:q(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:q(412,915)}],Qc=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:q(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:q(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:q(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:q(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:q(800,1280)}],Rn=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:q(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:q(768,1024),mraidScale:.7}];var zn=[...Rn],$n=[{category:"playable",label:"Playable Ad",devices:Rn}],ui=Rn[0];function He(r){return zn.find(e=>e.id===r)||ui}function Fs(r){return zn.filter(e=>e.category===r)}X();var Qe=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let o=a(e);if(!o){console.error("[PropertyUpdateManager] Config not found for:",e);return}Ae({objectId:e,path:t,value:i},{persist:!0});let s=window.applyEditableObjectConfig;if(typeof s=="function"){let d=window.__editableConfig,u=(p=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?p:o;await s(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function Dn(r){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let o=n.result,s=r.category||"misc",c=`${(r.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:s,filename:`${c}.png`,data:o,overwrite:!0})})).json();if(!(d!=null&&d.success)){alert(`Upload failed: ${(d==null?void 0:d.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(s,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await r.onApply(d.path)}catch(p){console.error("[QuickActionsBar] Upload error:",p),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var gi=class{constructor(){this.updateManager=new Qe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let o=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let s=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";s&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,o);break;case"ai-edit":this.openAIEditor(t,i,o);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,o);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let o=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",o),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",o)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var s,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===a||p.slotId===a)){let p=((s=t.identity)==null?void 0:s.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),n.categories&&!n.categories.includes(p)&&n.categories.push(p),n.libraryAssets&&!n.libraryAssets[p]&&(n.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let o=window.__updateWorkbenchTabs;typeof o=="function"&&o()}if(n.libraryPanel){let o=window.getEditableObjectConfig,s=o==null?void 0:o(e),l=(a=s==null?void 0:s.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var o;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((o=n==null?void 0:n.identity)==null?void 0:o.category)||(t.split(".")[0]==="render"?"environment":"ui");Dn({objectId:e,category:a,onApply:async s=>{var p,d;await this.updateManager.updateProperty(e,t,s);let l=window.__debugContext;(d=(p=l==null?void 0:l.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,s);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),o=window.__editableConfig;if(!(o!=null&&o.schemas))return;let s=null;if(o.schemas instanceof Map?s=o.schemas.get(n):typeof o.schemas=="object"&&(s=o.schemas[n]),!(s!=null&&s.defaults))return;let l=s.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let o=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,s="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",s),n(e,o,"",{objectId:e,path:s});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var Bs=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],Us=["environment","ui","character","system","backgrounds"],Gs=["bg","world","ui"],Or={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},hi=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
46
+ `,this.modal=i}attachModalListeners(){if(!this.modal)return;this.modal.querySelectorAll("[data-modal-close]").forEach(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 i=this.modal.querySelector("[data-ai-generate]");i==null||i.addEventListener("click",()=>{this.openAiEditor("generate")});let n=this.modal.querySelector("[data-ai-edit]");n==null||n.addEventListener("click",()=>{this.openAiEditor("edit")});let a=this.modal.querySelector("[data-modal-apply]");a==null||a.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(n=>{n.classList.toggle("active",n.getAttribute("data-tab")===e)}),this.modal.querySelectorAll("[data-tab-panel]").forEach(n=>{n.classList.toggle("active",n.getAttribute("data-tab-panel")===e)})}openAiEditor(e){let t=window.__openAiEditor;if(typeof t!="function"){alert("AI Editor not available. Please check your setup.");return}let i="";e==="edit"&&this.currentAsset?i=`Edit this image: ${this.currentObjectId}`:i=`Create an image for: ${this.currentObjectId}`,t(this.currentObjectId||"unknown",i,this.currentAsset,{path:this.currentPath,onApply:n=>{this.onApplyCallback&&this.onApplyCallback(n),this.close()}})}apply(){this.onApplyCallback&&this.onApplyCallback("library/placeholder.png"),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.currentObjectId=null,this.currentPath=null,this.onApplyCallback=null}}});var Cl={};ft(Cl,{COLORS:()=>de,ConfigWatcher:()=>He,DebugPanel:()=>jt,DefaultReloadStrategy:()=>Tt,Handler:()=>ae,PlayableLoadingScreen:()=>Zi,PreviewShell:()=>Ki,STROKE_WIDTH:()=>ks,THEME:()=>Ms,applyConfigOverride:()=>le,applyConfigOverrides:()=>Te,applyConfigsToDisk:()=>li,applyDefaults:()=>De,baseLottie:()=>hn,bootstrap:()=>hl,clearConfigOverrides:()=>ee,clearConfigOverridesForObject:()=>Mr,configOverrideManager:()=>Pr,createPreviewShell:()=>Sa,deepClone:()=>V,default:()=>Ie,defaultPreset:()=>fi,deviceGroups:()=>Un,devicePresets:()=>Bn,diffConfigs:()=>zn,exportConfigsAsJSON:()=>$e,getConfigOverrides:()=>Y,getConfigStateSummary:()=>ye,getOverrideMode:()=>Et,getPresetById:()=>Ne,getPresetsByCategory:()=>Uo,loadAllObjectConfigs:()=>pi,loadComponentSchemas:()=>di,loadEngineConfig:()=>ui,loadGamePromptConfig:()=>In,loadObjectCentricConfig:()=>ve,loadObjectConfig:()=>Le,loadSceneConfig:()=>gi,redoLastConfigChange:()=>oi,rehydrateObject:()=>$n,removeConfigOverride:()=>St,resetToApplied:()=>At,resetToOriginal:()=>ci,setBootstrapDependencies:()=>ul,setOverrideMode:()=>Pn,setupHotReload:()=>Nn,setupLiveEditBridge:()=>Xi,toLegacyFormat:()=>jn,undoLastConfigChange:()=>si,validateObjectConfig:()=>Ze});module.exports=Xs(Cl);var Se={};function qt(r,e,t=!1){Se[r]||(Se[r]=[]),Se[r].push({fn:e,once:t})}function dn(r,e){if(Se[r]){if(!e){delete Se[r];return}Se[r]=Se[r].filter(t=>t.fn!==e)}}function Vt(r,...e){let t=Se[r];if(t)for(let i of[...t])i.fn(...e),i.once&&dn(r,i.fn)}function J(r,e){qt(r,e,!0)}var G=null,ie=[],We=null;function Ba(r){G=r,ie=[],We!==null&&(clearTimeout(We),We=null)}function Ua(){var r,e,t;return{endpoint:(G==null?void 0:G.endpoint)||"",transport:(G==null?void 0:G.transport)||"beacon",batchSize:(r=G==null?void 0:G.batchSize)!=null?r:10,flushIntervalMs:(e=G==null?void 0:G.flushIntervalMs)!=null?e:300,maxQueue:(t=G==null?void 0:G.maxQueue)!=null?t:200,debug:!!(G!=null&&G.debug)}}async function Na(r,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(r,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function pn(r,e){let t=Ua();if(e&&t.endpoint){if(ie.push(r),ie.length>t.maxQueue&&(ie=ie.slice(ie.length-t.maxQueue)),ie.length>=t.batchSize){Fa();return}We===null&&(We=window.setTimeout(()=>{We=null,Fa()},t.flushIntervalMs))}}async function Fa(){let r=Ua();if(!r.endpoint||ie.length===0)return;let e=ie.splice(0,r.batchSize);await Na(r.endpoint,{events:e},r.transport,r.debug),ie.length>0&&await Na(r.endpoint,{events:ie.splice(0,r.batchSize)},r.transport,r.debug)}function Ga(r){return Math.max(0,Math.min(1,r))}function Js(r){let e=String(r!=null?r:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function mt(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function Zs(r,e){let t=r==null?void 0:r[e];return typeof t=="number"?t:0}function qa(r,e,t){try{r[e]=t}catch{}}function Qs(r){let e=r==null?void 0:r.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function Va(r,e){let t=r==null?void 0:r.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function Wa(r,e){let t=Qs(r);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function Ya(){let r=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),r.size>0&&i()})},n=p=>{var u;r.add(p);let d=(u=e.get(p.target))!=null?u:new Set;d.add(p),e.set(p.target,d),i()},a=p=>{r.delete(p);let d=e.get(p.target);d&&(d.delete(p),d.size===0&&e.delete(p.target))},s=p=>{p.killed||(p.killed=!0,a(p))},o=()=>{var d,u;let p=mt();for(let g of Array.from(r)){if(g.killed||g.paused)continue;let f=p-g.startMs-g.delayMs;if(f<0)continue;let h=g.durationMs>0?f/g.durationMs:1,m=Ga(h),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(h),b-1):0;if(g.repeat>0&&h>=1){let x=h-y;m=Ga(x)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let x of g.props)qa(g.target,x.key,x.from+(x.to-x.from)*v);g.scaleFrom&&g.scaleTo&&Va(g.target,{x:g.scaleFrom.x+(g.scaleTo.x-g.scaleFrom.x)*v,y:g.scaleFrom.y+(g.scaleTo.y-g.scaleFrom.y)*v});try{(d=g.onUpdate)==null||d.call(g)}catch{}if(h>=b){s(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(p,d,u)=>{var x;let g=Math.max(0,(typeof d.duration=="number"?d.duration:.5)*1e3),f=Math.max(0,(typeof d.delay=="number"?d.delay:0)*1e3+((x=u==null?void 0:u.delayMsOverride)!=null?x:0)),h=Js(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 w of Object.keys(d)){if(y.has(w))continue;let O=d[w];typeof O=="number"&&v.push({key:w,from:Zs(p,w),to:O})}let S=Wa(p,d);return{target:p,startMs:mt(),delayMs:f,durationMs:g,ease:h,props:v,scaleFrom:S.from,scaleTo:S.to,repeat:m,yoyo:b,onUpdate:typeof d.onUpdate=="function"?d.onUpdate:void 0,onComplete:typeof d.onComplete=="function"?d.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(p,d){let u=l(p,d);return n(u),{kill:()=>s(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=mt())},resume:()=>{var h;if(!u.paused)return;let g=(h=u.pauseAtMs)!=null?h:mt(),f=mt()-g;u.startMs+=f,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(p,d,u){return c.set(p,d),c.to(p,u)},set(p,d){if(!p||!d)return;for(let g of Object.keys(d)){let f=d[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof f=="number"&&qa(p,g,f)}let u=Wa(p,d);u.to&&Va(p,u.to)},killTweensOf(p){let d=e.get(p);if(d)for(let u of Array.from(d))s(u)},timeline(p={}){let d=[],u=0,g=!1,f=[],h=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{d.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,S){return m({kind:"to",target:y,vars:v,atMs:h(S)}),b},fromTo(y,v,S,x){return m({kind:"fromTo",target:y,vars:S,from:v,atMs:h(x)}),b},play(){var y,v;if(g)return b;g=!0,f=[];for(let S of d)S.kind==="fromTo"&&c.set(S.target,(y=S.from)!=null?y:{}),f.push(c.to(S.target,{...S.vars,delay:S.atMs/1e3+((v=S.vars.delay)!=null?v:0)}));return b},pause(){for(let y of f)y.pause();return b},kill(){for(let y of f)y.kill();f=[],g=!1}};return p.paused||b.play(),b}};return c}function Ka(){if(typeof window=="undefined")return;let r=window;if(!r.gsap)try{r.gsap=Ya()}catch{}}var Xa={name:"handler-playable-sdk",version:"0.5.38",type:"module",description:"Handler Playable SDK v0.1 with contract-aligned surface (root sandbox, canonical event envelope).",main:"dist/index.cjs",module:"dist/index.js",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./pixi":{types:"./dist/pixi/index.d.ts",import:"./dist/pixi/index.js",require:"./dist/pixi/index.cjs"},"./pixi/index.css":{import:"./dist/pixi/index.css",require:"./dist/pixi/index.css"},"./three":{types:"./dist/three/index.d.ts",import:"./dist/three/index.js",require:"./dist/three/index.cjs"},"./cli":{types:"./dist/cli/index.d.ts",import:"./dist/cli/index.js",require:"./dist/cli/index.cjs"}},bin:{"handler-student-helper":"./bin/student-helper.mjs","handler-validate":"./bin/validate.mjs","handler-sync-screens":"./bin/sync-screens.mjs","handler-brand-dna":"./bin/brand-dna.mjs","handler-setup-library":"./bin/setup-library.mjs","handler-screen-helper":"./bin/screen-helper.mjs"},scripts:{prebuild:"python3 src/preview/build-css.py",build:"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --minify --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli && npm run obfuscate && npm run postbuild",postbuild:"python3 src/preview/copy-css-to-dist.py","postbuild-cli":"cp src/cli/*.mjs dist/cli/ && chmod +x dist/cli/*.mjs && chmod +x bin/*.mjs","create-mjs-symlinks":"cd dist && ln -sf index.js index.mjs && cd pixi && ln -sf index.js index.mjs && cd ../three && ln -sf index.js index.mjs","build:dev":"tsup src/index.ts src/pixi/index.ts src/three/index.ts src/cli/index.ts --format cjs,esm --dts --clean --external lottie-web && npm run create-mjs-symlinks && npm run postbuild-cli",obfuscate:"javascript-obfuscator dist/pixi/index.js --output dist/pixi/index.js --config obfuscator.config.json && javascript-obfuscator dist/three/index.js --output dist/three/index.js --config obfuscator.config.json && javascript-obfuscator dist/cli/index.js --output dist/cli/index.js --config obfuscator.config.json && npm run obfuscate-cli","obfuscate-cli":'for file in dist/cli/*.mjs; do javascript-obfuscator "$file" --output "$file" --config obfuscator.config.json; done',lint:"eslint 'src/**/*.{ts,tsx}'",typecheck:"tsc --noEmit",prepublishOnly:"npm run build","publish:update":"node scripts/publish-and-update.cjs patch","publish:update:minor":"node scripts/publish-and-update.cjs minor","publish:update:major":"node scripts/publish-and-update.cjs major"},author:"Handler",license:"MIT",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/HandlerAIGames/handler-playable-sdk.git"},files:["dist","bin","LICENSE","README.md"],peerDependencies:{"lottie-web":"^5.0.0","pixi.js":"^8.0.0",three:"^0.182.0"},peerDependenciesMeta:{"pixi.js":{optional:!0},three:{optional:!0},"lottie-web":{optional:!0}},devDependencies:{"@types/three":"^0.182.0",eslint:"^9.39.2","javascript-obfuscator":"^5.1.0","pixi.js":"8.8.1",three:"^0.182.0","ts-node":"^10.9.2",tsup:"^8.4.0",typescript:"^5.7.2","typescript-eslint":"^8.53.0"},dependencies:{"@google/genai":"^1.35.0","@google/generative-ai":"^0.24.1",jszip:"^3.10.1",sharp:"^0.34.5"}};var Z=0,to=Z++,Ja=Z++,Za=Z++,Qa=Z++,er=Z++,tr=Z++,ir=Z++,nr=Z++,ar=Z++,rr=Z++,sr=Z++,or=Z++,B=to;function lr(){return B===Ja}function cr(){return B===Za}function dr(){return B===Qa}function pr(){return B===er}function Ye(){return B===tr}function Ke(){return B===ir}function ur(){return B===nr}function gr(){return B===ar}function hr(){return B===rr}function un(){return B===sr}function gn(){return B===or}function fr(){let r=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(r==="mraid")try{mraid.getState(),B=Ja;return}catch{}else if(r==="dapi")try{dapi.isReady(),B=Za;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(B=Qa)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(B=er)}catch{}else if(e==="mintegral")window.gameReady&&(B=tr);else if(e==="tapjoy")window.TJ_API&&(B=ir);else if(e==="tiktok")window.openAppStore&&(B=nr);else if(e==="smadex")try{window.smxTracking&&(B=ar)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(B=rr)}catch{}else e==="vungle"?B=sr:(r==="nucleo"||e==="nucleo")&&(B=or)}var Wt=Ve(require("lottie-web"),1),hn=Wt.default;typeof window!="undefined"&&(window.lottie=Wt.default,window.__baseLottie=Wt.default);var io=require("pixi.js");var fn=require("pixi.js");var no=null;function mn(r){no=r}Yt();bn();var bt=require("pixi.js");Yt();var co=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",xn=co;if(typeof window!="undefined")try{let r=new XMLHttpRequest;if(r.open("GET","./build-settings.json",!1),r.send(),r.status===200&&r.responseText){let e=JSON.parse(r.responseText);e!=null&&e.buildMode&&(xn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${xn}`))}}catch{}function po(r){var t,i,n,a,s;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(r);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(r))return{x:(t=r[0])!=null?t:.5,y:(i=r[1])!=null?i:.5};if(r&&typeof r=="object"&&"x"in r&&"y"in r)return{x:(n=r.x)!=null?n:.5,y:(a=r.y)!=null?a:.5};if(typeof r=="string"){let o=r.trim().toLowerCase();return(s=e[o])!=null?s:{x:.5,y:.5}}return null}var Ce=class{static async create(e,t,i){var l,c,p,d,u,g,f;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${xn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let h=new bt.Container;return this.applyTransform(h,t==null?void 0:t.transform,t),h}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let s=await Re.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(p=s==null?void 0:s.constructor)==null?void 0:p.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",s,"for object:",e),o=new bt.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(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=s==null?void 0:s.constructor)==null?void 0:u.name,s),s&&(((g=s.constructor)==null?void 0:g.name)==="Container"||s instanceof bt.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let h=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let b of h)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(f=o==null?void 0:o.constructor)==null?void 0:f.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=s)}else o=s;else o=s,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,a,s,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((s=t.position.x)!=null?s:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=po(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 yt=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 ho=Ve(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=ho);Xe();var Kt=require("pixi.js");Xe();var An=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new yt}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var o;let s=this.registry.get(a);if(!s){console.warn("[Assets] No config found for object:",a);return}try{let l=await Ce.create(a,s,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await Ce.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},fo=new An,mo=new Proxy(fo,{get(r,e){if(e in r&&typeof r[e]=="function")return r[e].bind(r);if(r.get(e))return r.get(e)}});Xe();var xr=require("pixi.js"),fe={width:400,height:600,designWidth:400,scaleFactor:1},Jt={scale:1,position:1},Tn=[];function yo(r,e,t,i,n,a,s){Tn.push({element:r,originalScale:a,positionHelper:e,heightPercent:n}),e(r,t,i,n,a,s,!1)}function vo(){Tn.forEach(({element:r,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*fe.scaleFactor;t(r,fe.width,fe.height,i,n,!0,!1)})}function Cn(r,e){console.log(`[SCREEN] updateScreenState called: ${r}x${e}`),fe.width=r,fe.height=e,fe.scaleFactor=Math.min(r/fe.designWidth,1.15),Jt.scale=fe.scaleFactor,Jt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${Jt.scale.toFixed(3)}`),vo()}var wt={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 wo(r,e,t){let i=wt[r];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${r}.${e} = ${t}`))}function xo(){return wt}var Eo={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 Xt(r,e){return typeof r=="number"&&Number.isFinite(r)?r:e}function Zt(r,e={x:.5,y:.5}){var t;if(Array.isArray(r))return{x:Xt(r[0],e.x),y:Xt(r[1],e.y)};if(r&&typeof r=="object"){let i=r;return{x:Xt(i.x,e.x),y:Xt(i.y,e.y)}}if(typeof r=="string"){let i=r.trim().toLowerCase();return(t=Eo[i])!=null?t:e}return e}function Er(r,e,t,i={}){var g,f,h,m,b,y;let n=Zt(t),a=(g=i.inset)!=null?g:{},s=(f=i.padding)!=null?f:{x:0,y:0},o=((h=a.left)!=null?h:0)+s.x,l=((m=a.right)!=null?m:0)+s.x,c=((b=a.top)!=null?b:0)+s.y,p=((y=a.bottom)!=null?y:0)+s.y,d=Math.max(0,r-o-l),u=Math.max(0,e-c-p);return{x:o+d*n.x,y:c+u*n.y}}function Sr(r,e,t,i={}){var h,m,b,y,v,S;let n=(h=i.inset)!=null?h:{},a=(m=i.padding)!=null?m:{x:0,y:0},s=((b=n.left)!=null?b:0)+a.x,o=((y=n.right)!=null?y:0)+a.x,l=((v=n.top)!=null?v:0)+a.y,c=((S=n.bottom)!=null?S:0)+a.y,p=Math.max(0,r-s-o),d=Math.max(0,e-l-c),u=Zt(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),f=Math.min(Math.max(u.y,0),1);return{x:s+p*g,y:l+d*f}}if(typeof window!="undefined"){let r=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==r||n!==e)&&(r=i,e=n,Cn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),Cn(window.innerWidth,window.innerHeight),window.updateDebugConfig=wo,window.getDebugConfig=xo,window.copyConfig=Io,window.applyConfig=vt,window.applyConfigForRatio=jo,window.positionAtBottom=Ar,window.positionAtTop=Co,window.positionAtCenter=To,window.positionAtLeft=Lo,window.positionAtRight=ko,window.positionAtBottomLeft=Mo,window.positionAtBottomRight=Po,window.positionAtTopLeft=_o,window.positionAtTopRight=Oo,window.applyPositionContract=Ao,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 Qt(r,e,t=0){return r*e+t}function ei(r,e,t=0){return r*(1-e)+t}function ti(r,e,t=0){return r*e+t}function ii(r,e,t=0){return r*(1-e)+t}function Q(r,e=0){return r/2+e}function So(r,e){return r*e}function Ao(r,e,t,i){var s,o,l,c,p,d,u,g,f,h,m,b,y,v,S,x,w,O,E,k;let n=0,a=0;switch(i.type){case"top":n=Q(e,(o=(s=i.offset)==null?void 0:s.x)!=null?o:0),a=Qt(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=Q(e,(d=(p=i.offset)==null?void 0:p.x)!=null?d:0),a=ei(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=ti(e,i.percent,(h=(f=i.offset)==null?void 0:f.x)!=null?h:0),a=Q(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=ii(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),a=Q(t,(x=(S=i.offset)==null?void 0:S.y)!=null?x:0);break;case"center":n=Q(e,(O=(w=i.offset)==null?void 0:w.x)!=null?O:0),a=Q(t,(k=(E=i.offset)==null?void 0:E.y)!=null?k:0);break}r.position?r.position.set(n,a):(r.x=n,r.y=a),i.scale!==void 0&&i.scale!==1&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(i.scale,i.scale):(r.scale.x=i.scale,r.scale.y=i.scale))}function Ar(r,e,t,i=.2,n=1,a=!0,s=!1){let o=So(t,i),l=ei(t,i/2);me(r,Q(e),l);let c=a?n*fe.scaleFactor:n;be(r,c),s&&!Tn.find(p=>p.element===r)&&yo(r,Ar,e,t,i,n,a)}function Co(r,e,t,i=.1,n=1){me(r,Q(e),Qt(t,i)),be(r,n)}function To(r,e,t,i=0,n=0,a=1){me(r,Q(e,i),Q(t,n)),be(r,a)}function Lo(r,e,t,i=.1,n=1){me(r,ti(e,i),Q(t)),be(r,n)}function ko(r,e,t,i=.1,n=1){me(r,ii(e,i),Q(t)),be(r,n)}function Mo(r,e,t,i=.05,n=.05,a=1){me(r,ti(e,n),ei(t,i)),be(r,a)}function Po(r,e,t,i=.05,n=.05,a=1){me(r,ii(e,n),ei(t,i)),be(r,a)}function _o(r,e,t,i=.05,n=.05,a=1){me(r,ti(e,n),Qt(t,i)),be(r,a)}function Oo(r,e,t,i=.05,n=.05,a=1){me(r,ii(e,n),Qt(t,i)),be(r,a)}function me(r,e,t){r&&r.position?typeof r.position.set=="function"?r.position.set(e,t):(r.position.x=e,r.position.y=t):r&&(r.x=e,r.y=t)}function be(r,e){e!==1&&r&&r.scale&&(typeof r.scale.set=="function"?r.scale.set(e,e):r.scale.x!==void 0&&r.scale.y!==void 0&&(r.scale.x=e,r.scale.y=e))}var ze={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 Io(r){return r&&ze[r]?JSON.parse(JSON.stringify(ze[r])):JSON.parse(JSON.stringify(wt))}function vt(r){Object.keys(r).forEach(e=>{let t=e;wt[t]&&r[t]&&Object.assign(wt[t],r[t])}),console.log("Config applied:",r)}function jo(r,e){let t=r/e;t>1.6?(vt(ze.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(vt(ze.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(vt(ze.square),console.log("Applied SQUARE config for ratio:",t)):(vt(ze.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let r=window;r.configPresets=ze,r.resolveAnchorVec2=r.resolveAnchorVec2||Zt,r.resolveScreenAnchorPoint=r.resolveScreenAnchorPoint||Er,r.resolveScreenRatioPoint=r.resolveScreenRatioPoint||Sr}hi();function q(r,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(r,e);return`${r/i}:${e/i}`}var Qc=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:q(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:q(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:q(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:q(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:q(360,780)}],ed=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:q(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:q(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:q(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:q(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:q(412,915)}],td=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:q(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:q(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:q(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:q(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:q(800,1280)}],Fn=[{id:"playable-portrait",label:"Playable Portrait",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"mraid-320x480",label:"MRAID 320\xD7480",width:320,height:480,category:"playable",ratio:"2:3",mraidScale:1},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"playable",ratio:q(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:q(768,1024),mraidScale:.7}];var Bn=[...Fn],Un=[{category:"playable",label:"Playable Ad",devices:Fn}],fi=Fn[0];function Ne(r){return Bn.find(e=>e.id===r)||fi}function Uo(r){return Bn.filter(e=>e.category===r)}K();var Qe=class{async updateProperty(e,t,i,n={}){var l,c,p;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let s=a(e);if(!s){console.error("[PropertyUpdateManager] Config not found for:",e);return}le({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let d=window.__editableConfig,u=(p=(c=(l=d==null?void 0:d.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?p:s;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function Gn(r){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let s=n.result,o=r.category||"misc",c=`${(r.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:s,overwrite:!0})})).json();if(!(d!=null&&d.success)){alert(`Upload failed: ${(d==null?void 0:d.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await r.onApply(d.path)}catch(p){console.error("[QuickActionsBar] Upload error:",p),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var mi=class{constructor(){this.updateManager=new Qe}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let s=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,s);break;case"ai-edit":this.openAIEditor(t,i,s);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,s);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let s=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",s),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",s)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(p=>p.objectId===a||p.slotId===a)){let p=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:p,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:p,assetType:"image"}),n.categories&&!n.categories.includes(p)&&n.categories.push(p),n.libraryAssets&&!n.libraryAssets[p]&&(n.libraryAssets[p]=[]);let d=window.reRenderAssetLibrary;typeof d=="function"&&d()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let s=window.__updateWorkbenchTabs;typeof s=="function"&&s()}if(n.libraryPanel){let s=window.getEditableObjectConfig,o=s==null?void 0:s(e),l=(a=o==null?void 0:o.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var s;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((s=n==null?void 0:n.identity)==null?void 0:s.category)||(t.split(".")[0]==="render"?"environment":"ui");Gn({objectId:e,category:a,onApply:async o=>{var p,d;await this.updateManager.updateProperty(e,t,o);let l=window.__debugContext;(d=(p=l==null?void 0:l.options)==null?void 0:p.onPropertyChange)==null||d.call(p,e,t,o);let c=window.__highlightLibrarySlot;typeof c=="function"&&setTimeout(()=>{c(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),s=window.__editableConfig;if(!(s!=null&&s.schemas))return;let o=null;if(s.schemas instanceof Map?o=s.schemas.get(n):typeof s.schemas=="object"&&(o=s.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let s=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,s,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var Go=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],qo=["environment","ui","character","system","backgrounds"],Vo=["bg","world","ui"],zr={SwerveMove:{speed:5,sensitivity:1,directionMode:"dominantAxis",axis:"both",bounds:{left:-400,right:400,top:-300,bottom:300}},DragToWin:{targetId:"",successDistance:80},DragSnap:{snapTargetId:"",snapDistance:40},JoystickMove:{speed:6,bounds:{left:-400,right:400,top:-300,bottom:300}}},bi=class{constructor(){this.modal=null;this.state=null}open(e){this.state=this.createInitialState(e),this.createModal(),document.body.appendChild(this.modal),this.attachEventListeners(),this.updateStepUI()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),window.__wizardAssetPicker=null,this.modal=null,this.state=null}createInitialState(e){return{step:1,objectType:"sprite",instanceId:"",displayName:"",category:"environment",screenId:e.screenId,layer:"world",positionMode:"static",anchorPreset:"center",anchorX:.5,anchorY:.5,positionX:0,positionY:0,offsetX:0,offsetY:0,scale:.2,rotation:0,zIndex:0,assetPath:"",tint:"",alpha:1,text:"",font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",graphicsWidth:200,graphicsHeight:200,graphicsFill:"#FFFFFF",graphicsAlpha:1,interactionEnabled:!1,dragEnabled:!1,hoverEnabled:!1,clickEnabled:!1,logicId:"",logicPropsRaw:""}}createModal(){let e=document.createElement("div");e.className="wizard-modal",e.innerHTML=`
47
47
  <div class="wizard-card">
48
48
  <div class="wizard-header">
49
49
  <div class="wizard-title">
@@ -95,19 +95,19 @@
95
95
  <div class="wizard-field-group">
96
96
  <label class="wizard-label required">Category</label>
97
97
  <select class="wizard-select" data-field="category">
98
- ${Us.map(e=>`<option value="${e}">${e}</option>`).join("")}
98
+ ${qo.map(e=>`<option value="${e}">${e}</option>`).join("")}
99
99
  </select>
100
100
  </div>
101
101
  <div class="wizard-field-group">
102
102
  <label class="wizard-label required">Screen</label>
103
103
  <select class="wizard-select" data-field="screenId" required>
104
- ${Bs.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}
104
+ ${Go.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}
105
105
  </select>
106
106
  </div>
107
107
  <div class="wizard-field-group">
108
108
  <label class="wizard-label required">Layer</label>
109
109
  <select class="wizard-select" data-field="layer">
110
- ${Gs.map(e=>`<option value="${e}">${e}</option>`).join("")}
110
+ ${Vo.map(e=>`<option value="${e}">${e}</option>`).join("")}
111
111
  </select>
112
112
  </div>
113
113
  </div>
@@ -266,7 +266,7 @@
266
266
  <label class="wizard-label">Logic Component</label>
267
267
  <select class="wizard-select" data-field="logicId">
268
268
  <option value="">None</option>
269
- ${Object.keys(Or).map(e=>`<option value="${e}">${e}</option>`).join("")}
269
+ ${Object.keys(zr).map(e=>`<option value="${e}">${e}</option>`).join("")}
270
270
  </select>
271
271
  </div>
272
272
  <div class="wizard-field-group">
@@ -293,14 +293,14 @@
293
293
  <div class="wizard-type-icon">${t}</div>
294
294
  <div class="wizard-type-name">${i}</div>
295
295
  </button>
296
- `}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var a;let i=t.target,n=i.dataset.action||((a=i.closest("[data-action]"))==null?void 0:a.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let a=n.dataset.assetAction;a&&(t.preventDefault(),this.handleAssetAction(a))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let a=n.dataset.objectType;a&&this.setObjectType(a)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";Dn({objectId:e,category:t,onApply:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}})}openAiPicker(){if(!this.state)return;this.setAssetPickerHint('Generate and click "Save to Library" to use it here.'),window.__wizardAssetPicker={onPick:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__openAiEditor;if(typeof e!="function"){alert("AI Editor is not available.");return}let t=this.state.displayName||this.state.instanceId||"new asset";e(this.state.instanceId||"new_asset",`Create an image for ${t}`,"",{})}setAssetPickerHint(e){if(!this.modal)return;let t=this.modal.querySelector("[data-asset-picker-hint]");if(t){if(!e){t.style.display="none",t.textContent="";return}t.textContent=e,t.style.display="block"}}handleFieldChange(e){if(!this.state)return;let t=e.dataset.field;if(t){if(e instanceof HTMLInputElement&&e.type==="checkbox")this.state[t]=e.checked;else if(e instanceof HTMLInputElement&&e.type==="number"){let i=e.value===""?0:Number(e.value);this.state[t]=Number.isNaN(i)?0:i}else this.state[t]=e.value;t==="anchorPreset"&&this.applyAnchorPreset(this.state.anchorPreset),t==="logicId"&&this.applyLogicDefaults(this.state.logicId),this.updateStepUI()}}setObjectType(e){this.state&&(this.state.objectType=e,this.state.scale=e==="sprite"||e==="ui-image"?.2:1,(e==="ui-text"||e==="ui-image")&&(this.state.category="ui",this.state.layer="ui"),this.updateStepUI())}applyAnchorPreset(e){if(!this.state)return;let t={center:[.5,.5],"top-left":[0,0],"top-right":[1,0],"bottom-left":[0,1],"bottom-right":[1,1]};if(e!=="custom"&&t[e]){let[i,n]=t[e];this.state.anchorX=i,this.state.anchorY=n}}applyLogicDefaults(e){if(!this.state)return;if(!e){this.state.logicPropsRaw="";return}let t=Or[e];t&&(this.state.logicPropsRaw=JSON.stringify(t,null,2))}goToStep(e){if(!this.state)return;let t=Math.max(1,Math.min(6,e));this.state.step=t,this.updateStepUI()}updateStepUI(){if(!this.modal||!this.state)return;Array.from(this.modal.querySelectorAll(".wizard-step")).forEach(t=>{let i=Number(t.dataset.step||"0");t.classList.toggle("active",i===this.state.step)}),this.updateProgressDots(),this.updateTypeSections(),this.syncFieldValues(),this.updatePreview(),this.updateActionButtons()}updateProgressDots(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-wizard-progress]");if(!e)return;let t=Array.from({length:6},(i,n)=>{let a=n+1;return`
296
+ `}attachEventListeners(){if(!this.modal||!this.state)return;this.modal.addEventListener("click",t=>{var a;let i=t.target,n=i.dataset.action||((a=i.closest("[data-action]"))==null?void 0:a.getAttribute("data-action"));if(n)switch(n){case"close":case"cancel":this.close();break;case"back":this.goToStep(this.state.step-1);break;case"next":this.state.step<6?this.goToStep(this.state.step+1):this.submit();break}}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-asset-action]");if(!n)return;let a=n.dataset.assetAction;a&&(t.preventDefault(),this.handleAssetAction(a))}),this.modal.addEventListener("click",t=>{let n=t.target.closest("[data-object-type]");if(!n)return;let a=n.dataset.objectType;a&&this.setObjectType(a)}),Array.from(this.modal.querySelectorAll("[data-field]")).forEach(t=>{let i=()=>this.handleFieldChange(t);t.addEventListener("input",i),t.addEventListener("change",i)}),this.modal.addEventListener("click",t=>{t.target===this.modal&&this.close()})}handleAssetAction(e){if(this.state)switch(e){case"library":this.openLibraryPicker();break;case"upload":this.openUploadPicker();break;case"ai":this.openAiPicker();break;default:break}}openLibraryPicker(){if(!this.state)return;this.setAssetPickerHint("Select an asset from the Library tab."),window.__wizardAssetPicker={onPick:t=>{this.state.assetPath=t,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__debugContext;if(e){e.activeTab="library";let t=window.__updateWorkbenchTabs;typeof t=="function"&&t()}}openUploadPicker(){if(!this.state)return;this.setAssetPickerHint("Upload an image to add it to the library.");let e=this.state.instanceId||"new_asset",t=this.state.category||"environment";Gn({objectId:e,category:t,onApply:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}})}openAiPicker(){if(!this.state)return;this.setAssetPickerHint('Generate and click "Save to Library" to use it here.'),window.__wizardAssetPicker={onPick:i=>{this.state.assetPath=i,this.setAssetPickerHint(""),this.updateStepUI()}};let e=window.__openAiEditor;if(typeof e!="function"){alert("AI Editor is not available.");return}let t=this.state.displayName||this.state.instanceId||"new asset";e(this.state.instanceId||"new_asset",`Create an image for ${t}`,"",{})}setAssetPickerHint(e){if(!this.modal)return;let t=this.modal.querySelector("[data-asset-picker-hint]");if(t){if(!e){t.style.display="none",t.textContent="";return}t.textContent=e,t.style.display="block"}}handleFieldChange(e){if(!this.state)return;let t=e.dataset.field;if(t){if(e instanceof HTMLInputElement&&e.type==="checkbox")this.state[t]=e.checked;else if(e instanceof HTMLInputElement&&e.type==="number"){let i=e.value===""?0:Number(e.value);this.state[t]=Number.isNaN(i)?0:i}else this.state[t]=e.value;t==="anchorPreset"&&this.applyAnchorPreset(this.state.anchorPreset),t==="logicId"&&this.applyLogicDefaults(this.state.logicId),this.updateStepUI()}}setObjectType(e){this.state&&(this.state.objectType=e,this.state.scale=e==="sprite"||e==="ui-image"?.2:1,(e==="ui-text"||e==="ui-image")&&(this.state.category="ui",this.state.layer="ui"),this.updateStepUI())}applyAnchorPreset(e){if(!this.state)return;let t={center:[.5,.5],"top-left":[0,0],"top-right":[1,0],"bottom-left":[0,1],"bottom-right":[1,1]};if(e!=="custom"&&t[e]){let[i,n]=t[e];this.state.anchorX=i,this.state.anchorY=n}}applyLogicDefaults(e){if(!this.state)return;if(!e){this.state.logicPropsRaw="";return}let t=zr[e];t&&(this.state.logicPropsRaw=JSON.stringify(t,null,2))}goToStep(e){if(!this.state)return;let t=Math.max(1,Math.min(6,e));this.state.step=t,this.updateStepUI()}updateStepUI(){if(!this.modal||!this.state)return;Array.from(this.modal.querySelectorAll(".wizard-step")).forEach(t=>{let i=Number(t.dataset.step||"0");t.classList.toggle("active",i===this.state.step)}),this.updateProgressDots(),this.updateTypeSections(),this.syncFieldValues(),this.updatePreview(),this.updateActionButtons()}updateProgressDots(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-wizard-progress]");if(!e)return;let t=Array.from({length:6},(i,n)=>{let a=n+1;return`
297
297
  <div class="wizard-step-indicator">
298
298
  <span class="wizard-step-dot ${a===this.state.step?"active":a<this.state.step?"completed":""}"></span>
299
299
  <span class="wizard-step-label">Step ${a}</span>
300
300
  </div>
301
- `});e.innerHTML=t.join("")}updateTypeSections(){if(!this.modal||!this.state)return;let e=this.state.objectType;Array.from(this.modal.querySelectorAll("[data-type-section]")).forEach(n=>{let a=n.dataset.typeSection,s=a==="sprite"&&(e==="sprite"||e==="ui-image")||a===e;n.style.display=s?"block":"none"});let i=this.modal.querySelector("[data-type-help]");if(i){let n=e==="ui-text"?"UI text uses the UI renderer with font settings.":e==="graphics"?"Graphics are simple shapes with width/height and fill.":e==="container"?"Containers are empty parents for grouping objects.":"Sprite/UI image uses image assets.";i.textContent=n}}syncFieldValues(){if(!this.modal||!this.state)return;let e=this.state;Array.from(this.modal.querySelectorAll("[data-field]")).forEach(n=>{let a=n.dataset.field;if(!a)return;let o=e[a];n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked=!!o:typeof o!="undefined"&&(n.value=String(o))}),Array.from(this.modal.querySelectorAll("[data-object-type]")).forEach(n=>{n.classList.toggle("selected",n.dataset.objectType===this.state.objectType)})}updatePreview(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-preview-json]"),t=this.modal.querySelector("[data-validation-errors]");if(!e||!t)return;let i=this.buildPayload();e.textContent=JSON.stringify(i,null,2);let n=this.validate();n.length>0?(t.style.display="block",t.textContent=n.join(`
302
- `)):(t.style.display="none",t.textContent="")}updateActionButtons(){if(!this.modal||!this.state)return;let e=this.modal.querySelector('[data-action="back"]'),t=this.modal.querySelector('[data-action="next"]');e&&(e.disabled=this.state.step===1),t&&(t.textContent=this.state.step===6?"Create":"Next",t.disabled=this.state.step===6&&this.validate().length>0)}validate(){if(!this.state)return[];let e=[],t=this.state.instanceId.trim();return t||e.push("Object ID is required."),t.startsWith("json.")&&e.push('Object ID must not start with "json." (instance id only).'),t&&!/^[a-zA-Z0-9._-]+$/.test(t)&&e.push("Object ID must use letters, numbers, dot, dash, or underscore."),t&&!this.isInstanceIdUnique(t)&&e.push(`Object ID "${t}" already exists.`),(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&!this.state.assetPath.trim()&&e.push("Asset path is required for image-based objects."),this.state.objectType==="ui-text"&&!this.state.text.trim()&&e.push("Text content is required for UI Text."),e}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}buildPayload(){if(!this.state)return{};let e=this.state.instanceId.trim(),t=`json.${e}`;return{screenId:this.state.screenId,instanceId:e,objectConfigId:t,layer:this.state.layer,config:this.buildObjectConfig(t)}}buildObjectConfig(e){if(!this.state)return{};let t={identity:{id:e,category:this.state.category},transform:{position:{x:this.state.positionX,y:this.state.positionY},offset:{x:this.state.offsetX,y:this.state.offsetY},scale:this.state.scale,rotation:this.state.rotation,anchor:{x:this.state.anchorX,y:this.state.anchorY},position_ratio:null,position_mode:this.state.positionMode},render:{alpha:this.state.alpha,visible:!0,tint:this.state.tint||null,z_index:this.state.zIndex},instance_id:this.state.instanceId.trim(),object_config:e};return(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&(t.render.asset={type:"image",path:this.normalizeAssetPath(this.state.assetPath.trim())}),this.state.objectType==="ui-text"&&(t.ui={kind:"text",renderMode:"text",text:this.state.text,font:this.state.font,fontSize:this.state.fontSize,letterSpacing:this.state.letterSpacing,align:this.state.align,color:this.state.tint||"#FFFFFF"},t.render.tint=null),this.state.objectType==="graphics"&&(t.effects={width:this.state.graphicsWidth,height:this.state.graphicsHeight,fill_color:this.state.graphicsFill,fill_alpha:this.state.graphicsAlpha}),this.state.interactionEnabled&&(t.interaction={enabled:!0,drag:{enabled:this.state.dragEnabled},hover:{enabled:this.state.hoverEnabled},click:{enabled:this.state.clickEnabled}}),this.state.logicId&&(t.logic={id:this.state.logicId,props:this.parseLogicProps(this.state.logicPropsRaw)}),t}parseLogicProps(e){if(!e||!e.trim())return{};try{return JSON.parse(e)}catch{return{}}}normalizeAssetPath(e){return!e||e.startsWith("raw/")?e:e.startsWith("/raw/")?e.replace(/^\/raw\//,"raw/"):e}async submit(){var i;if(!this.state)return;if(this.validate().length>0){this.updatePreview();return}let t=this.buildPayload();try{let n=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let o=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
303
- `))||(a==null?void 0:a.error)||"Failed to create object.";alert(o);return}window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),this.close()}catch(n){alert(`Failed to create object: ${n instanceof Error?n.message:String(n)}`)}}};var fi=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.options=e}open(e){this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=`
301
+ `});e.innerHTML=t.join("")}updateTypeSections(){if(!this.modal||!this.state)return;let e=this.state.objectType;Array.from(this.modal.querySelectorAll("[data-type-section]")).forEach(n=>{let a=n.dataset.typeSection,o=a==="sprite"&&(e==="sprite"||e==="ui-image")||a===e;n.style.display=o?"block":"none"});let i=this.modal.querySelector("[data-type-help]");if(i){let n=e==="ui-text"?"UI text uses the UI renderer with font settings.":e==="graphics"?"Graphics are simple shapes with width/height and fill.":e==="container"?"Containers are empty parents for grouping objects.":"Sprite/UI image uses image assets.";i.textContent=n}}syncFieldValues(){if(!this.modal||!this.state)return;let e=this.state;Array.from(this.modal.querySelectorAll("[data-field]")).forEach(n=>{let a=n.dataset.field;if(!a)return;let s=e[a];n instanceof HTMLInputElement&&n.type==="checkbox"?n.checked=!!s:typeof s!="undefined"&&(n.value=String(s))}),Array.from(this.modal.querySelectorAll("[data-object-type]")).forEach(n=>{n.classList.toggle("selected",n.dataset.objectType===this.state.objectType)})}updatePreview(){if(!this.modal||!this.state)return;let e=this.modal.querySelector("[data-preview-json]"),t=this.modal.querySelector("[data-validation-errors]");if(!e||!t)return;let i=this.buildPayload();e.textContent=JSON.stringify(i,null,2);let n=this.validate();n.length>0?(t.style.display="block",t.textContent=n.join(`
302
+ `)):(t.style.display="none",t.textContent="")}updateActionButtons(){if(!this.modal||!this.state)return;let e=this.modal.querySelector('[data-action="back"]'),t=this.modal.querySelector('[data-action="next"]');e&&(e.disabled=this.state.step===1),t&&(t.textContent=this.state.step===6?"Create":"Next",t.disabled=this.state.step===6&&this.validate().length>0)}validate(){if(!this.state)return[];let e=[],t=this.state.instanceId.trim();return t||e.push("Object ID is required."),t.startsWith("json.")&&e.push('Object ID must not start with "json." (instance id only).'),t&&!/^[a-zA-Z0-9._-]+$/.test(t)&&e.push("Object ID must use letters, numbers, dot, dash, or underscore."),t&&!this.isInstanceIdUnique(t)&&e.push(`Object ID "${t}" already exists.`),(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&!this.state.assetPath.trim()&&e.push("Asset path is required for image-based objects."),this.state.objectType==="ui-text"&&!this.state.text.trim()&&e.push("Text content is required for UI Text."),e}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}buildPayload(){if(!this.state)return{};let e=this.state.instanceId.trim(),t=`json.${e}`;return{screenId:this.state.screenId,instanceId:e,objectConfigId:t,layer:this.state.layer,config:this.buildObjectConfig(t)}}buildObjectConfig(e){if(!this.state)return{};let t={identity:{id:e,category:this.state.category},transform:{position:{x:this.state.positionX,y:this.state.positionY},offset:{x:this.state.offsetX,y:this.state.offsetY},scale:this.state.scale,rotation:this.state.rotation,anchor:{x:this.state.anchorX,y:this.state.anchorY},position_ratio:null,position_mode:this.state.positionMode},render:{alpha:this.state.alpha,visible:!0,tint:this.state.tint||null,z_index:this.state.zIndex},instance_id:this.state.instanceId.trim(),object_config:e};return(this.state.objectType==="sprite"||this.state.objectType==="ui-image")&&(t.render.asset={type:"image",path:this.normalizeAssetPath(this.state.assetPath.trim())}),this.state.objectType==="ui-text"&&(t.ui={kind:"text",renderMode:"text",text:this.state.text,font:this.state.font,fontSize:this.state.fontSize,letterSpacing:this.state.letterSpacing,align:this.state.align,color:this.state.tint||"#FFFFFF"},t.render.tint=null),this.state.objectType==="graphics"&&(t.effects={width:this.state.graphicsWidth,height:this.state.graphicsHeight,fill_color:this.state.graphicsFill,fill_alpha:this.state.graphicsAlpha}),this.state.interactionEnabled&&(t.interaction={enabled:!0,drag:{enabled:this.state.dragEnabled},hover:{enabled:this.state.hoverEnabled},click:{enabled:this.state.clickEnabled}}),this.state.logicId&&(t.logic={id:this.state.logicId,props:this.parseLogicProps(this.state.logicPropsRaw)}),t}parseLogicProps(e){if(!e||!e.trim())return{};try{return JSON.parse(e)}catch{return{}}}normalizeAssetPath(e){return!e||e.startsWith("raw/")?e:e.startsWith("/raw/")?e.replace(/^\/raw\//,"raw/"):e}async submit(){var i;if(!this.state)return;if(this.validate().length>0){this.updatePreview();return}let t=this.buildPayload();try{let n=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await n.json().catch(()=>({}));if(!n.ok||(a==null?void 0:a.success)===!1){let s=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
303
+ `))||(a==null?void 0:a.error)||"Failed to create object.";alert(s);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),this.close()}catch(n){alert(`Failed to create object: ${n instanceof Error?n.message:String(n)}`)}}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[AddObjectWizard] Failed to sync screens:",e)}}};var yi=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.options=e}open(e){this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true"),e.innerHTML=`
304
304
  <div class="context-menu-item" data-action="duplicate">Duplicate</div>
305
305
  <div class="context-menu-item" data-action="rename">Rename</div>
306
306
  <div class="context-menu-item" data-action="move">Move to Screen</div>
@@ -309,11 +309,11 @@
309
309
  <div class="context-menu-item" data-action="inspect">Open in Inspector</div>
310
310
  <div class="context-menu-separator"></div>
311
311
  <div class="context-menu-item danger" data-action="delete">Delete</div>
312
- `,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,o=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),o>0&&(this.menu.style.top=`${i-o-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let i=e.target.dataset.action;i&&(e.stopPropagation(),this.handleAction(i))}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}handleAction(e){var t,i;switch(e){case"duplicate":this.handleDuplicate();break;case"rename":this.handleRename();break;case"move":this.handleMove();break;case"copy":this.handleCopyConfig();break;case"inspect":this.handleOpenInspector();break;case"delete":(i=(t=this.options).onDeleteRequest)==null||i.call(t,this.options.objectId),this.close();break}}async handleDuplicate(){var n,a,o,s,l;let e=`${this.options.objectId}_copy`,t=window.prompt("New instance ID",e);if(!t)return;if(!this.isInstanceIdUnique(t)){alert(`Instance ID "${t}" already exists.`);return}let i=window.confirm(`Share config with original?
312
+ `,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,s=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),s>0&&(this.menu.style.top=`${i-s-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let i=e.target.dataset.action;i&&(e.stopPropagation(),this.handleAction(i))}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}handleAction(e){var t,i;switch(e){case"duplicate":this.handleDuplicate();break;case"rename":this.handleRename();break;case"move":this.handleMove();break;case"copy":this.handleCopyConfig();break;case"inspect":this.handleOpenInspector();break;case"delete":(i=(t=this.options).onDeleteRequest)==null||i.call(t,this.options.objectId),this.close();break}}async handleDuplicate(){var n,a,s,o,l;let e=`${this.options.objectId}_copy`,t=window.prompt("New instance ID",e);if(!t)return;if(!this.isInstanceIdUnique(t)){alert(`Instance ID "${t}" already exists.`);return}let i=window.confirm(`Share config with original?
313
313
  OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sourceId:this.options.objectId,newInstanceId:t,shareConfig:i,screenId:this.options.screenId})}),p=await c.json().catch(()=>({}));if(!c.ok||(p==null?void 0:p.success)===!1){let d=((n=p==null?void 0:p.errors)==null?void 0:n.join(`
314
- `))||(p==null?void 0:p.error)||"Duplicate failed.";alert(d);return}(o=(a=this.options).onRefresh)==null||o.call(a),(l=(s=this.options).onSelect)==null||l.call(s,t),this.close()}catch(c){alert(`Duplicate failed: ${c instanceof Error?c.message:String(c)}`)}}async handleRename(){var t,i,n,a,o;let e=window.prompt("New instance ID",this.options.objectId);if(!(!e||e===this.options.objectId)){if(!this.isInstanceIdUnique(e)){alert(`Instance ID "${e}" already exists.`);return}try{let s=await fetch("/api/objects/rename",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,screenId:this.options.screenId,newInstanceId:e})}),l=await s.json().catch(()=>({}));if(!s.ok||(l==null?void 0:l.success)===!1){let c=((t=l==null?void 0:l.errors)==null?void 0:t.join(`
315
- `))||(l==null?void 0:l.error)||"Rename failed.";alert(c);return}(n=(i=this.options).onRefresh)==null||n.call(i),(o=(a=this.options).onSelect)==null||o.call(a,e),this.close()}catch(s){alert(`Rename failed: ${s instanceof Error?s.message:String(s)}`)}}}async handleMove(){var i,n,a;let e=window.prompt("Move to screen (loading/start/gameplay/tutorial/endgame)",this.options.screenId);if(!e)return;let t=e.trim();if(!["loading","start","gameplay","tutorial","endgame"].includes(t)){alert("Invalid screen. Use: loading, start, gameplay, tutorial, endgame.");return}if(t!==this.options.screenId)try{let o=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,fromScreenId:this.options.screenId,toScreenId:t})}),s=await o.json().catch(()=>({}));if(!o.ok||(s==null?void 0:s.success)===!1){let l=((i=s==null?void 0:s.errors)==null?void 0:i.join(`
316
- `))||(s==null?void 0:s.error)||"Move failed.";alert(l);return}(a=(n=this.options).onRefresh)==null||a.call(n),this.close()}catch(o){alert(`Move failed: ${o instanceof Error?o.message:String(o)}`)}}handleCopyConfig(){var n,a;let e=window.getEditableObjectConfig,t=typeof e=="function"?e(this.options.objectId):null;if(!t){let o=window.__editableObjectConfigs;o&&typeof o.get=="function"&&(t=(n=o.get(this.options.objectId))!=null?n:null)}if(!t){alert("Config not found.");return}let i=JSON.stringify(t,null,2);(a=navigator.clipboard)==null||a.writeText(i).catch(()=>{alert("Failed to copy to clipboard.")}),this.close()}handleOpenInspector(){var t,i;let e=window.__previewSelectObject;typeof e=="function"&&e(this.options.objectId),(i=(t=this.options).onSelect)==null||i.call(t,this.options.objectId),this.close()}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}};var Ir=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],mi=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.templates=[];this.isLoadingTemplates=!1;this.options=e}async open(e){await this.loadTemplates(),this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}async loadTemplates(){if(!this.isLoadingTemplates){this.isLoadingTemplates=!0;try{let e=await fetch("/api/objects/templates");if(e.ok){let t=await e.json();this.templates=Array.isArray(t.templates)?t.templates:[]}}catch(e){console.warn("[AddObjectMenu] Failed to load templates:",e),this.templates=[]}finally{this.isLoadingTemplates=!1}}}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true");let t=this.templates.length>0?this.templates.map(i=>`<div class="context-menu-item" data-action="template" data-template-id="${this.escapeHtml(i.id)}">${this.escapeHtml(i.label)}</div>`).join(""):'<div class="context-menu-item disabled">No templates available</div>';e.innerHTML=`
314
+ `))||(p==null?void 0:p.error)||"Duplicate failed.";alert(d);return}(s=(a=this.options).onRefresh)==null||s.call(a),(l=(o=this.options).onSelect)==null||l.call(o,t),this.close()}catch(c){alert(`Duplicate failed: ${c instanceof Error?c.message:String(c)}`)}}async handleRename(){var t,i,n,a,s;let e=window.prompt("New instance ID",this.options.objectId);if(!(!e||e===this.options.objectId)){if(!this.isInstanceIdUnique(e)){alert(`Instance ID "${e}" already exists.`);return}try{let o=await fetch("/api/objects/rename",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,screenId:this.options.screenId,newInstanceId:e})}),l=await o.json().catch(()=>({}));if(!o.ok||(l==null?void 0:l.success)===!1){let c=((t=l==null?void 0:l.errors)==null?void 0:t.join(`
315
+ `))||(l==null?void 0:l.error)||"Rename failed.";alert(c);return}(n=(i=this.options).onRefresh)==null||n.call(i),(s=(a=this.options).onSelect)==null||s.call(a,e),this.close()}catch(o){alert(`Rename failed: ${o instanceof Error?o.message:String(o)}`)}}}async handleMove(){var i,n,a;let e=window.prompt("Move to screen (loading/start/gameplay/tutorial/endgame)",this.options.screenId);if(!e)return;let t=e.trim();if(!["loading","start","gameplay","tutorial","endgame"].includes(t)){alert("Invalid screen. Use: loading, start, gameplay, tutorial, endgame.");return}if(t!==this.options.screenId)try{let s=await fetch("/api/objects/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:this.options.objectId,fromScreenId:this.options.screenId,toScreenId:t})}),o=await s.json().catch(()=>({}));if(!s.ok||(o==null?void 0:o.success)===!1){let l=((i=o==null?void 0:o.errors)==null?void 0:i.join(`
316
+ `))||(o==null?void 0:o.error)||"Move failed.";alert(l);return}(a=(n=this.options).onRefresh)==null||a.call(n),this.close()}catch(s){alert(`Move failed: ${s instanceof Error?s.message:String(s)}`)}}handleCopyConfig(){var n,a;let e=window.getEditableObjectConfig,t=typeof e=="function"?e(this.options.objectId):null;if(!t){let s=window.__editableObjectConfigs;s&&typeof s.get=="function"&&(t=(n=s.get(this.options.objectId))!=null?n:null)}if(!t){alert("Config not found.");return}let i=JSON.stringify(t,null,2);(a=navigator.clipboard)==null||a.writeText(i).catch(()=>{alert("Failed to copy to clipboard.")}),this.close()}handleOpenInspector(){var t,i;let e=window.__previewSelectObject;typeof e=="function"&&e(this.options.objectId),(i=(t=this.options).onSelect)==null||i.call(t,this.options.objectId),this.close()}isInstanceIdUnique(e){let t=window.getEditableObjectList;if(typeof t=="function"){let a=t();if(Array.isArray(a))return!a.includes(e)}let i=window.__HANDLER_SCREEN_INDEX,n=i==null?void 0:i.instanceToScreen;return n&&typeof n=="object"?!Object.prototype.hasOwnProperty.call(n,e):!0}};var $r=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],vi=class{constructor(e){this.menu=null;this.closeHandler=null;this.keyHandler=null;this.templates=[];this.isLoadingTemplates=!1;this.options=e}async open(e){await this.loadTemplates(),this.createMenu(),document.body.appendChild(this.menu),this.positionMenu(e),this.attachListeners()}close(){var e,t;this.menu&&this.menu.parentNode&&this.menu.parentNode.removeChild(this.menu),this.closeHandler&&(window.removeEventListener("click",this.closeHandler),this.closeHandler=null),this.keyHandler&&(window.removeEventListener("keydown",this.keyHandler),this.keyHandler=null),this.menu=null,(t=(e=this.options).onClose)==null||t.call(e)}async loadTemplates(){if(!this.isLoadingTemplates){this.isLoadingTemplates=!0;try{let e=await fetch("/api/objects/templates");if(e.ok){let t=await e.json();this.templates=Array.isArray(t.templates)?t.templates:[]}}catch(e){console.warn("[AddObjectMenu] Failed to load templates:",e),this.templates=[]}finally{this.isLoadingTemplates=!1}}}createMenu(){let e=document.createElement("div");e.className="context-menu",e.setAttribute("data-context-menu","true");let t=this.templates.length>0?this.templates.map(i=>`<div class="context-menu-item" data-action="template" data-template-id="${this.escapeHtml(i.id)}">${this.escapeHtml(i.label)}</div>`).join(""):'<div class="context-menu-item disabled">No templates available</div>';e.innerHTML=`
317
317
  <div class="context-menu-section-title">Objects</div>
318
318
  <div class="context-menu-item" data-action="object" data-object-type="sprite">\u{1F5BC}\uFE0F Sprite</div>
319
319
  <div class="context-menu-item" data-action="object" data-object-type="ui-image">\u{1F9E9} UI Image</div>
@@ -325,8 +325,13 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
325
325
  ${t}
326
326
  <div class="context-menu-separator"></div>
327
327
  <div class="context-menu-section-title">Systems</div>
328
+ <div class="context-menu-item" data-action="system" data-system-type="collectable-system">CollectableSystem</div>
329
+ <div class="context-menu-item" data-action="system" data-system-type="drag-snap-couples">DragSnapCouples</div>
330
+ <div class="context-menu-item" data-action="system" data-system-type="swerve-collect">SwerveCollect</div>
331
+ <div class="context-menu-item" data-action="system" data-system-type="tap-destroy">TapDestroy</div>
328
332
  <div class="context-menu-item" data-action="system" data-system-type="bullet-system">BulletSystem</div>
329
- `,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,o=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),o>0&&(this.menu.style.top=`${i-o-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let t=e.target,i=t.dataset.action;if(!i)return;e.stopPropagation();let n=t.dataset.objectType,a=t.dataset.systemType,o=t.dataset.templateId;i==="object"&&n?this.handleCreateObject(n):i==="system"&&a?this.handleCreateSystem(a):i==="template"&&o&&this.handleCreateFromTemplate(o)}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}async promptScreen(e="Select Screen"){return new Promise(t=>{var c,p,d;let i=document.createElement("div");i.className="add-menu-modal-overlay",i.innerHTML=`
333
+ <div class="context-menu-item" data-action="system" data-system-type="spawner">Spawner</div>
334
+ `,this.menu=e}positionMenu(e){if(!this.menu)return;let{x:t,y:i}=e;this.menu.style.left=`${t}px`,this.menu.style.top=`${i}px`;let n=this.menu.getBoundingClientRect(),a=n.right-window.innerWidth,s=n.bottom-window.innerHeight;a>0&&(this.menu.style.left=`${t-a-8}px`),s>0&&(this.menu.style.top=`${i-s-8}px`)}attachListeners(){this.menu&&(this.menu.addEventListener("click",e=>{let t=e.target,i=t.dataset.action;if(!i)return;e.stopPropagation();let n=t.dataset.objectType,a=t.dataset.systemType,s=t.dataset.templateId;i==="object"&&n?this.handleCreateObject(n):i==="system"&&a?this.handleCreateSystem(a):i==="template"&&s&&this.handleCreateFromTemplate(s)}),this.closeHandler=e=>{let t=e.target;this.menu&&t&&this.menu.contains(t)||this.close()},window.addEventListener("click",this.closeHandler),this.keyHandler=e=>{e.key==="Escape"&&this.close()},window.addEventListener("keydown",this.keyHandler))}async promptScreen(e="Select Screen"){return new Promise(t=>{var c,p,d;let i=document.createElement("div");i.className="add-menu-modal-overlay",i.innerHTML=`
330
335
  <div class="add-menu-modal">
331
336
  <div class="add-menu-modal-header">
332
337
  <div class="add-menu-modal-title">${this.escapeHtml(e)}</div>
@@ -335,7 +340,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
335
340
  <div class="add-menu-modal-body">
336
341
  <label class="add-menu-modal-label">Screen:</label>
337
342
  <select class="add-menu-modal-select" id="screen-select" required>
338
- ${Ir.map((u,g)=>`<option value="${this.escapeHtml(u.value)}" ${g===2?"selected":""}>${this.escapeHtml(u.label)}</option>`).join("")}
343
+ ${$r.map((u,g)=>`<option value="${this.escapeHtml(u.value)}" ${g===2?"selected":""}>${this.escapeHtml(u.label)}</option>`).join("")}
339
344
  </select>
340
345
  </div>
341
346
  <div class="add-menu-modal-footer">
@@ -343,7 +348,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
343
348
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
344
349
  </div>
345
350
  </div>
346
- `;let n=()=>{i.parentNode&&i.parentNode.removeChild(i)},a=()=>{let g=i.querySelector("#screen-select").value.trim();if(!g||!Ir.some(f=>f.value===g)){alert("Please select a valid screen.");return}n(),t(g)},o=()=>{n(),t(null)};i.querySelector(".add-menu-modal").addEventListener("click",u=>{u.stopPropagation()}),(c=i.querySelector('[data-action="confirm"]'))==null||c.addEventListener("click",a),(p=i.querySelector('[data-action="cancel"]'))==null||p.addEventListener("click",o),(d=i.querySelector(".add-menu-modal-close"))==null||d.addEventListener("click",o),i.addEventListener("click",u=>{u.target===i&&o()});let l=i.querySelector("#screen-select");l.addEventListener("keydown",u=>{u.key==="Enter"?(u.preventDefault(),a()):u.key==="Escape"&&(u.preventDefault(),o())}),document.body.appendChild(i),l.focus()})}async promptName(e="new_object",t="Enter Object Name"){return new Promise(i=>{var p,d,u;let n=document.createElement("div");n.className="add-menu-modal-overlay",n.innerHTML=`
351
+ `;let n=()=>{i.parentNode&&i.parentNode.removeChild(i)},a=()=>{let g=i.querySelector("#screen-select").value.trim();if(!g||!$r.some(f=>f.value===g)){alert("Please select a valid screen.");return}n(),t(g)},s=()=>{n(),t(null)};i.querySelector(".add-menu-modal").addEventListener("click",u=>{u.stopPropagation()}),(c=i.querySelector('[data-action="confirm"]'))==null||c.addEventListener("click",a),(p=i.querySelector('[data-action="cancel"]'))==null||p.addEventListener("click",s),(d=i.querySelector(".add-menu-modal-close"))==null||d.addEventListener("click",s),i.addEventListener("click",u=>{u.target===i&&s()});let l=i.querySelector("#screen-select");l.addEventListener("keydown",u=>{u.key==="Enter"?(u.preventDefault(),a()):u.key==="Escape"&&(u.preventDefault(),s())}),document.body.appendChild(i),l.focus()})}async promptName(e="new_object",t="Enter Object Name"){return new Promise(i=>{var p,d,u;let n=document.createElement("div");n.className="add-menu-modal-overlay",n.innerHTML=`
347
352
  <div class="add-menu-modal">
348
353
  <div class="add-menu-modal-header">
349
354
  <div class="add-menu-modal-title">${this.escapeHtml(t)}</div>
@@ -359,10 +364,15 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
359
364
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
360
365
  </div>
361
366
  </div>
362
- `;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},o=()=>{let f=n.querySelector("#name-input").value.trim(),h=this.sanitizeInstanceId(f);if(!h){alert("Invalid name. Use letters, numbers, dots, dashes, or underscores.");return}a(),i(h)},s=()=>{a(),i(null)};n.querySelector(".add-menu-modal").addEventListener("click",g=>{g.stopPropagation()}),(p=n.querySelector('[data-action="confirm"]'))==null||p.addEventListener("click",o),(d=n.querySelector('[data-action="cancel"]'))==null||d.addEventListener("click",s),(u=n.querySelector(".add-menu-modal-close"))==null||u.addEventListener("click",s),n.addEventListener("click",g=>{g.target===n&&s()});let c=n.querySelector("#name-input");c.addEventListener("keydown",g=>{g.key==="Enter"?(g.preventDefault(),o()):g.key==="Escape"&&(g.preventDefault(),s())}),c.select(),document.body.appendChild(n),c.focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e){var s,l,c;this.close();let t=await this.promptScreen();if(!t)return;let i=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",n=await this.promptName(i);if(!n)return;let a=n,o=this.buildDefaultConfig(e,a,n);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,instanceId:a,objectConfigId:o.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:o})}),d=await p.json().catch(()=>({}));if(!p.ok||(d==null?void 0:d.success)===!1){let u=((s=d==null?void 0:d.errors)==null?void 0:s.join(`
363
- `))||(d==null?void 0:d.error)||"Failed to create object.";alert(u);return}window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(p){alert(`Failed to create object: ${p instanceof Error?p.message:String(p)}`)}}async handleCreateFromTemplate(e){var a,o,s;this.close();let t=await this.promptScreen();if(!t)return;let i=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",n=await this.promptName(i);if(n)try{let l=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:n,screenId:t})}),c=await l.json().catch(()=>({}));if(!l.ok||(c==null?void 0:c.success)===!1){let p=((a=c==null?void 0:c.errors)==null?void 0:a.join(`
364
- `))||(c==null?void 0:c.error)||"Failed to create from template.";alert(p);return}window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(s=(o=this.options).onRefresh)==null||s.call(o)}catch(l){alert(`Failed to create from template: ${l instanceof Error?l.message:String(l)}`)}}async handleCreateSystem(e){var i,n,a;this.close();let t=await this.promptScreen();if(t&&e==="bullet-system")try{let o=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),s=await o.json().catch(()=>({}));if(!o.ok||(s==null?void 0:s.success)===!1){let l=((i=s==null?void 0:s.errors)==null?void 0:i.join(`
365
- `))||(s==null?void 0:s.error)||"Failed to create bullet system.";alert(l);return}window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(a=(n=this.options).onRefresh)==null||a.call(n)}catch(o){alert(`Failed to create bullet system: ${o instanceof Error?o.message:String(o)}`)}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}};var bi=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all";this.isContextMenuOpen=!1}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
367
+ `;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},s=()=>{let f=n.querySelector("#name-input").value.trim(),h=this.sanitizeInstanceId(f);if(!h){alert("Invalid name. Use letters, numbers, dots, dashes, or underscores.");return}a(),i(h)},o=()=>{a(),i(null)};n.querySelector(".add-menu-modal").addEventListener("click",g=>{g.stopPropagation()}),(p=n.querySelector('[data-action="confirm"]'))==null||p.addEventListener("click",s),(d=n.querySelector('[data-action="cancel"]'))==null||d.addEventListener("click",o),(u=n.querySelector(".add-menu-modal-close"))==null||u.addEventListener("click",o),n.addEventListener("click",g=>{g.target===n&&o()});let c=n.querySelector("#name-input");c.addEventListener("keydown",g=>{g.key==="Enter"?(g.preventDefault(),s()):g.key==="Escape"&&(g.preventDefault(),o())}),c.select(),document.body.appendChild(n),c.focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e){var o,l,c;this.close();let t=await this.promptScreen();if(!t)return;let i=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",n=await this.promptName(i);if(!n)return;let a=n,s=this.buildDefaultConfig(e,a,n);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,instanceId:a,objectConfigId:s.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:s})}),d=await p.json().catch(()=>({}));if(!p.ok||(d==null?void 0:d.success)===!1){let u=((o=d==null?void 0:d.errors)==null?void 0:o.join(`
368
+ `))||(d==null?void 0:d.error)||"Failed to create object.";alert(u);return}window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(p){alert(`Failed to create object: ${p instanceof Error?p.message:String(p)}`)}}async handleCreateFromTemplate(e){var a,s,o;this.close();let t=await this.promptScreen();if(!t)return;let i=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",n=await this.promptName(i);if(n)try{let l=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:n,screenId:t})}),c=await l.json().catch(()=>({}));if(!l.ok||(c==null?void 0:c.success)===!1){let p=((a=c==null?void 0:c.errors)==null?void 0:a.join(`
369
+ `))||(c==null?void 0:c.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(o=(s=this.options).onRefresh)==null||o.call(s)}catch(l){alert(`Failed to create from template: ${l instanceof Error?l.message:String(l)}`)}}async handleCreateSystem(e){var i,n,a,s,o,l,c,p,d,u,g,f,h,m,b,y,v,S;this.close();let t=await this.promptScreen();if(t){if(e==="collectable-system")try{let x=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await x.json().catch(()=>({}));if(!x.ok||(w==null?void 0:w.success)===!1){let O=((i=w==null?void 0:w.errors)==null?void 0:i.join(`
370
+ `))||(w==null?void 0:w.error)||"Failed to create collectable system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(a=(n=this.options).onRefresh)==null||a.call(n)}catch(x){alert(`Failed to create collectable system: ${x instanceof Error?x.message:String(x)}`)}if(e==="drag-snap-couples")try{let x=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await x.json().catch(()=>({}));if(!x.ok||(w==null?void 0:w.success)===!1){let O=((s=w==null?void 0:w.errors)==null?void 0:s.join(`
371
+ `))||(w==null?void 0:w.error)||"Failed to create drag-snap system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(x){alert(`Failed to create drag-snap system: ${x instanceof Error?x.message:String(x)}`)}if(e==="swerve-collect")try{let x=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await x.json().catch(()=>({}));if(!x.ok||(w==null?void 0:w.success)===!1){let O=((c=w==null?void 0:w.errors)==null?void 0:c.join(`
372
+ `))||(w==null?void 0:w.error)||"Failed to create swerve collect system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(d=(p=this.options).onRefresh)==null||d.call(p)}catch(x){alert(`Failed to create swerve collect system: ${x instanceof Error?x.message:String(x)}`)}if(e==="tap-destroy")try{let x=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await x.json().catch(()=>({}));if(!x.ok||(w==null?void 0:w.success)===!1){let O=((u=w==null?void 0:w.errors)==null?void 0:u.join(`
373
+ `))||(w==null?void 0:w.error)||"Failed to create tap destroy system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(f=(g=this.options).onRefresh)==null||f.call(g)}catch(x){alert(`Failed to create tap destroy system: ${x instanceof Error?x.message:String(x)}`)}if(e==="bullet-system")try{let x=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t})}),w=await x.json().catch(()=>({}));if(!x.ok||(w==null?void 0:w.success)===!1){let O=((h=w==null?void 0:w.errors)==null?void 0:h.join(`
374
+ `))||(w==null?void 0:w.error)||"Failed to create bullet system.";alert(O);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(b=(m=this.options).onRefresh)==null||b.call(m)}catch(x){alert(`Failed to create bullet system: ${x instanceof Error?x.message:String(x)}`)}if(e==="spawner"){let x=await this.promptName("template_id","Enter Template Instance ID");if(!x)return;let w=await this.promptName(`${x}_spawner_1`,"Enter Spawner Instance ID");if(!w)return;try{let O=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:t,templateId:x,instanceId:w})}),E=await O.json().catch(()=>({}));if(!O.ok||(E==null?void 0:E.success)===!1){let k=((y=E==null?void 0:E.errors)==null?void 0:y.join(`
375
+ `))||(E==null?void 0:E.error)||"Failed to create spawner.";alert(k);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(S=(v=this.options).onRefresh)==null||S.call(v)}catch(O){alert(`Failed to create spawner: ${O instanceof Error?O.message:String(O)}`)}}}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[AddObjectMenu] Failed to sync screens:",e)}}};var wi=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.options=null;this.retryTimer=null;this.screenFilter="all";this.isContextMenuOpen=!1}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}render(){return`
366
376
  <div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects">
367
377
  <div class="scene-panel-header" data-panel-handle>
368
378
  <div class="panel-title">
@@ -397,7 +407,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
397
407
  </div>
398
408
  <div class="panel-resize-handle-v" data-panel-resize-v></div>
399
409
  </div>
400
- `}initialize(e,t){var a,o,s,l,c,p,d;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(o=this.root)==null?void 0:o.querySelector("#scene-object-search"),(s=this.searchInput)==null||s.addEventListener("input",()=>this.refreshObjects());let i=(l=this.root)==null?void 0:l.querySelector("[data-add-object]");i==null||i.addEventListener("click",u=>{u.stopPropagation();let g=i.getBoundingClientRect();this.openAddObjectMenu({x:g.left,y:g.bottom+4})});let n=(c=this.root)==null?void 0:c.querySelector("#scene-screen-filter");if(n){try{let u=window.localStorage.getItem(this.getScreenFilterStorageKey());u&&(this.screenFilter=u)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let u=n.value||"all";this.screenFilter=u;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(p=this.root)==null||p.addEventListener("click",u=>{let g=u.target;if(!g||g.closest("[data-context-menu]"))return;let f=g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;h&&this.select(h)}),(d=this.listContainer)==null||d.addEventListener("contextmenu",u=>{var v;let g=u.target,f=g==null?void 0:g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;if(!h)return;u.preventDefault();let m=window.getEditableObjectConfig,b=typeof m=="function"?m(h):null;if(!b){let w=window.__editableObjectConfigs;w&&typeof w.get=="function"&&(b=(v=w.get(h))!=null?v:null)}let y=this.inferScreen(h,b);this.showContextMenu(h,y,u.clientX,u.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){var o,s,l,c,p;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{d.classList.toggle("selected",d.dataset.objectId===e)});let i=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumbs]"),n=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumb-screen]"),a=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&a)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,u),f={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),m=this.formatDisplayName(h);n.textContent=f[g]||g,a.textContent=m,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var g;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let n=e();if(!Array.isArray(n)||n.length===0){let f=window.__editableObjectConfigs;f&&typeof f.keys=="function"&&(n=Array.from(f.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let a=(((g=this.searchInput)==null?void 0:g.value)||"").trim().toLowerCase(),o=["loading","start","gameplay","tutorial","endgame"],s=Object.fromEntries(o.map(f=>[f,[]])),l=Object.fromEntries(o.map(f=>[f,[]])),c=[];n.forEach(f=>{var E,k,T,M;let h=typeof t=="function"?t(f):null;if(!h){let P=window.__editableObjectConfigs;P&&typeof P.get=="function"&&(h=(E=P.get(f))!=null?E:null)}let m=(((k=h==null?void 0:h.identity)==null?void 0:k.category)||"scene").toString(),b=(((T=h==null?void 0:h.identity)==null?void 0:T.id)||f).toString(),y=m.toLowerCase(),v=b.toLowerCase(),w=y.includes("ui")||v.startsWith("ui")||v.includes("label"),A=y==="system",L=this.formatDisplayName(b||f),$=((M=h==null?void 0:h.render)==null?void 0:M.visible)===!1||(h==null?void 0:h.enabled)===!1,x=this.getObjectType(h),_={id:f,label:L,category:m,isUi:w,isUnused:$,objectType:x},O=this.inferScreen(_.id,h);this.screenFilter!=="all"&&O!==this.screenFilter||!(!a||_.id.toLowerCase().includes(a)||_.label.toLowerCase().includes(a))||(A?c.push(_):(_.isUnused?l:s)[O].push(_))});let p={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},d=c.length>0?this.renderSystemGroup(c):"",u=o.map(f=>this.renderGroup(p[f],[...s[f],...l[f]])).join("");if(this.listContainer.innerHTML=d+u,c.length>0){let f=this.listContainer.querySelector("[data-delete-system-group]");f==null||f.addEventListener("click",h=>{h.stopPropagation(),this.deleteSystemGroup(c)})}this.setSelected(this.selectedId)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var s,l;let i=window.__HANDLER_SCREEN_INDEX,n=(s=i==null?void 0:i.instanceToScreen)==null?void 0:s[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let a=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),o=`${e} ${a}`.toLowerCase();return o.includes("loading")?"loading":o.includes("start")?"start":o.includes("tutorial")?"tutorial":o.includes("endgame")||o.includes("end_card")||o.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,o,s,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.endsWith(".json")?"animation":((s=(o=e.render)==null?void 0:o.asset)==null?void 0:s.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(p=(c=e.gameplay)==null?void 0:c.tuning)!=null&&p.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(a=>{var p,d;let o=typeof i=="function"?i(a.id):null;if(!o){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(o=(p=u.get(a.id))!=null?p:null)}let s=this.getTypeIconByType(a.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`
410
+ `}initialize(e,t){var a,s,o,l,c,p,d;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(s=this.root)==null?void 0:s.querySelector("#scene-object-search"),(o=this.searchInput)==null||o.addEventListener("input",()=>this.refreshObjects());let i=(l=this.root)==null?void 0:l.querySelector("[data-add-object]");i==null||i.addEventListener("click",u=>{u.stopPropagation();let g=i.getBoundingClientRect();this.openAddObjectMenu({x:g.left,y:g.bottom+4})});let n=(c=this.root)==null?void 0:c.querySelector("#scene-screen-filter");if(n){try{let u=window.localStorage.getItem(this.getScreenFilterStorageKey());u&&(this.screenFilter=u)}catch{}n.value=this.screenFilter;try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}n.addEventListener("change",()=>{let u=n.value||"all";this.screenFilter=u;try{window.localStorage.setItem(this.getScreenFilterStorageKey(),this.screenFilter)}catch{}try{window.__HANDLER_ACTIVE_SCREEN=this.screenFilter,window.dispatchEvent(new CustomEvent("handler:active-screen-changed",{detail:{screen:this.screenFilter}}))}catch{}this.refreshObjects()})}(p=this.root)==null||p.addEventListener("click",u=>{let g=u.target;if(!g||g.closest("[data-context-menu]"))return;let f=g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;h&&this.select(h)}),(d=this.listContainer)==null||d.addEventListener("contextmenu",u=>{var v;let g=u.target,f=g==null?void 0:g.closest("[data-object-id]");if(!f)return;let h=f.dataset.objectId;if(!h)return;u.preventDefault();let m=window.getEditableObjectConfig,b=typeof m=="function"?m(h):null;if(!b){let S=window.__editableObjectConfigs;S&&typeof S.get=="function"&&(b=(v=S.get(h))!=null?v:null)}let y=this.inferScreen(h,b);this.showContextMenu(h,y,u.clientX,u.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){var s,o,l,c,p;if(this.selectedId=e,!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{d.classList.toggle("selected",d.dataset.objectId===e)});let i=(s=this.root)==null?void 0:s.querySelector("[data-breadcrumbs]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-screen]"),a=(l=this.root)==null?void 0:l.querySelector("[data-breadcrumb-object]");if(i&&n&&a)if(e){let d=window.getEditableObjectConfig,u=typeof d=="function"?d(e):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(c=b.get(e))!=null?c:null)}let g=this.inferScreen(e,u),f={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},h=(((p=u==null?void 0:u.identity)==null?void 0:p.id)||e).toString(),m=this.formatDisplayName(h);n.textContent=f[g]||g,a.textContent=m,i.style.display="flex"}else i.style.display="none"}refreshObjects(){var g;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectConfig,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"){this.scheduleRetry();return}let n=e();if(!Array.isArray(n)||n.length===0){let f=window.__editableObjectConfigs;f&&typeof f.keys=="function"&&(n=Array.from(f.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let a=(((g=this.searchInput)==null?void 0:g.value)||"").trim().toLowerCase(),s=["loading","start","gameplay","tutorial","endgame"],o=Object.fromEntries(s.map(f=>[f,[]])),l=Object.fromEntries(s.map(f=>[f,[]])),c=[];n.forEach(f=>{var A,M,L,_;let h=typeof t=="function"?t(f):null;if(!h){let P=window.__editableObjectConfigs;P&&typeof P.get=="function"&&(h=(A=P.get(f))!=null?A:null)}let m=(((M=h==null?void 0:h.identity)==null?void 0:M.category)||"scene").toString(),b=(((L=h==null?void 0:h.identity)==null?void 0:L.id)||f).toString(),y=m.toLowerCase(),v=b.toLowerCase(),S=y.includes("ui")||v.startsWith("ui")||v.includes("label"),x=y==="system",w=this.formatDisplayName(b||f),O=((_=h==null?void 0:h.render)==null?void 0:_.visible)===!1||(h==null?void 0:h.enabled)===!1,E=this.getObjectType(h),k={id:f,label:w,category:m,isUi:S,isUnused:O,objectType:E},I=this.inferScreen(k.id,h);this.screenFilter!=="all"&&I!==this.screenFilter||!(!a||k.id.toLowerCase().includes(a)||k.label.toLowerCase().includes(a))||(x?c.push(k):(k.isUnused?l:o)[I].push(k))});let p={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},d=c.length>0?this.renderSystemGroup(c):"",u=s.map(f=>this.renderGroup(p[f],[...o[f],...l[f]])).join("");if(this.listContainer.innerHTML=d+u,c.length>0){let f=this.listContainer.querySelector("[data-delete-system-group]");f==null||f.addEventListener("click",h=>{h.stopPropagation(),this.deleteSystemGroup(c)})}this.setSelected(this.selectedId)}formatDisplayName(e){let t=e.replace(/^json\./,"").replace(/^ui\./,"").replace(/_\d+$/,"").replace(/\./g," ").replace(/_/g," ");return t=t.split(" ").map(i=>i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join(" "),t}inferScreen(e,t){var o,l;let i=window.__HANDLER_SCREEN_INDEX,n=(o=i==null?void 0:i.instanceToScreen)==null?void 0:o[e];if(n==="loading"||n==="start"||n==="gameplay"||n==="tutorial"||n==="endgame")return n;let a=(((l=t==null?void 0:t.identity)==null?void 0:l.id)||"").toString(),s=`${e} ${a}`.toLowerCase();return s.includes("loading")?"loading":s.includes("start")?"start":s.includes("tutorial")?"tutorial":s.includes("endgame")||s.includes("end_card")||s.includes("endcard")?"endgame":"gameplay"}getObjectType(e){var t,i,n,a,s,o,l,c,p;return e?(t=e.ui)!=null&&t.text?"text":(a=(n=(i=e.render)==null?void 0:i.asset)==null?void 0:n.path)!=null&&a.endsWith(".json")?"animation":((o=(s=e.render)==null?void 0:s.asset)==null?void 0:o.type)==="image"||(l=e.render)!=null&&l.texture?"sprite":(p=(c=e.gameplay)==null?void 0:c.tuning)!=null&&p.panel_width?"graphics":"container":"container"}renderGroup(e,t){if(!t.length)return"";let i=window.getEditableObjectConfig,n=t.map(a=>{var p,d;let s=typeof i=="function"?i(a.id):null;if(!s){let u=window.__editableObjectConfigs;u&&typeof u.get=="function"&&(s=(p=u.get(a.id))!=null?p:null)}let o=this.getTypeIconByType(a.objectType),l=this.getAssetPreview(s),c=(d=s==null?void 0:s.ui)!=null&&d.text?`"${s.ui.text.substring(0,12)}${s.ui.text.length>12?"...":""}"`:"";return`
401
411
  <button class="scene-object-item ${a.isUnused?"unused":""}" data-object-id="${a.id}">
402
412
  <span class="scene-object-label">${a.label}</span>
403
413
  ${c?`<span class="scene-object-text-preview">${c}</span>`:""}
@@ -410,7 +420,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
410
420
  ${n}
411
421
  </div>
412
422
  </div>
413
- `}renderSystemGroup(e){if(!e.length)return"";let t=window.getEditableObjectConfig,i=e.map(n=>{var c,p;let a=typeof t=="function"?t(n.id):null;if(!a){let d=window.__editableObjectConfigs;d&&typeof d.get=="function"&&(a=(c=d.get(n.id))!=null?c:null)}let o=this.getTypeIconByType(n.objectType),s=this.getAssetPreview(a),l=(p=a==null?void 0:a.ui)!=null&&p.text?`"${a.ui.text.substring(0,12)}${a.ui.text.length>12?"...":""}"`:"";return`
423
+ `}renderSystemGroup(e){if(!e.length)return"";let t=window.getEditableObjectConfig,i=e.map(n=>{var c,p;let a=typeof t=="function"?t(n.id):null;if(!a){let d=window.__editableObjectConfigs;d&&typeof d.get=="function"&&(a=(c=d.get(n.id))!=null?c:null)}let s=this.getTypeIconByType(n.objectType),o=this.getAssetPreview(a),l=(p=a==null?void 0:a.ui)!=null&&p.text?`"${a.ui.text.substring(0,12)}${a.ui.text.length>12?"...":""}"`:"";return`
414
424
  <button class="scene-object-item ${n.isUnused?"unused":""}" data-object-id="${n.id}">
415
425
  <span class="scene-object-label">${n.label}</span>
416
426
  ${l?`<span class="scene-object-text-preview">${l}</span>`:""}
@@ -426,15 +436,27 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
426
436
  ${i}
427
437
  </div>
428
438
  </div>
429
- `}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var i,n,a,o,s,l;if(!e)return"\u{1F4E6}";if((i=e.render)!=null&&i.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((n=e.ui)!=null&&n.text)return"\u{1F4DD}";if(((a=e.identity)==null?void 0:a.category)==="ui")return"\u{1F3A8}";if(e.effects||(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 i;if(!e)return null;let t=(i=e.render)==null?void 0:i.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var i,n,a,o;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((a=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:a.panel_bg_color)||((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 i,n,a,o;if(!e)return"";let t=[];return((i=e.render)==null?void 0:i.visible)===!1&&t.push("hidden"),((n=e.render)==null?void 0:n.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((a=e.interaction)!=null&&a.clickable||(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)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectMenu(e){try{await new mi({onRefresh:()=>this.refreshObjects(),onClose:()=>{}}).open(e)}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectMenu:",t)}}async openAddObjectWizard(e){try{new hi().open({screenId:e})}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectWizard:",t)}}async showContextMenu(e,t,i,n){if(!this.isContextMenuOpen){this.isContextMenuOpen=!0;try{new fi({objectId:e,screenId:t,onSelect:o=>{o&&this.select(o)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:o=>this.deleteObject(o)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var i;if(window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))try{let n=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e})}),a=await n.json().catch(()=>null);if(!n.ok||(a==null?void 0:a.success)===!1){let o=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
430
- `))||(a==null?void 0:a.error)||"Delete failed.";alert(o);return}this.refreshObjects()}catch(n){alert(`Delete failed: ${n instanceof Error?n.message:String(n)}`)}}async deleteSystemGroup(e){var l;let t=e.length;if(!window.confirm(`Delete all ${t} system object${t!==1?"s":""}? This will remove them from all screens.`))return;let n=e.map(c=>c.id),a=0,o=0,s=[];for(let c of n)try{let p=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:c})}),d=await p.json().catch(()=>null);if(p.ok&&(d==null?void 0:d.success)!==!1)a++;else{o++;let u=((l=d==null?void 0:d.errors)==null?void 0:l.join(`
431
- `))||(d==null?void 0:d.error)||"Delete failed.";s.push(`${c}: ${u}`)}}catch(p){o++,s.push(`${c}: ${p instanceof Error?p.message:String(p)}`)}if(o>0){let c=s.length>0?s.join(`
432
- `):`${o} object(s) failed to delete.`;alert(`Deleted ${a} object(s). Errors:
433
- ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1}render(){return`
439
+ `}getTypeIconByType(e){return{text:"\u{1F4DD}",sprite:"\u{1F5BC}\uFE0F",graphics:"\u2B1C",container:"\u{1F4E6}",animation:"\u{1F3AC}"}[e]||"\u{1F4E6}"}getTypeIcon(e){var i,n,a,s,o,l;if(!e)return"\u{1F4E6}";if((i=e.render)!=null&&i.texture){let c=e.render.texture;return c.includes("button")?"\u{1F518}":c.includes("key")?"\u{1F511}":"\u{1F5BC}\uFE0F"}if((n=e.ui)!=null&&n.text)return"\u{1F4DD}";if(((a=e.identity)==null?void 0:a.category)==="ui")return"\u{1F3A8}";if(e.effects||(o=(s=e.identity)==null?void 0:s.id)!=null&&o.includes("effect"))return"\u2728";if(e.audio)return"\u{1F50A}";let t=((l=e.identity)==null?void 0:l.id)||"";return t.includes("background")?"\u{1F5BC}\uFE0F":t.includes("character")?"\u{1F464}":t.includes("key")?"\u{1F511}":t.includes("draggable")?"\u{1F3AF}":t.includes("machine")?"\u2699\uFE0F":t.includes("tutorial")||t.includes("hand")?"\u{1F446}":"\u{1F4E6}"}getAssetPreview(e){var i;if(!e)return null;let t=(i=e.render)==null?void 0:i.texture;return t&&(t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg"))?t.startsWith("library/")||t.startsWith("/raw/")?`/raw/${t.replace(/^\/raw\//,"")}`:`/raw/${t}`:null}getColorIndicator(e){var i,n,a,s;if(!e)return"";let t=((i=e.render)==null?void 0:i.background_color)||((a=(n=e.gameplay)==null?void 0:n.tuning)==null?void 0:a.panel_bg_color)||((s=e.ui)==null?void 0:s.backgroundColor);return t?`<span class="scene-object-color-dot" style="background-color: ${t}" title="${t}"></span>`:""}getMetadata(e){var i,n,a,s;if(!e)return"";let t=[];return((i=e.render)==null?void 0:i.visible)===!1&&t.push("hidden"),((n=e.render)==null?void 0:n.z_index)!==void 0&&t.push(`z:${e.render.z_index}`),((a=e.interaction)!=null&&a.clickable||(s=e.ui)!=null&&s.button)&&t.push("clickable"),t.length>0?t.join(" \u2022 "):""}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refreshObjects()},400))}select(e){var t;this.selectedId=e,this.setSelected(e),(t=this.options)==null||t.onSelect(e)}getDefaultScreenForCreate(){if(this.screenFilter!=="all")return this.screenFilter;let e=window.__HANDLER_ACTIVE_SCREEN;return e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"}async openAddObjectMenu(e){try{await new vi({onRefresh:()=>this.refreshObjects(),onClose:()=>{}}).open(e)}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectMenu:",t)}}async openAddObjectWizard(e){try{new bi().open({screenId:e})}catch(t){console.warn("[SceneObjectsPanel] Failed to open AddObjectWizard:",t)}}async showContextMenu(e,t,i,n){if(!this.isContextMenuOpen){this.isContextMenuOpen=!0;try{new yi({objectId:e,screenId:t,onSelect:s=>{s&&this.select(s)},onRefresh:()=>this.refreshObjects(),onClose:()=>{this.isContextMenuOpen=!1},onDeleteRequest:s=>this.deleteObject(s)}).open({x:i,y:n})}catch(a){this.isContextMenuOpen=!1,console.warn("[SceneObjectsPanel] Failed to open context menu:",a)}}}async deleteObject(e){var i;if(window.confirm(`Delete "${e}"? This removes it from the screen configuration.`))try{let n=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e})}),a=await n.json().catch(()=>null);if(!n.ok||(a==null?void 0:a.success)===!1){let s=((i=a==null?void 0:a.errors)==null?void 0:i.join(`
440
+ `))||(a==null?void 0:a.error)||"Delete failed.";alert(s);return}await this.syncScreens(),this.refreshObjects()}catch(n){alert(`Delete failed: ${n instanceof Error?n.message:String(n)}`)}}async deleteSystemGroup(e){var l;let t=e.length;if(!window.confirm(`Delete all ${t} system object${t!==1?"s":""}? This will remove them from all screens.`))return;let n=e.map(c=>c.id),a=0,s=0,o=[];for(let c of n)try{let p=await fetch("/api/objects/delete",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:c})}),d=await p.json().catch(()=>null);if(p.ok&&(d==null?void 0:d.success)!==!1)a++;else{s++;let u=((l=d==null?void 0:d.errors)==null?void 0:l.join(`
441
+ `))||(d==null?void 0:d.error)||"Delete failed.";o.push(`${c}: ${u}`)}}catch(p){s++,o.push(`${c}: ${p instanceof Error?p.message:String(p)}`)}if(s>0){let c=o.length>0?o.join(`
442
+ `):`${s} object(s) failed to delete.`;alert(`Deleted ${a} object(s). Errors:
443
+ ${c}`)}await this.syncScreens(),this.refreshObjects()}async syncScreens(){try{await fetch("/api/sync-screens",{method:"POST"})}catch(e){console.warn("[SceneObjectsPanel] Failed to sync screens:",e)}}};K();var xi=class{constructor(){this.root=null;this.options=null;this.isCollapsed=!1;this.hasUnsavedChanges=!1}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}render(){let e=ye();return this.hasUnsavedChanges=e.hasChanges,`
434
444
  <div class="scene-tools-corner-panel ${this.isCollapsed?"collapsed":""}" data-panel="scene-tools-corner">
435
445
  <div class="scene-tools-header" data-tools-header data-panel-handle>
436
- <span class="scene-tools-title">Scene Tools</span>
446
+ <div class="scene-tools-title-wrapper">
447
+ <span class="scene-tools-title">Scene Tools${this.hasUnsavedChanges?'<span class="scene-tools-unsaved-star">\u2B50</span>':""}</span>
448
+ </div>
437
449
  <div class="scene-tools-header-actions">
450
+ ${this.hasUnsavedChanges?`
451
+ <button class="scene-tools-save-btn" data-scene-tools-save type="button" title="Save changes (${this.getShortcutKey()} + S)">
452
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
453
+ <path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path>
454
+ <polyline points="17 21 17 13 7 13 7 21"></polyline>
455
+ <polyline points="7 3 7 8 15 8"></polyline>
456
+ </svg>
457
+ <span class="scene-tools-save-text">Save <span class="scene-tools-save-shortcut">(${this.getShortcutKey()} + S)</span></span>
458
+ </button>
459
+ `:""}
438
460
  <div class="scene-tools-status-icons" data-status-icons>
439
461
  <span class="status-icon" data-status="bounds" title="Highlight Bounds">
440
462
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
@@ -475,7 +497,16 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
475
497
  </div>
476
498
  </div>
477
499
  </div>
478
- `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="scene-tools-corner"]'),!this.root)return;let i=localStorage.getItem("scene-tools-collapsed");i!==null&&(this.isCollapsed=i==="true",this.root.classList.toggle("collapsed",this.isCollapsed));let n=this.root.querySelector("[data-tools-collapse]");n==null||n.addEventListener("click",()=>{var c;this.isCollapsed=!this.isCollapsed,(c=this.root)==null||c.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let a=(c,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),a("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),a("anchor",s.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{a("nudge",l.checked)})}updateInfo(e){}};var vi=class{constructor(){this.root=null;this.options=null}render(){return`
500
+ `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="scene-tools-corner"]'),!this.root)return;let i=localStorage.getItem("scene-tools-collapsed");i!==null&&(this.isCollapsed=i==="true",this.root.classList.toggle("collapsed",this.isCollapsed)),window.addEventListener("config:changed",()=>{this.refreshUnsavedState()}),this.refreshUnsavedState();let n=this.root.querySelector("[data-scene-tools-save]");n==null||n.addEventListener("click",()=>{let p=document.querySelector("#apply-current-btn");p&&p.getAttribute("disabled")===null&&p.click()});let a=this.root.querySelector("[data-tools-collapse]");a==null||a.addEventListener("click",()=>{var p;this.isCollapsed=!this.isCollapsed,(p=this.root)==null||p.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let s=(p,d)=>{var g;let u=(g=this.root)==null?void 0:g.querySelector(`[data-status="${p}"]`);u&&u.classList.toggle("active",d)},o=this.root.querySelector("#debug-highlight-object");o==null||o.addEventListener("change",()=>{var p;(p=this.options)==null||p.onHighlightObject(!!o.checked),s("bounds",o.checked)});let l=this.root.querySelector("#debug-highlight-anchor");l==null||l.addEventListener("change",()=>{var p;(p=this.options)==null||p.onHighlightAnchor(!!l.checked),s("anchor",l.checked)});let c=this.root.querySelector("#debug-nudge-enabled");c==null||c.addEventListener("change",()=>{s("nudge",c.checked)})}refreshUnsavedState(){if(!this.root)return;let t=ye().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.root.querySelector("[data-tools-header]");if(i){let n=i.querySelector(".scene-tools-title-wrapper"),a=i.querySelector(".scene-tools-header-actions");if(n&&(n.innerHTML=`
501
+ <span class="scene-tools-title">Scene Tools${this.hasUnsavedChanges?'<span class="scene-tools-unsaved-star">\u2B50</span>':""}</span>
502
+ `),a){let s=a.querySelector("[data-status-icons]"),o=a.querySelector("[data-tools-collapse]");if(this.hasUnsavedChanges){if(!a.querySelector("[data-scene-tools-save]")){let c=document.createElement("button");c.className="scene-tools-save-btn",c.setAttribute("data-scene-tools-save",""),c.type="button";let p=this.getShortcutKey();c.title=`Save changes (${p} + S)`,c.innerHTML=`
503
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
504
+ <path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path>
505
+ <polyline points="17 21 17 13 7 13 7 21"></polyline>
506
+ <polyline points="7 3 7 8 15 8"></polyline>
507
+ </svg>
508
+ <span class="scene-tools-save-text">Save <span class="scene-tools-save-shortcut">(${p} + S)</span></span>
509
+ `,c.addEventListener("click",()=>{let d=document.querySelector("#apply-current-btn");d&&d.getAttribute("disabled")===null&&d.click()}),s&&s.parentElement&&s.parentElement.insertBefore(c,s)}}else{let l=a.querySelector("[data-scene-tools-save]");l==null||l.remove()}}}}}updateInfo(e){}};var Ei=class{constructor(){this.root=null;this.options=null}render(){return`
479
510
  <div class="nudge-panel hidden" data-panel="nudge-panel">
480
511
  <div class="nudge-panel-header" data-panel-handle>
481
512
  <span class="nudge-panel-title">Nudge Controls</span>
@@ -532,7 +563,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
532
563
  </div>
533
564
  </div>
534
565
  </div>
535
- `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(a=>{a.addEventListener("click",()=>{var l,c,p,d;let o=a.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(a=>{a.addEventListener("click",()=>{var l;let s=a.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(s)})})}show(){var e;(e=this.root)==null||e.classList.remove("hidden")}hide(){var e;(e=this.root)==null||e.classList.add("hidden")}getNudgeStep(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector("#nudge-step-input"),t=Number((n=e==null?void 0:e.value)!=null?n:10);return Number.isFinite(t)&&t>0?t:10}};var Tt=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let i=e||{},n=t||{},a={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},o=Array.isArray(i.slots)?i.slots:[];if(o.length>0&&a.slots.length>0)for(let c of a.slots){let p=o.find(d=>(d==null?void 0:d.slotId)&&d.slotId===(c==null?void 0:c.slotId));p!=null&&p.currentAsset&&p.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=p.currentAsset)}let s=i.libraryAssets||{};for(let[c,p]of Object.entries(s)){if(!Array.isArray(p))continue;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let d=new Set((a.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of p){let g=u==null?void 0:u.filename;!g||d.has(g)||(a.libraryAssets[c].unshift(u),d.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
566
+ `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(a=>{a.addEventListener("click",()=>{var l,c,p,d;let s=a.dataset.nudge,o=this.getNudgeStep();switch(s){case"up":(l=this.options)==null||l.onNudge(0,-o);break;case"down":(c=this.options)==null||c.onNudge(0,o);break;case"left":(p=this.options)==null||p.onNudge(-o,0);break;case"right":(d=this.options)==null||d.onNudge(o,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(a=>{a.addEventListener("click",()=>{var l;let o=a.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(o)})})}show(){var e;(e=this.root)==null||e.classList.remove("hidden")}hide(){var e;(e=this.root)==null||e.classList.add("hidden")}getNudgeStep(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector("#nudge-step-input"),t=Number((n=e==null?void 0:e.value)!=null?n:10);return Number.isFinite(t)&&t>0?t:10}};var Lt=class{constructor(){this.root=null;this.slotsContainer=null;this.options=null;this.registry=null;this.expandedSlot=null}mergeRegistries(e,t){let i=e||{},n=t||{},a={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},s=Array.isArray(i.slots)?i.slots:[];if(s.length>0&&a.slots.length>0)for(let c of a.slots){let p=s.find(d=>(d==null?void 0:d.slotId)&&d.slotId===(c==null?void 0:c.slotId));p!=null&&p.currentAsset&&p.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=p.currentAsset)}let o=i.libraryAssets||{};for(let[c,p]of Object.entries(o)){if(!Array.isArray(p))continue;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let d=new Set((a.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of p){let g=u==null?void 0:u.filename;!g||d.has(g)||(a.libraryAssets[c].unshift(u),d.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
536
567
  <div class="scene-panel library-panel panel-accent-purple" data-panel="library">
537
568
  <div class="scene-panel-header" data-panel-handle>
538
569
  <div class="panel-title">
@@ -551,7 +582,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
551
582
  </div>
552
583
  <div class="panel-resize-handle" data-panel-resize></div>
553
584
  </div>
554
- `}initialize(e,t){var a,o,s;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]");let i=(o=this.root)==null?void 0:o.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(s=this.root)==null?void 0:s.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),a=this.mergeRegistries(t,n);window.getEditableAssets=()=>a,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let a=document.createElement("div");a.className="library-category";let o=document.createElement("div");o.className="library-category-header",o.textContent=this.formatCategoryName(i),a.appendChild(o);let s=document.createElement("div");s.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);s.appendChild(c)}a.appendChild(s),this.slotsContainer.appendChild(a)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let a=document.createElement("div");a.className="slot-header";let 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),a.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),a.appendChild(l);let d=document.createElement("div");d.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async m=>{m.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),d.appendChild(g);let f=document.createElement("button");f.className="slot-reset",f.title="Reset to default",f.textContent="\u21BA",f.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),d.appendChild(f);let h=document.createElement("span");if(h.className="slot-expand-icon",h.textContent=i?"\u25BC":"\u25B6",d.appendChild(h),a.appendChild(d),a.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(a),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var a;let i=document.createElement("div");i.className="slot-library";let n=((a=this.registry)==null?void 0:a.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(o=>{let s=new Map;for(let c of n)s.set(c.filename,c);for(let c of o)s.has(c.filename)||s.set(c.filename,c);let l=Array.from(s.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let p=document.createElement("div");p.className="library-item";let d=document.createElement("img");d.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,d.alt=c.displayName,d.className="library-thumbnail",d.onerror=()=>{d.style.opacity="0.3"},p.appendChild(d);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,p.appendChild(u),p.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(p)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],o=/href="([^"]+\.(png|jpg|jpeg))"/gi,s;for(;(s=o.exec(n))!==null;){let l=s[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let a=`raw/library/${e.libraryFolder}/${t}`;n.onPick(a),window.__wizardAssetPicker=null;return}await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let a=await this.fileToDataUrl(i);if(!a){alert("Failed to read file");return}let 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:a,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(a){console.error("[Library] \u274C Upload error:",a),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var o;let a=(o=this.slotsContainer)==null?void 0:o.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var wi=class{detectType(e,t,i){let n=e.toLowerCase();return n==="logic_id"||n==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":n.includes("color")||n.includes("tint")?"color":typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":typeof t=="object"&&t!==null?"object":"text"}isHexColor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)}isImagePath(e){return/\.(png|jpg|jpeg|gif|svg)$/i.test(e)}};var xi=class{render(e,t,i,n){let a=this.formatLabel(t),o=i?this.getThumbnailUrl(i):"";return`
585
+ `}initialize(e,t){var a,s,o;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]");let i=(s=this.root)==null?void 0:s.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(o=this.root)==null?void 0:o.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),this.loadAssetRegistry()}reRender(){console.log("[LIBRARY] Re-rendering slots..."),this.loadAssetRegistry()}async refresh(){console.log("[LIBRARY] Force refreshing asset registry...");try{let e=window.getEditableAssets,t=typeof e=="function"?e():null,i=await fetch(`/raw/assetRegistry.json?t=${Date.now()}`);if(i.ok){let n=await i.json(),a=this.mergeRegistries(t,n);window.getEditableAssets=()=>a,console.log("[LIBRARY] \u2705 Registry re-fetched successfully")}}catch(e){console.warn("[LIBRARY] Failed to re-fetch registry:",e)}this.loadAssetRegistry()}loadAssetRegistry(e=0){let t=window.getEditableAssets;if(typeof t=="function"){let i=t();if(i!=null&&i.slots&&Array.isArray(i.slots)&&i.slots.length>0){this.registry=i,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.renderSlots();return}}e<15?(console.log(`[LIBRARY] Waiting for asset registry... (attempt ${e+1}/15)`),setTimeout(()=>this.loadAssetRegistry(e+1),200)):(console.warn("[LIBRARY] Failed to load asset registry"),this.slotsContainer&&(this.slotsContainer.innerHTML='<div class="library-info">No editable assets available</div>'))}renderSlots(){if(!this.slotsContainer||!this.registry)return;let e={};for(let i of this.registry.slots)e[i.category]||(e[i.category]=[]),e[i.category].push(i);let t=Date.now();this.slotsContainer.innerHTML="";for(let i of this.registry.categories){let n=e[i]||[];if(n.length===0)continue;let a=document.createElement("div");a.className="library-category";let s=document.createElement("div");s.className="library-category-header",s.textContent=this.formatCategoryName(i),a.appendChild(s);let o=document.createElement("div");o.className="library-category-slots";for(let l of n){let c=this.createSlotElement(l,t);o.appendChild(c)}a.appendChild(o),this.slotsContainer.appendChild(a)}}createSlotElement(e,t){let i=this.expandedSlot===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let a=document.createElement("div");a.className="slot-header";let s=document.createElement("div");s.className="slot-current";let o=document.createElement("img");o.src=`/raw/${e.currentAsset}?t=${t}`,o.alt=e.displayName,o.className="slot-thumbnail",o.onerror=()=>{o.style.display="none"},s.appendChild(o),a.appendChild(s);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let p=document.createElement("div");p.className="slot-asset",p.textContent=e.currentAsset,l.appendChild(c),l.appendChild(p),a.appendChild(l);let d=document.createElement("div");d.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async m=>{m.stopPropagation(),await this.handleAIEdit(e)}),d.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async m=>{m.stopPropagation(),await this.handleUpload(e)}),d.appendChild(g);let f=document.createElement("button");f.className="slot-reset",f.title="Reset to default",f.textContent="\u21BA",f.addEventListener("click",async m=>{m.stopPropagation(),await this.handleReset(e)}),d.appendChild(f);let h=document.createElement("span");if(h.className="slot-expand-icon",h.textContent=i?"\u25BC":"\u25B6",d.appendChild(h),a.appendChild(d),a.addEventListener("click",()=>{this.expandedSlot=this.expandedSlot===e.slotId?null:e.slotId,this.renderSlots()}),n.appendChild(a),i){let m=this.createLibraryElement(e,t);n.appendChild(m)}return n}createLibraryElement(e,t){var a;let i=document.createElement("div");i.className="slot-library";let n=((a=this.registry)==null?void 0:a.libraryAssets[e.libraryFolder])||[];return this.fetchFolderAssets(e.libraryFolder,t).then(s=>{let o=new Map;for(let c of n)o.set(c.filename,c);for(let c of s)o.has(c.filename)||o.set(c.filename,c);let l=Array.from(o.values());if(l.length===0){i.innerHTML='<div class="library-empty">No alternative assets</div>';return}i.innerHTML="";for(let c of l){let p=document.createElement("div");p.className="library-item";let d=document.createElement("img");d.src=`/raw/library/${e.libraryFolder}/${c.filename}?t=${t}`,d.alt=c.displayName,d.className="library-thumbnail",d.onerror=()=>{d.style.opacity="0.3"},p.appendChild(d);let u=document.createElement("div");u.className="library-label",u.textContent=c.displayName,p.appendChild(u),p.addEventListener("click",async()=>{await this.handleApply(e,c.filename)}),i.appendChild(p)}}),i.innerHTML='<div class="library-loading">Loading assets...</div>',i}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],s=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=s.exec(n))!==null;){let l=o[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t){var i;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let n=window.__wizardAssetPicker;if(n!=null&&n.onPick){let a=`raw/library/${e.libraryFolder}/${t}`;n.onPick(a),window.__wizardAssetPicker=null;return}await((i=this.options)==null?void 0:i.onApply(e.objectId,t,e.category)),e.currentAsset=t,this.renderSlots()}catch(n){console.error("[LIBRARY] Failed to apply asset:",n)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots()}catch(i){console.error("[LIBRARY] Failed to reset slot:",i)}}formatCategoryName(e){return e.replace(/_/g," ").split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let a=await this.fileToDataUrl(i);if(!a){alert("Failed to read file");return}let o=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",o,"to category:",l);let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${o}.png`,data:a,overwrite:!0})})).json();if(p.success){console.log("[Library] \u2705 Upload saved:",p.path);let d=window.addAssetToRegistry;typeof d=="function"&&d(l,`${o}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(u){console.warn("[Library] Setup-library not available:",u)}await this.handleApply(e,`${o}.png`),e.currentAsset=`${o}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",p.error),alert(`Upload failed: ${p.error}`)}catch(a){console.error("[Library] \u274C Upload error:",a),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.expandedSlot=n.slotId,this.renderSlots(),setTimeout(()=>{var s;let a=(s=this.slotsContainer)==null?void 0:s.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Si=class{detectType(e,t,i){let n=e.toLowerCase();return n==="logic_id"||n==="logicid"?"select":typeof t=="string"&&t.match(/\.(png|jpg|jpeg|gif|webp)$/i)?"image":n.includes("color")||n.includes("tint")?"color":typeof t=="boolean"?"boolean":typeof t=="number"?"number":Array.isArray(t)?"array":typeof t=="object"&&t!==null?"object":"text"}isHexColor(e){return/^#[0-9a-fA-F]{6}$/i.test(e)}isImagePath(e){return/\.(png|jpg|jpeg|gif|svg)$/i.test(e)}};var Ai=class{render(e,t,i,n){let a=this.formatLabel(t),s=i?this.getThumbnailUrl(i):"";return`
555
586
  <div class="inspector-property" data-property-type="image">
556
587
  <div class="inspector-property-header">
557
588
  <label class="inspector-label">${a}</label>
@@ -562,9 +593,9 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
562
593
  <button class="debug-btn debug-btn-sm" data-action="reset" data-path="${n}" data-object="${e}" title="Reset">\u21BA</button>
563
594
  </div>
564
595
  </div>
565
- ${o?`
596
+ ${s?`
566
597
  <div class="inspector-image-preview">
567
- <img src="${o}" alt="${a}" class="inspector-thumbnail" />
598
+ <img src="${s}" alt="${a}" class="inspector-thumbnail" />
568
599
  </div>
569
600
  `:`
570
601
  <div class="inspector-image-preview inspector-image-empty">
@@ -573,7 +604,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
573
604
  </div>
574
605
  `}
575
606
  </div>
576
- `}getThumbnailUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("http")?e:`/raw/${e}?t=${Date.now()}`}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ei=class{render(e,t,i,n){let a=i||"#000000";return`
607
+ `}getThumbnailUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("http")?e:`/raw/${e}?t=${Date.now()}`}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ci=class{render(e,t,i,n){let a=i||"#000000";return`
577
608
  <div class="inspector-property inspector-property-color">
578
609
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
579
610
  <div class="inspector-color-group">
@@ -589,7 +620,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
589
620
  data-object-id="${e}" />
590
621
  </div>
591
622
  </div>
592
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Si=class{render(e,t,i,n){return`
623
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ti=class{render(e,t,i,n){return`
593
624
  <div class="inspector-property inspector-property-number">
594
625
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
595
626
  <input type="number"
@@ -599,7 +630,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
599
630
  data-object-id="${e}"
600
631
  step="any" />
601
632
  </div>
602
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ai=class{render(e,t,i,n){let a=String(i||"");return`
633
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Li=class{render(e,t,i,n){let a=String(i||"");return`
603
634
  <div class="inspector-property inspector-property-text">
604
635
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
605
636
  <div class="inspector-input-group">
@@ -610,7 +641,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
610
641
  data-object-id="${e}" />
611
642
  </div>
612
643
  </div>
613
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ci=class{render(e,t,i,n){return`
644
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ki=class{render(e,t,i,n){return`
614
645
  <div class="inspector-property inspector-property-boolean">
615
646
  <label class="inspector-property-label">
616
647
  <input type="checkbox"
@@ -621,42 +652,42 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
621
652
  <span>${this.formatLabel(t)}</span>
622
653
  </label>
623
654
  </div>
624
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ti=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let o=Array.isArray(i)?i:[],s=o.map((c,p)=>{let d=`${n}.${p}`,u=`
655
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Mi=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&this.registry){let s=this.registry,o=Array.isArray(i)?i:[],l=o.map((p,d)=>{let u=`${n}.${d}`,g=`
625
656
  <button class="inspector-button inspector-button-small"
626
657
  data-logic-remove="true"
627
658
  data-object-id="${e}"
628
659
  data-property-path="${n}"
629
- data-index="${p}">
660
+ data-index="${d}">
630
661
  Remove
631
662
  </button>
632
- `;if(c&&typeof c=="object"&&!Array.isArray(c)){let f=this.registry.renderProperty(e,"logic",c,d);return`
633
- <div class="inspector-array-item inspector-logic-item">
634
- <div class="inspector-array-item-header">
635
- <span>Logic ${p+1}</span>
636
- ${u}
663
+ `;if(p&&typeof p=="object"&&!Array.isArray(p)){let h=s.renderProperty(e,"logic",p,u);return`
664
+ <div class="inspector-array-item inspector-logic-item">
665
+ <div class="inspector-array-item-header">
666
+ <span>Logic ${d+1}</span>
667
+ ${g}
637
668
  </div>
638
669
  <div class="inspector-array-item-body">
639
- ${f}
670
+ ${h}
640
671
  </div>
641
672
  </div>
642
- `}let g=typeof c=="string"?c:JSON.stringify(c);return`
673
+ `}let f=typeof p=="string"?p:JSON.stringify(p);return`
643
674
  <div class="inspector-array-item inspector-logic-item">
644
675
  <div class="inspector-array-item-header">
645
- <span>Logic ${p+1}</span>
646
- ${u}
676
+ <span>Logic ${d+1}</span>
677
+ ${g}
647
678
  <button class="inspector-button inspector-button-small"
648
679
  data-logic-convert="true"
649
680
  data-object-id="${e}"
650
681
  data-property-path="${n}"
651
- data-index="${p}">
682
+ data-index="${d}">
652
683
  Convert
653
684
  </button>
654
685
  </div>
655
686
  <div class="inspector-array-item-body inspector-array-item-raw">
656
- ${g}
687
+ ${f}
657
688
  </div>
658
689
  </div>
659
- `}).join(""),l=`
690
+ `}).join(""),c=`
660
691
  <button class="inspector-button"
661
692
  data-logic-add="true"
662
693
  data-object-id="${e}"
@@ -667,10 +698,10 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
667
698
  <div class="inspector-property inspector-property-array">
668
699
  <label class="inspector-property-label">${this.formatLabel(t)} (${o.length} items)</label>
669
700
  <div class="inspector-array-list">
670
- ${s||'<div class="inspector-array-empty">Empty array</div>'}
701
+ ${l||'<div class="inspector-array-empty">Empty array</div>'}
671
702
  </div>
672
703
  <div class="inspector-array-actions">
673
- ${l}
704
+ ${c}
674
705
  </div>
675
706
  </div>
676
707
  `}if(!Array.isArray(i)||i.length===0)return`
@@ -678,14 +709,14 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
678
709
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
679
710
  <div class="inspector-array-empty">Empty array</div>
680
711
  </div>
681
- `;let a=i.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`
712
+ `;let a=i.map((s,o)=>typeof s=="string"?`<div class="inspector-array-item">\u2022 ${s}</div>`:typeof s=="object"?`<div class="inspector-array-item">\u2022 ${JSON.stringify(s)}</div>`:`<div class="inspector-array-item">\u2022 ${String(s)}</div>`).join("");return`
682
713
  <div class="inspector-property inspector-property-array">
683
714
  <label class="inspector-property-label">${this.formatLabel(t)} (${i.length} items)</label>
684
715
  <div class="inspector-array-list">
685
716
  ${a}
686
717
  </div>
687
718
  </div>
688
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Li=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&i&&typeof i=="object"&&!Array.isArray(i))return this.renderLogic(e,t,i,n);let a=[];for(let s in i){let l=i[s],c=`${n}.${s}`,p=this.registry.renderProperty(e,s,l,c);p&&a.push(p)}return a.length===0?"":a.length<=4&&a.every(s=>s.includes("inspector-property"))?`
719
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Pi=class{constructor(e){this.registry=e}render(e,t,i,n){if(t==="logic"&&i&&typeof i=="object"&&!Array.isArray(i))return this.renderLogic(e,t,i,n);let a=[];for(let o in i){let l=i[o],c=`${n}.${o}`,p=this.registry.renderProperty(e,o,l,c);p&&a.push(p)}return a.length===0?"":a.length<=4&&a.every(o=>o.includes("inspector-property"))?`
689
720
  <div class="inspector-subsection">
690
721
  <div class="inspector-subsection-title">${this.formatLabel(t)}</div>
691
722
  <div class="inspector-subsection-content">
@@ -699,7 +730,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
699
730
  ${a.join("")}
700
731
  </div>
701
732
  </div>
702
- `}renderLogic(e,t,i,n){let a=[],o=typeof(i==null?void 0:i.id)=="string"?i.id:"",s={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let u=window,g=Array.isArray(u==null?void 0:u.__HANDLER_LOGIC_OPTIONS)?u.__HANDLER_LOGIC_OPTIONS:[],h=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(m=>String(m)).filter(m=>m.trim().length>0);return Array.from(new Set(h)).sort((m,b)=>m.localeCompare(b))})(),c=o&&!l.includes(o)?[o,...l]:l;a.push(`
733
+ `}renderLogic(e,t,i,n){let a=[],s=typeof(i==null?void 0:i.id)=="string"?i.id:"",o={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let u=window,g=Array.isArray(u==null?void 0:u.__HANDLER_LOGIC_OPTIONS)?u.__HANDLER_LOGIC_OPTIONS:[],h=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(m=>String(m)).filter(m=>m.trim().length>0);return Array.from(new Set(h)).sort((m,b)=>m.localeCompare(b))})(),c=s&&!l.includes(s)?[s,...l]:l;a.push(`
703
734
  <div class="inspector-property inspector-property-text">
704
735
  <label class="inspector-property-label">Id</label>
705
736
  <div class="inspector-input-group">
@@ -707,35 +738,35 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
707
738
  data-property-path="${n}.id"
708
739
  data-object-id="${e}"
709
740
  data-logic-id-selector="true">
710
- <option value="" ${o?"":"selected"}>None</option>
711
- ${c.map(u=>`<option value="${u}" ${u===o?"selected":""}>${u}</option>`).join("")}
741
+ <option value="" ${s?"":"selected"}>None</option>
742
+ ${c.map(u=>`<option value="${u}" ${u===s?"selected":""}>${u}</option>`).join("")}
712
743
  </select>
713
744
  </div>
714
745
  </div>
715
- `);for(let u in i){if(u==="id")continue;let g=i[u],f=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let m=[];for(let b in g){let y=g[b],v=`${f}.${b}`,w=s[b];if(b==="targetId"||b==="inputId"){let A=this.registry.getObjectIds(),L=typeof y=="string"?y:"",$=L&&!A.includes(L)?[L,...A]:A;m.push(`
746
+ `);for(let u in i){if(u==="id")continue;let g=i[u],f=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let m=[];for(let b in g){let y=g[b],v=`${f}.${b}`,S=o[b];if(b==="targetId"||b==="inputId"){let x=this.registry.getObjectIds(),w=typeof y=="string"?y:"",O=w&&!x.includes(w)?[w,...x]:x;m.push(`
716
747
  <div class="inspector-property inspector-property-text">
717
748
  <label class="inspector-property-label">${this.formatLabel(b)}</label>
718
749
  <div class="inspector-input-group">
719
750
  <select class="inspector-component-select inspector-input"
720
751
  data-property-path="${v}"
721
752
  data-object-id="${e}">
722
- <option value="" ${L?"":"selected"}>None</option>
723
- ${$.map(x=>`<option value="${x}" ${x===L?"selected":""}>${x}</option>`).join("")}
753
+ <option value="" ${w?"":"selected"}>None</option>
754
+ ${O.map(E=>`<option value="${E}" ${E===w?"selected":""}>${E}</option>`).join("")}
724
755
  </select>
725
756
  </div>
726
757
  </div>
727
- `);continue}if(Array.isArray(w)&&w.length)m.push(`
758
+ `);continue}if(Array.isArray(S)&&S.length)m.push(`
728
759
  <div class="inspector-property inspector-property-text">
729
760
  <label class="inspector-property-label">${this.formatLabel(b)}</label>
730
761
  <div class="inspector-input-group">
731
762
  <select class="inspector-component-select inspector-input"
732
763
  data-property-path="${v}"
733
764
  data-object-id="${e}">
734
- ${w.map(A=>`<option value="${String(A)}" ${String(A)===String(y)?"selected":""}>${String(A)}</option>`).join("")}
765
+ ${S.map(x=>`<option value="${String(x)}" ${String(x)===String(y)?"selected":""}>${String(x)}</option>`).join("")}
735
766
  </select>
736
767
  </div>
737
768
  </div>
738
- `);else{let A=this.registry.renderProperty(e,b,y,v);A&&m.push(A)}}m.length&&a.push(`
769
+ `);else{let x=this.registry.renderProperty(e,b,y,v);x&&m.push(x)}}m.length&&a.push(`
739
770
  <div class="inspector-property inspector-property-object">
740
771
  <div class="inspector-object-header">Props</div>
741
772
  <div class="inspector-object-body">
@@ -760,18 +791,18 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
760
791
  ${d}
761
792
  </div>
762
793
  </div>
763
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ki=class{render(e,t,i,n,a){let o=i==null?"":String(i),s=Array.from(new Set(a.map(c=>String(c)))),l=o&&!s.includes(o)?[o,...s]:s;return`
794
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var _i=class{render(e,t,i,n,a){let s=i==null?"":String(i),o=Array.from(new Set(a.map(c=>String(c)))),l=s&&!o.includes(s)?[s,...o]:o;return`
764
795
  <div class="inspector-property inspector-property-text">
765
796
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
766
797
  <div class="inspector-input-group">
767
798
  <select class="inspector-component-select inspector-input"
768
799
  data-property-path="${n}"
769
800
  data-object-id="${e}">
770
- ${l.map(c=>`<option value="${c}" ${c===o?"selected":""}>${c}</option>`).join("")}
801
+ ${l.map(c=>`<option value="${c}" ${c===s?"selected":""}>${c}</option>`).join("")}
771
802
  </select>
772
803
  </div>
773
804
  </div>
774
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Pi=class{render(e,t,i,n){let a=this.safeStringify(i);return`
805
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Oi=class{render(e,t,i,n){let a=this.safeStringify(i);return`
775
806
  <div class="inspector-property inspector-property-text">
776
807
  <label class="inspector-property-label">${this.formatLabel(t)}</label>
777
808
  <div class="inspector-input-group">
@@ -782,7 +813,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
782
813
  rows="6">${a}</textarea>
783
814
  </div>
784
815
  </div>
785
- `}safeStringify(e){try{return JSON.stringify(e!=null?e:[],null,2)}catch{return"[]"}}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Mi=class{render(e,t,i,n){let o=(Array.isArray(i)?i:[]).map((s,l)=>{let c=typeof(s==null?void 0:s.x)=="number"?s.x:0,p=typeof(s==null?void 0:s.y)=="number"?s.y:0;return`
816
+ `}safeStringify(e){try{return JSON.stringify(e!=null?e:[],null,2)}catch{return"[]"}}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ii=class{render(e,t,i,n){let s=(Array.isArray(i)?i:[]).map((o,l)=>{let c=typeof(o==null?void 0:o.x)=="number"?o.x:0,p=typeof(o==null?void 0:o.y)=="number"?o.y:0;return`
786
817
  <div class="inspector-row" style="gap:8px; align-items:center;">
787
818
  <input type="number"
788
819
  class="inspector-input"
@@ -805,7 +836,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
805
836
  <div class="inspector-property inspector-property-object">
806
837
  <div class="inspector-object-header">${this.formatLabel(t)}</div>
807
838
  <div class="inspector-object-body">
808
- ${o||'<div class="inspector-text-sm" style="opacity:0.7;">No spawn points.</div>'}
839
+ ${s||'<div class="inspector-text-sm" style="opacity:0.7;">No spawn points.</div>'}
809
840
  <div class="inspector-row" style="margin-top:8px;">
810
841
  <button type="button"
811
842
  class="inspector-btn inspector-btn-sm primary"
@@ -815,7 +846,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
815
846
  </div>
816
847
  </div>
817
848
  </div>
818
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var _i=class{constructor(e){this.registry=e}render(e,t,i,n){let a=Array.isArray(i)?i:[],s=["",...this.registry.getObjectIds()],l=a.map((c,p)=>{let d=typeof(c==null?void 0:c.templateId)=="string"?c.templateId:"",u=typeof(c==null?void 0:c.weight)=="number"?c.weight:1,g=s.map(f=>`<option value="${f}"${f===d?" selected":""}>${f||"(none)"}</option>`).join("");return`
849
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var ji=class{constructor(e){this.registry=e}render(e,t,i,n){let a=Array.isArray(i)?i:[],o=["",...this.registry.getObjectIds()],l=a.map((c,p)=>{let d=typeof(c==null?void 0:c.templateId)=="string"?c.templateId:"",u=typeof(c==null?void 0:c.weight)=="number"?c.weight:1,g=o.map(f=>`<option value="${f}"${f===d?" selected":""}>${f||"(none)"}</option>`).join("");return`
819
850
  <div class="inspector-row" style="gap:8px; align-items:center;">
820
851
  <select class="inspector-select inspector-input"
821
852
  data-property-path="${n}.${p}.templateId"
@@ -850,7 +881,7 @@ ${c}`)}this.refreshObjects()}};var yi=class{constructor(){this.root=null;this.op
850
881
  </div>
851
882
  </div>
852
883
  </div>
853
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Oi=class{constructor(){this.typeDetector=new wi,this.imageRenderer=new xi,this.colorRenderer=new Ei,this.numberRenderer=new Si,this.textRenderer=new Ai,this.booleanRenderer=new Ci,this.arrayRenderer=new Ti(this),this.objectRenderer=new Li(this),this.selectRenderer=new ki,this.jsonRenderer=new Pi,this.spawnPointsRenderer=new Mi,this.spawnTemplatesRenderer=new _i(this)}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,a=n==null?void 0:n.schemas;if(!a)return null;let o=String(e||"").split(".").filter(Boolean);if(o.length<2)return null;let s=o[0],l=o.slice(1).join("."),c=a instanceof Map?a.get(s):a==null?void 0:a[s];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,o)=>a.localeCompare(o))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),o=a==="logic"||a==="logic_id"||a==="logicid",s=a==="id"&&n.toLowerCase().includes("logic");if((o||s)&&typeof i=="string"){let f=this.getLogicOptions(),h=this.selectRenderer.render(e,t,i,n,f);return o?`
884
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Ri=class{constructor(){this.typeDetector=new Si,this.imageRenderer=new Ai,this.colorRenderer=new Ci,this.numberRenderer=new Ti,this.textRenderer=new Li,this.booleanRenderer=new ki,this.arrayRenderer=new Mi(this),this.objectRenderer=new Pi(this),this.selectRenderer=new _i,this.jsonRenderer=new Oi,this.spawnPointsRenderer=new Ii,this.spawnTemplatesRenderer=new ji(this)}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,a=n==null?void 0:n.schemas;if(!a)return null;let s=String(e||"").split(".").filter(Boolean);if(s.length<2)return null;let o=s[0],l=s.slice(1).join("."),c=a instanceof Map?a.get(o):a==null?void 0:a[o];if(!c)return null;let p=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof p!="string"||!p.startsWith("enum:"))return null;let u=p.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,s)=>a.localeCompare(s))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),s=a==="logic"||a==="logic_id"||a==="logicid",o=a==="id"&&n.toLowerCase().includes("logic");if((s||o)&&typeof i=="string"){let f=this.getLogicOptions(),h=this.selectRenderer.render(e,t,i,n,f);return s?`
854
885
  ${h}
855
886
  <div class="inspector-array-actions">
856
887
  <button class="inspector-button"
@@ -860,7 +891,7 @@ ${h}
860
891
  Add Logic
861
892
  </button>
862
893
  </div>
863
- `:h}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},p=l[t];if(p&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,p);let d=c[t];if(d&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let f=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,f,n,d)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let f=this.getObjectIds(),h=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...f]);return t==="hitTemplateId"&&n.includes("logic.props")?h+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':h}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function qs(r,e){let t;return function(...n){let a=()=>{clearTimeout(t),r(...n)};clearTimeout(t),t=setTimeout(a,e)}}var Ii=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new Oi,this.updateManager=new Qe,this.quickActions=new gi;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
894
+ `:h}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},p=l[t];if(p&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,p);let d=c[t];if(d&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let f=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,f,n,d)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let f=this.getObjectIds(),h=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...f]);return t==="hitTemplateId"&&n.includes("logic.props")?h+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':h}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let h=["1","-1"],m=i==null?"1":String(i);return this.selectRenderer.render(e,t,m,n,h)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let h=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,h,n)}}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function Wo(r,e){let t;return function(...n){let a=()=>{clearTimeout(t),r(...n)};clearTimeout(t),t=setTimeout(a,e)}}var zi=class{constructor(){this.root=null;this.contentContainer=null;this.selectedObjectId=null;this.options=null;this.showAdvanced=!1;this.motionSimpleMode=!0;this.expandMotionOnNextRender=!1;this.rendererRegistry=new Ri,this.updateManager=new Qe,this.quickActions=new mi;try{let e=localStorage.getItem("inspector:motionSimple");e!==null&&(this.motionSimpleMode=e==="true")}catch{}window.addEventListener("inspector:refresh",()=>{this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),window.addEventListener("config:changed",()=>{})}render(){return`
864
895
  <div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
865
896
  <div class="scene-panel-header" data-panel-handle>
866
897
  <div class="panel-title">
@@ -881,22 +912,22 @@ ${h}
881
912
  </div>
882
913
  </div>
883
914
  </div>
884
- `}initialize(e,t){var i;this.options=t,this.root=e.querySelector('[data-panel="inspector"]'),this.contentContainer=(i=this.root)==null?void 0:i.querySelector("[data-inspector-content]")}loadObject(e){this.selectedObjectId=e;let t=window.getEditableObjectConfig;if(typeof t!="function"){this.showError("Config system not ready");return}let i=t(e);if(!i){console.error("[InspectorPanel] Object not found in config system:",e),this.showError(`Object not found: ${e}`);return}this.renderProperties(e,i)}renderProperties(e,t){if(!this.contentContainer)return;let i=[],n=t.identity||{},a=n.id||e,o=n.category||"unknown";i.push(`
915
+ `}initialize(e,t){var i;this.options=t,this.root=e.querySelector('[data-panel="inspector"]'),this.contentContainer=(i=this.root)==null?void 0:i.querySelector("[data-inspector-content]")}loadObject(e){this.selectedObjectId=e;let t=window.getEditableObjectConfig;if(typeof t!="function"){this.showError("Config system not ready");return}let i=t(e);if(!i){console.error("[InspectorPanel] Object not found in config system:",e),this.showError(`Object not found: ${e}`);return}this.renderProperties(e,i)}renderProperties(e,t){if(!this.contentContainer)return;let i=[],n=t.identity||{},a=n.id||e,s=n.category||"unknown";i.push(`
885
916
  <div class="inspector-header">
886
917
  <div class="inspector-header-info">
887
918
  <div class="inspector-object-name">${a}</div>
888
- <div class="inspector-object-category">${o}</div>
919
+ <div class="inspector-object-category">${s}</div>
889
920
  </div>
890
921
  ${this.renderConversionButtons(e,t)}
891
922
  </div>
892
- `);let s=["transform","ui","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;i.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;i.push(this.renderSection(e,l,t[l],l))}this.contentContainer.innerHTML=i.join("")+this.renderFooter(t),this.attachEventListeners(),this.expandMotionOnNextRender=!1}renderConversionButtons(e,t){var s,l,c,p;let i=!!t.ui,n=((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(!(i||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||n)return"";let o=(p=t.ui)!=null&&p.text?"ui.text":"render.asset.path";return`
923
+ `);let o=["transform","ui","render","gameplay","interaction","audio","effects","physics","motion","identity"];for(let l of o){let c=t[l];if(c){if(!this.showAdvanced&&!this.isSectionMeaningful(l,c,t))continue;i.push(this.renderSection(e,l,c,l))}}for(let l in t)if(!o.includes(l)&&typeof t[l]=="object"&&t[l]!==null){if(!this.showAdvanced&&!this.isSectionMeaningful(l,t[l],t))continue;i.push(this.renderSection(e,l,t[l],l))}this.contentContainer.innerHTML=i.join("")+this.renderFooter(t),this.attachEventListeners(),this.expandMotionOnNextRender=!1}renderConversionButtons(e,t){var o,l,c,p;let i=!!t.ui,n=((o=t.ui)==null?void 0:o.renderMode)==="png"||((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.type)==="image";if(!(i||e.includes("ui_endgame")||e.includes("splash")||e.includes("button")||e.includes("label"))||n)return"";let s=(p=t.ui)!=null&&p.text?"ui.text":"render.asset.path";return`
893
924
  <div class="inspector-quick-actions">
894
925
  <button class="debug-btn debug-btn-sm success ai-simple-btn" type="button" data-convert-toggle>
895
926
  \u2728 Convert to PNG
896
927
  </button>
897
928
  <div class="inspector-convert-menu hidden" data-convert-menu>
898
929
  <button class="debug-btn debug-btn-sm" data-action="library" data-path="render.asset.path" data-object="${e}">\u{1F3A8} Library</button>
899
- <button class="debug-btn debug-btn-sm" data-action="ai-convert" data-path="${o}" data-object="${e}">\u2728 AI</button>
930
+ <button class="debug-btn debug-btn-sm" data-action="ai-convert" data-path="${s}" data-object="${e}">\u2728 AI</button>
900
931
  <button class="debug-btn debug-btn-sm" data-action="upload" data-path="render.asset.path" data-object="${e}">\u{1F4E4} Upload</button>
901
932
  </div>
902
933
  </div>
@@ -910,7 +941,7 @@ ${h}
910
941
  <button class="debug-btn debug-btn-sm primary" data-inspector-add-component-btn>Add</button>
911
942
  </div>
912
943
  </div>
913
- `}renderSection(e,t,i,n){if(t==="motion")return this.renderMotionSection(e,i,n);if(t==="logic")return this.renderLogicSection(e,i,n);let a=[],o=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let c in i){if(!this.showAdvanced&&o.includes(c))continue;let p=i[c],d=`${n}.${c}`,u=this.rendererRegistry.renderProperty(e,c,p,d);u&&a.push(u)}return a.length===0?"":`
944
+ `}renderSection(e,t,i,n){if(t==="motion")return this.renderMotionSection(e,i,n);if(t==="logic")return this.renderLogicSection(e,i,n);let a=[],s=["kind","renderMode","position_ratio","position_mode","responsive","slot_id","asset_type"];for(let c in i){if(!this.showAdvanced&&s.includes(c))continue;let p=i[c],d=`${n}.${c}`,u=this.rendererRegistry.renderProperty(e,c,p,d);u&&a.push(u)}return a.length===0?"":`
914
945
  <div class="inspector-section ${t==="transform"?"":"collapsed"}" data-section="${t}">
915
946
  <div class="inspector-section-header" data-section-toggle="${t}">
916
947
  <span class="inspector-section-arrow">\u25BC</span>
@@ -932,7 +963,7 @@ ${h}
932
963
  ${n}
933
964
  </div>
934
965
  </div>
935
- `:""}renderMotionSection(e,t,i){var g;let n=[],a=t!=null?t:{},o=(g=a.intro)!=null?g:{},s=o.enabled===!0&&(typeof o.duration!="number"||o.duration<=0)?'<div class="inspector-warning">\u26A0\uFE0F Duration must be > 0 to play.</div>':"",l=`
966
+ `:""}applyMotionDefaults(e,t){if(!t||typeof t!="object")return e!=null?e:{};let i={...e!=null?e:{}};for(let n of Object.keys(t)){let a=t[n],s=i[n];a!=null&&typeof a=="object"&&!Array.isArray(a)?i[n]=this.applyMotionDefaults(s,a):s===void 0&&(i[n]=a)}return i}renderMotionSection(e,t,i){var f;let n=[],a=this.getMotionDefaults(),s=this.applyMotionDefaults(t!=null?t:{},a!=null?a:{}),o=(f=s.intro)!=null?f:{},l=o.enabled===!0&&(typeof o.duration!="number"||o.duration<=0)?'<div class="inspector-warning">\u26A0\uFE0F Duration must be > 0 to play.</div>':"",c=`
936
967
  <div class="inspector-motion-presets">
937
968
  <span class="inspector-subsection-title">Intro Motions</span>
938
969
  <div class="inspector-motion-buttons">
@@ -945,44 +976,44 @@ ${h}
945
976
  <button class="debug-btn debug-btn-sm" data-motion-preset="bounce">Bounce</button>
946
977
  </div>
947
978
  </div>
948
- `,c=`
979
+ `,p=`
949
980
  <button class="debug-btn debug-btn-sm ${this.motionSimpleMode?"primary":""}" data-motion-simple-toggle>
950
981
  ${this.motionSimpleMode?"Simple":"Advanced"}
951
982
  </button>
952
- `,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',d=f=>{let h=f.split(".").filter(Boolean),m=a;for(let v of h)m=m==null?void 0:m[v];let b=h[h.length-1],y=`${i}.${f}`;return this.rendererRegistry.renderProperty(e,b,m,y)};if(this.motionSimpleMode){let f=d("enabled");f&&n.push(f);let h=[],m=d("intro.enabled"),b=d("intro.type"),y=d("intro.duration"),v=d("intro.easing");m&&h.push(m),b&&h.push(b),y&&h.push(y),v&&h.push(v),h.length&&n.push(`
983
+ `,d='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',u=h=>{let m=h.split(".").filter(Boolean),b=s;for(let S of m)b=b==null?void 0:b[S];let y=m[m.length-1],v=`${i}.${h}`;return this.rendererRegistry.renderProperty(e,y,b,v)};if(this.motionSimpleMode){let h=u("enabled");h&&n.push(h);let m=[],b=u("intro.enabled"),y=u("intro.type"),v=u("intro.duration"),S=u("intro.easing");b&&m.push(b),y&&m.push(y),v&&m.push(v),S&&m.push(S),m.length&&n.push(`
953
984
  <div class="inspector-subsection">
954
985
  <div class="inspector-subsection-title">Intro</div>
955
986
  <div class="inspector-subsection-content">
956
- ${s}
957
- ${p}
958
- ${h.join("")}
987
+ ${l}
988
+ ${d}
989
+ ${m.join("")}
959
990
  </div>
960
991
  </div>
961
- `);let w=[d("pulse.enabled"),d("pulse.speed"),d("pulse.intensity")].filter(Boolean),A=[d("swing.enabled"),d("swing.amplitude"),d("swing.speed"),d("swing.axis")].filter(Boolean),L=[d("continuousMove.enabled"),d("continuousMove.axis"),d("continuousMove.speed"),d("continuousMove.direction"),d("continuousMove.lifetime")].filter(Boolean),$=[d("continuousRotate.enabled"),d("continuousRotate.speed"),d("continuousRotate.direction")].filter(Boolean),x=[d("orbit.enabled"),d("orbit.radius"),d("orbit.speed"),d("orbit.direction"),d("orbit.pivotOffsetX"),d("orbit.pivotOffsetY")].filter(Boolean);if(w.length||A.length||L.length||$.length||x.length){let O=(E,k)=>k.length?`
992
+ `);let x=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),w=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),O=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),E=[u("continuousRotate.enabled"),u("continuousRotate.speed"),u("continuousRotate.direction")].filter(Boolean),k=[u("orbit.enabled"),u("orbit.radius"),u("orbit.speed"),u("orbit.direction"),u("orbit.pivotOffsetX"),u("orbit.pivotOffsetY")].filter(Boolean);if(x.length||w.length||O.length||E.length||k.length){let C=(M,L)=>L.length?`
962
993
  <div class="inspector-motion-continuous-group">
963
- <div class="inspector-subsection-title">${E}</div>
964
- <div class="inspector-subsection-content">${k.join("")}</div>
965
- </div>`:"",S=[O("Pulse",w),O("Swing",A),O("Move forever",L),O("Rotate (pivoting itself)",$),O("Rotate around",x)].filter(Boolean).join("");n.push(`
994
+ <div class="inspector-subsection-title">${M}</div>
995
+ <div class="inspector-subsection-content">${L.join("")}</div>
996
+ </div>`:"",A=[C("Pulse",x),C("Swing",w),C("Move forever",O),C("Rotate (pivoting itself)",E),C("Rotate around",k)].filter(Boolean).join("");n.push(`
966
997
  <div class="inspector-subsection inspector-subsection-continuous">
967
998
  <div class="inspector-subsection-title">Continuous</div>
968
999
  <div class="inspector-subsection-content inspector-motion-continuous-groups">
969
- ${S}
1000
+ ${A}
970
1001
  </div>
971
1002
  </div>
972
- `)}}else for(let f in a){let h=a[f],m=`${i}.${f}`,b=this.rendererRegistry.renderProperty(e,f,h,m);b&&n.push(b)}return n.length===0?"":`
1003
+ `)}}else for(let h in s){let m=s[h],b=`${i}.${h}`,y=this.rendererRegistry.renderProperty(e,h,m,b);y&&n.push(y)}return n.length===0?"":`
973
1004
  <div class="inspector-section ${this.expandMotionOnNextRender?"":"collapsed"}" data-section="motion">
974
1005
  <div class="inspector-section-header" data-section-toggle="motion">
975
1006
  <span class="inspector-section-arrow">\u25BC</span>
976
1007
  <span class="inspector-section-icon">\u{1F3AC}</span>
977
1008
  <span class="inspector-section-title">Motion</span>
978
- <span class="inspector-section-actions">${c}</span>
1009
+ <span class="inspector-section-actions">${p}</span>
979
1010
  </div>
980
1011
  <div class="inspector-section-body" data-section-body="motion">
981
- ${l}
1012
+ ${c}
982
1013
  ${n.join("")}
983
1014
  </div>
984
1015
  </div>
985
- `}attachEventListeners(){var w,A,L,$;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=qs((x,_,O)=>{var S,E;this.updateManager.updateProperty(x,_,O),(E=(S=this.options)==null?void 0:S.onPropertyChange)==null||E.call(S,x,_,O)},300),i=x=>x?/(^|\.)logic(\.\d+)?\.id$/.test(x):!1;e.forEach(x=>{let _=S=>{var M,P;let E=S.target,k=E.dataset.propertyPath,T=E.dataset.objectId;if(k&&T){let z=E.value;if(E.type==="checkbox")z=E.checked;else if(E.type==="number"){if(z=parseFloat(E.value),isNaN(z))return}else if(E.dataset.json==="true")try{z=JSON.parse(E.value)}catch{return}E.type==="text"||E.type==="range"||E.tagName==="TEXTAREA"?t(T,k,z):(this.updateManager.updateProperty(T,k,z),(P=(M=this.options)==null?void 0:M.onPropertyChange)==null||P.call(M,T,k,z))}},O=x.dataset.propertyPath;i(O)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",O),x.addEventListener("change",async S=>{var j;let E=S.target,k=E.dataset.propertyPath,T=E.dataset.objectId,M=E.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",M),!k||!T)return;await this.updateManager.updateProperty(T,k,M),console.log("[Inspector v1.0.0] Logic ID updated");let P=window,z=(j=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:j[M],C=this.getDefaultPropsForLogic(M,z);console.log("[Inspector v1.0.0] New logic default props:",C);let I=k.replace(/\.id$/,".props");await this.updateManager.updateProperty(T,I,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(T)})):(x.addEventListener("change",_),(x.tagName==="INPUT"||x.tagName==="TEXTAREA")&&x.addEventListener("input",_))}),this.contentContainer.querySelectorAll("[data-action]").forEach(x=>{x.addEventListener("click",_=>{let O=_.target,S=O.dataset.action,E=O.dataset.path,k=O.dataset.object;S&&E&&k&&this.quickActions.handleAction(S,k,E)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(x=>{x.addEventListener("click",_=>{var E,k;let O=_.target,S=O.dataset.sectionToggle||((E=O.closest("[data-section-toggle]"))==null?void 0:E.getAttribute("data-section-toggle"));if(S){let T=(k=this.contentContainer)==null?void 0:k.querySelector(`[data-section="${S}"]`);T==null||T.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(x=>{x.addEventListener("click",async _=>{let S=_.currentTarget.dataset.motionPreset;!S||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,S)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(x=>{x.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(x=>{x.addEventListener("click",async _=>{let O=_.target,S=O.dataset.objectId,E=O.dataset.propertyPath;if(!S||!E)return;let k=window.getEditableObjectConfig,T=k==null?void 0:k(S);if(!T)return;let M=this.updateManager.getNestedProperty(T,E),P=Array.isArray(M)?[...M]:[];P.push({x:0,y:0}),await this.updateManager.updateProperty(S,E,P),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(x=>{x.addEventListener("click",async _=>{let O=_.target,S=O.dataset.objectId,E=O.dataset.propertyPath,k=Number(O.dataset.index||"-1");if(!S||!E||k<0)return;let T=window.getEditableObjectConfig,M=T==null?void 0:T(S);if(!M)return;let P=this.updateManager.getNestedProperty(M,E);if(!Array.isArray(P))return;let z=P.filter((C,I)=>I!==k);await this.updateManager.updateProperty(S,E,z),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(x=>{x.addEventListener("click",async _=>{let O=_.target,S=O.dataset.objectId,E=O.dataset.propertyPath;if(!S||!E)return;let k=window.getEditableObjectConfig,T=k==null?void 0:k(S);if(!T)return;let M=this.updateManager.getNestedProperty(T,E),P=Array.isArray(M)?[...M]:[];P.push({templateId:"",weight:1}),await this.updateManager.updateProperty(S,E,P),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(x=>{x.addEventListener("click",async _=>{var C;let O=_.target,S=O.dataset.objectId,E=O.dataset.propertyPath,k=Number((C=O.dataset.index)!=null?C:-1);if(!S||!E||k<0)return;let T=window.getEditableObjectConfig,M=T==null?void 0:T(S);if(!M)return;let P=this.updateManager.getNestedProperty(M,E);if(!Array.isArray(P))return;let z=P.filter((I,j)=>j!==k);await this.updateManager.updateProperty(S,E,z),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(x=>{x.addEventListener("click",async _=>{var F;let O=_.target,S=O.dataset.objectId,E=O.dataset.propertyPath;if(!S||!E)return;let k=window.getEditableObjectConfig,T=k==null?void 0:k(S);if(!T)return;let M=this.updateManager.getNestedProperty(T,E),P;Array.isArray(M)?P=[...M]:M!=null?typeof M=="string"?P=[{id:M,props:{}}]:typeof M=="object"?P=[M]:P=[]:P=[];let z=this.getDefaultLogicId(),C=window,I=(F=C==null?void 0:C.__HANDLER_LOGIC_META)==null?void 0:F[z],j=this.getDefaultPropsForLogic(z,I);P.push({id:z,props:j}),console.log("[InspectorPanel] Adding logic to array:",{objectId:S,path:E,current:M,next:P}),await this.updateManager.updateProperty(S,E,P),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(x=>{x.addEventListener("click",async _=>{var C;let O=_.target,S=O.dataset.objectId,E=O.dataset.propertyPath,k=Number((C=O.dataset.index)!=null?C:-1);if(!S||!E||k<0)return;let T=window.getEditableObjectConfig,M=T==null?void 0:T(S);if(!M)return;let P=this.updateManager.getNestedProperty(M,E);if(!Array.isArray(P))return;let z=P.filter((I,j)=>j!==k);await this.updateManager.updateProperty(S,E,z),this.loadObject(S)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(x=>{x.addEventListener("click",async _=>{var U,K;let O=_.target,S=O.dataset.objectId,E=O.dataset.propertyPath,k=Number((U=O.dataset.index)!=null?U:-1);if(!S||!E||k<0)return;let T=window.getEditableObjectConfig,M=T==null?void 0:T(S);if(!M)return;let P=this.updateManager.getNestedProperty(M,E);if(!Array.isArray(P))return;let z=P[k];if(typeof z!="string")return;let C=window,I=(K=C==null?void 0:C.__HANDLER_LOGIC_META)==null?void 0:K[z],j=this.getDefaultPropsForLogic(z,I),F=[...P];F[k]={id:z,props:j},await this.updateManager.updateProperty(S,E,F),this.loadObject(S)})});let m=(w=this.root)==null?void 0:w.querySelector("[data-inspector-advanced]");m==null||m.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(A=this.root)==null?void 0:A.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var _;let x=(_=this.root)==null?void 0:_.querySelector("[data-convert-menu]");x==null||x.classList.toggle("hidden")});let y=(L=this.contentContainer)==null?void 0:L.querySelector("[data-inspector-add-component-btn]"),v=($=this.contentContainer)==null?void 0:$.querySelector("[data-inspector-component-select]");y==null||y.addEventListener("click",async()=>{let x=v.value;x&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,x)})}getMotionDefaults(){var i,n,a,o;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(o=(a=t.motion)==null?void 0:a.defaults)!=null?o:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),o={...(l=n.motion)!=null?l:a},s={...(c=o.intro)!=null?c:{}};o.enabled=!0,s.enabled=!0,s.type=t,s.duration=typeof s.duration=="number"&&s.duration>0?s.duration:500,s.delay=typeof s.delay=="number"?s.delay:0,s.easing=typeof s.easing=="string"?s.easing:"easeOut",o.intro=s,await this.updateManager.updateProperty(e,"motion",o),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var s,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(s=i.motion)!=null?s:n},o={...(l=a.intro)!=null?l:{}};a.enabled=!0,o.enabled=!0,a.intro=o,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...o,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...o,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,o=a==null?void 0:a.schemas,s=null;o instanceof Map?s=o.get(t):o&&typeof o=="object"&&(s=o[t]),s||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(s==null?void 0:s.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,o;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((o=(a=i.render)==null?void 0:a.asset)==null?void 0:o.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
1016
+ `}attachEventListeners(){var S,x,w,O;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=Wo((E,k,I)=>{var C,A;this.updateManager.updateProperty(E,k,I),(A=(C=this.options)==null?void 0:C.onPropertyChange)==null||A.call(C,E,k,I)},300),i=E=>E?/(^|\.)logic(\.\d+)?\.id$/.test(E):!1;e.forEach(E=>{let k=C=>{var _,P;let A=C.target,M=A.dataset.propertyPath,L=A.dataset.objectId;if(M&&L){let $=A.value;if(A.type==="checkbox")$=A.checked;else if(A.type==="number"){if($=parseFloat(A.value),isNaN($))return}else if(A.dataset.json==="true")try{$=JSON.parse(A.value)}catch{return}A.type==="text"||A.type==="range"||A.tagName==="TEXTAREA"?t(L,M,$):(this.updateManager.updateProperty(L,M,$),(P=(_=this.options)==null?void 0:_.onPropertyChange)==null||P.call(_,L,M,$))}},I=E.dataset.propertyPath;i(I)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",I),E.addEventListener("change",async C=>{var R;let A=C.target,M=A.dataset.propertyPath,L=A.dataset.objectId,_=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",_),!M||!L)return;await this.updateManager.updateProperty(L,M,_),console.log("[Inspector v1.0.0] Logic ID updated");let P=window,$=(R=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:R[_],T=this.getDefaultPropsForLogic(_,$);console.log("[Inspector v1.0.0] New logic default props:",T);let j=M.replace(/\.id$/,".props");await this.updateManager.updateProperty(L,j,T),console.log("[Inspector v1.0.0] Logic props updated to:",T),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(L)})):(E.addEventListener("change",k),(E.tagName==="INPUT"||E.tagName==="TEXTAREA")&&E.addEventListener("input",k))}),this.contentContainer.querySelectorAll("[data-action]").forEach(E=>{E.addEventListener("click",k=>{let I=k.target,C=I.dataset.action,A=I.dataset.path,M=I.dataset.object;C&&A&&M&&this.quickActions.handleAction(C,M,A)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(E=>{E.addEventListener("click",k=>{var A,M;let I=k.target,C=I.dataset.sectionToggle||((A=I.closest("[data-section-toggle]"))==null?void 0:A.getAttribute("data-section-toggle"));if(C){let L=(M=this.contentContainer)==null?void 0:M.querySelector(`[data-section="${C}"]`);L==null||L.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(E=>{E.addEventListener("click",async k=>{let C=k.currentTarget.dataset.motionPreset;!C||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,C)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(E=>{E.addEventListener("click",async()=>{this.selectedObjectId&&await this.previewMotionIntro(this.selectedObjectId)})});let l=this.contentContainer.querySelector("[data-motion-simple-toggle]");l==null||l.addEventListener("click",()=>{this.motionSimpleMode=!this.motionSimpleMode;try{localStorage.setItem("inspector:motionSimple",String(this.motionSimpleMode))}catch{}this.selectedObjectId&&this.loadObject(this.selectedObjectId)}),this.contentContainer.querySelectorAll("[data-spawnpoints-add]").forEach(E=>{E.addEventListener("click",async k=>{let I=k.target,C=I.dataset.objectId,A=I.dataset.propertyPath;if(!C||!A)return;let M=window.getEditableObjectConfig,L=M==null?void 0:M(C);if(!L)return;let _=this.updateManager.getNestedProperty(L,A),P=Array.isArray(_)?[..._]:[];P.push({x:0,y:0}),await this.updateManager.updateProperty(C,A,P),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(E=>{E.addEventListener("click",async k=>{let I=k.target,C=I.dataset.objectId,A=I.dataset.propertyPath,M=Number(I.dataset.index||"-1");if(!C||!A||M<0)return;let L=window.getEditableObjectConfig,_=L==null?void 0:L(C);if(!_)return;let P=this.updateManager.getNestedProperty(_,A);if(!Array.isArray(P))return;let $=P.filter((T,j)=>j!==M);await this.updateManager.updateProperty(C,A,$),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(E=>{E.addEventListener("click",async k=>{let I=k.target,C=I.dataset.objectId,A=I.dataset.propertyPath;if(!C||!A)return;let M=window.getEditableObjectConfig,L=M==null?void 0:M(C);if(!L)return;let _=this.updateManager.getNestedProperty(L,A),P=Array.isArray(_)?[..._]:[];P.push({templateId:"",weight:1}),await this.updateManager.updateProperty(C,A,P),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(E=>{E.addEventListener("click",async k=>{var T;let I=k.target,C=I.dataset.objectId,A=I.dataset.propertyPath,M=Number((T=I.dataset.index)!=null?T:-1);if(!C||!A||M<0)return;let L=window.getEditableObjectConfig,_=L==null?void 0:L(C);if(!_)return;let P=this.updateManager.getNestedProperty(_,A);if(!Array.isArray(P))return;let $=P.filter((j,R)=>R!==M);await this.updateManager.updateProperty(C,A,$),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(E=>{E.addEventListener("click",async k=>{var F;let I=k.target,C=I.dataset.objectId,A=I.dataset.propertyPath;if(!C||!A)return;let M=window.getEditableObjectConfig,L=M==null?void 0:M(C);if(!L)return;let _=this.updateManager.getNestedProperty(L,A),P;Array.isArray(_)?P=[..._]:_!=null?typeof _=="string"?P=[{id:_,props:{}}]:typeof _=="object"?P=[_]:P=[]:P=[];let $=this.getDefaultLogicId(),T=window,j=(F=T==null?void 0:T.__HANDLER_LOGIC_META)==null?void 0:F[$],R=this.getDefaultPropsForLogic($,j);P.push({id:$,props:R}),console.log("[InspectorPanel] Adding logic to array:",{objectId:C,path:A,current:_,next:P}),await this.updateManager.updateProperty(C,A,P),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(E=>{E.addEventListener("click",async k=>{var T;let I=k.target,C=I.dataset.objectId,A=I.dataset.propertyPath,M=Number((T=I.dataset.index)!=null?T:-1);if(!C||!A||M<0)return;let L=window.getEditableObjectConfig,_=L==null?void 0:L(C);if(!_)return;let P=this.updateManager.getNestedProperty(_,A);if(!Array.isArray(P))return;let $=P.filter((j,R)=>R!==M);await this.updateManager.updateProperty(C,A,$),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(E=>{E.addEventListener("click",async k=>{var U,X;let I=k.target,C=I.dataset.objectId,A=I.dataset.propertyPath,M=Number((U=I.dataset.index)!=null?U:-1);if(!C||!A||M<0)return;let L=window.getEditableObjectConfig,_=L==null?void 0:L(C);if(!_)return;let P=this.updateManager.getNestedProperty(_,A);if(!Array.isArray(P))return;let $=P[M];if(typeof $!="string")return;let T=window,j=(X=T==null?void 0:T.__HANDLER_LOGIC_META)==null?void 0:X[$],R=this.getDefaultPropsForLogic($,j),F=[...P];F[M]={id:$,props:R},await this.updateManager.updateProperty(C,A,F),this.loadObject(C)})});let m=(S=this.root)==null?void 0:S.querySelector("[data-inspector-advanced]");m==null||m.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(x=this.root)==null?void 0:x.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var k;let E=(k=this.root)==null?void 0:k.querySelector("[data-convert-menu]");E==null||E.classList.toggle("hidden")});let y=(w=this.contentContainer)==null?void 0:w.querySelector("[data-inspector-add-component-btn]"),v=(O=this.contentContainer)==null?void 0:O.querySelector("[data-inspector-component-select]");y==null||y.addEventListener("click",async()=>{let E=v.value;E&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,E)})}getMotionDefaults(){var i,n,a,s;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(s=(a=t.motion)==null?void 0:a.defaults)!=null?s:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),s={...(l=n.motion)!=null?l:a},o={...(c=s.intro)!=null?c:{}};s.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",s.intro=o,await this.updateManager.updateProperty(e,"motion",s),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},s={...(l=a.intro)!=null?l:{}};a.enabled=!0,s.enabled=!0,a.intro=s,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...s,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,s=a==null?void 0:a.schemas,o=null;s instanceof Map?o=s.get(t):s&&typeof s=="object"&&(o=s[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,s;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((s=(a=i.render)==null?void 0:a.asset)==null?void 0:s.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
986
1017
  <div class="inspector-empty">
987
1018
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
988
1019
  <span class="inspector-empty-text">${e}</span>
@@ -992,11 +1023,11 @@ ${h}
992
1023
  <span class="inspector-empty-icon">\u{1F3AF}</span>
993
1024
  <span class="inspector-empty-text">Select an object to inspect</span>
994
1025
  </div>
995
- `)}};var Wr=qe(require("jszip"),1);function Hn(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function jr(r){var n;let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Rr(r){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=r})}async function ji(r){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",r);let i=await fetch(r);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,r),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await Hn(n),o=await Rr(a),s=jr(a);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:a,width:(e=o==null?void 0:o.width)!=null?e:0,height:(t=o==null?void 0:o.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function Le(r){var e,t;try{let i=await Hn(r),n=await Rr(i),a=jr(i);return{base64:a.base64,mimeType:a.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function Nn(r){return Hn(r).then(e=>e).catch(()=>null)}function Fn(r,e){var t;try{let[i,n]=r.split(","),a=i.match(/data:(.*?);base64/),o=(t=a==null?void 0:a[1])!=null?t:"image/png",s=atob(n),l=new Uint8Array(s.length);for(let c=0;c<s.length;c++)l[c]=s.charCodeAt(c);return new File([l],e,{type:o})}catch{return null}}async function et(r,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((d,u)=>{let g=new Image;g.onload=()=>d(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=r}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),r;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),o=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(d=>({r: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],f=o[d+2],h=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(g-m.g,2)+Math.pow(f-m.b,2))<e){h=!0;break}h&&(o[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),r}}function zr(r,e){if(!r||!e)return"1:1";let t=r/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function ye(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function W(r){return typeof r=="string"?r:void 0}function $r(r){return r.toLowerCase().endsWith(".png")?r.slice(0,-4):r}function Vs(r){var i,n,a;let e=(i=W(r.id))!=null?i:W(r.name);if(e)return e;let t=(n=W(r.file))!=null?n:W(r.asset);return t?$r((a=t.split("/").pop())!=null?a:t):void 0}function Ws(r,e,t){var i,n,a;if(typeof e=="string")return{id:r,file:e,role:t};if(ye(e)){let o=(i=W(e.file))!=null?i:W(e.asset);return o?{id:(n=W(e.id))!=null?n:r,file:o,role:(a=W(e.role))!=null?a:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function Bn(r,e){var t,i,n;if(!r)return[];if(Array.isArray(r)){let a=[];for(let o of r){if(typeof o=="string"){let s=$r((t=o.split("/").pop())!=null?t:o);a.push({id:s,file:o,role:e});continue}if(ye(o)){let s=Vs(o),l=(i=W(o.file))!=null?i:W(o.asset);if(!s||!l)continue;a.push({id:s,file:l,role:(n=W(o.role))!=null?n:e,dataUrl:W(o.dataUrl),layout:o.layout})}}return a}if(ye(r)){let a=[];for(let[o,s]of Object.entries(r)){let l=Ws(o,s,e);l&&a.push(l)}return a}return[]}function Ys(r){var e,t;return(t=(e=W(r.brand_name))!=null?e:W(r.brandName))!=null?t:W(r.name)}function Ks(r){if(ye(r.brand_dna)&&ye(r.brand_dna.colors))return r.brand_dna;if(ye(r.colors)){let e={colors:r.colors};return typeof r.style=="string"&&(e.style=r.style),ye(r.fonts)&&(e.fonts=r.fonts),e}}function Xs(r){var t;let e=new Map;for(let i of r){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Un(r,e={}){var o,s,l;let t=r.filter(ye),i=(s=(o=t.map(Ys).find(Boolean))!=null?o:e.defaultBrandName)!=null?s:"Imported Brand",n=(l=t.map(Ks).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...Bn(c.layers,"visual element")),"assets"in c&&a.push(...Bn(c.assets,"visual element")),ye(c.endgame)&&"assets"in c.endgame&&a.push(...Bn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:Xs(a)}}var Dr=require("@google/genai");async function Ri(r,e,t=[],i={}){var n,a,o,s,l,c,p;try{if(!(r!=null&&r.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let 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 Dr.GoogleGenAI({apiKey:r}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let f=await d.models.generateContent({model:u,contents:g}),h="",m=(o=(a=(n=f.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:o.parts;if(m)for(let b of m)b.text&&(h+=b.text);if(!h.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${h.length}`),h}catch(d){throw console.error("[Gemini] API error:",d),(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 Hr=require("@google/genai");async function tt(r,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new Hr.GoogleGenAI({apiKey:r}),a=[{text:e}];t.length>0&&t.forEach((s,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:s.mimeType,data:s.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let o=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!o.candidates||!o.candidates[0]||!o.candidates[0].content||!o.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let s of o.candidates[0].content.parts)if(s.text)console.log(s.text);else if(s.inlineData){let l=s.inlineData.data,c=s.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function Nr(r){let e=r.brandAssets.map(a=>{let o=`- ${a.id}: ${a.role}`;return a.layout&&(o+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),o}).join(`
1026
+ `)}};var Jr=Ve(require("jszip"),1);function qn(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function Dr(r){var n;let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Hr(r){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=r})}async function $i(r){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",r);let i=await fetch(r);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,r),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await qn(n),s=await Hr(a),o=Dr(a);return console.log("[ImageUtils] Success resolution:",s==null?void 0:s.width,"x",s==null?void 0:s.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:a,width:(e=s==null?void 0:s.width)!=null?e:0,height:(t=s==null?void 0:s.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function ke(r){var e,t;try{let i=await qn(r),n=await Hr(i),a=Dr(i);return{base64:a.base64,mimeType:a.mimeType,dataUrl:i,width:(e=n==null?void 0:n.width)!=null?e:0,height:(t=n==null?void 0:n.height)!=null?t:0}}catch{return null}}function Vn(r){return qn(r).then(e=>e).catch(()=>null)}function Wn(r,e){var t;try{let[i,n]=r.split(","),a=i.match(/data:(.*?);base64/),s=(t=a==null?void 0:a[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:s})}catch{return null}}async function et(r,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((d,u)=>{let g=new Image;g.onload=()=>d(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=r}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),r;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),s=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(d=>({r:s[d.offset],g:s[d.offset+1],b:s[d.offset+2]})),c=0;for(let d=0;d<s.length;d+=4){let u=s[d],g=s[d+1],f=s[d+2],h=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(g-m.g,2)+Math.pow(f-m.b,2))<e){h=!0;break}h&&(s[d+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),r}}function Nr(r,e){if(!r||!e)return"1:1";let t=r/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function we(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function W(r){return typeof r=="string"?r:void 0}function Fr(r){return r.toLowerCase().endsWith(".png")?r.slice(0,-4):r}function Yo(r){var i,n,a;let e=(i=W(r.id))!=null?i:W(r.name);if(e)return e;let t=(n=W(r.file))!=null?n:W(r.asset);return t?Fr((a=t.split("/").pop())!=null?a:t):void 0}function Ko(r,e,t){var i,n,a;if(typeof e=="string")return{id:r,file:e,role:t};if(we(e)){let s=(i=W(e.file))!=null?i:W(e.asset);return s?{id:(n=W(e.id))!=null?n:r,file:s,role:(a=W(e.role))!=null?a:t,dataUrl:W(e.dataUrl),layout:e.layout}:null}return null}function Yn(r,e){var t,i,n;if(!r)return[];if(Array.isArray(r)){let a=[];for(let s of r){if(typeof s=="string"){let o=Fr((t=s.split("/").pop())!=null?t:s);a.push({id:o,file:s,role:e});continue}if(we(s)){let o=Yo(s),l=(i=W(s.file))!=null?i:W(s.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=W(s.role))!=null?n:e,dataUrl:W(s.dataUrl),layout:s.layout})}}return a}if(we(r)){let a=[];for(let[s,o]of Object.entries(r)){let l=Ko(s,o,e);l&&a.push(l)}return a}return[]}function Xo(r){var e,t;return(t=(e=W(r.brand_name))!=null?e:W(r.brandName))!=null?t:W(r.name)}function Jo(r){if(we(r.brand_dna)&&we(r.brand_dna.colors))return r.brand_dna;if(we(r.colors)){let e={colors:r.colors};return typeof r.style=="string"&&(e.style=r.style),we(r.fonts)&&(e.fonts=r.fonts),e}}function Zo(r){var t;let e=new Map;for(let i of r){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Kn(r,e={}){var s,o,l;let t=r.filter(we),i=(o=(s=t.map(Xo).find(Boolean))!=null?s:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(Jo).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...Yn(c.layers,"visual element")),"assets"in c&&a.push(...Yn(c.assets,"visual element")),we(c.endgame)&&"assets"in c.endgame&&a.push(...Yn(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:Zo(a)}}var Br=require("@google/genai");async function Di(r,e,t=[],i={}){var n,a,s,o,l,c,p;try{if(!(r!=null&&r.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let b=0;b<t.length;b++){let 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 Br.GoogleGenAI({apiKey:r}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let f=await d.models.generateContent({model:u,contents:g}),h="",m=(s=(a=(n=f.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:s.parts;if(m)for(let b of m)b.text&&(h+=b.text);if(!h.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${h.length}`),h}catch(d){throw console.error("[Gemini] API error:",d),(o=d.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=d.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=d.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(p=d.message)!=null&&p.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):d}}var Ur=require("@google/genai");async function tt(r,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new Ur.GoogleGenAI({apiKey:r}),a=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let s=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!s.candidates||!s.candidates[0]||!s.candidates[0].content||!s.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let o of s.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,c=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function Gr(r){let e=r.brandAssets.map(a=>{let s=`- ${a.id}: ${a.role}`;return a.layout&&(s+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),s}).join(`
996
1027
  `)||"None",t=r.brandDna?`Colors: ${JSON.stringify(r.brandDna.colors)}, Style: ${r.brandDna.style||"not specified"}`:"Not provided",i=r.gameObjects.map(a=>typeof a=="string"?`- id: ${a}`:`- id: ${a.id}${a.category?`, category: ${a.category}`:""}${a.type?`, type: ${a.type}`:""}`).join(`
997
- `),n="";if(r.brandConfig){let a=r.brandConfig,o=[];a.splash&&o.push(`SPLASH: title="${a.splash.title||""}", subtitle="${a.splash.subtitle||""}", button="${a.splash.button_label||""}"`),a.endgame&&o.push(`ENDGAME: title="${a.endgame.title||""}", subtitle="${a.endgame.subtitle||""}", cta="${a.endgame.cta_label||""}"`),a.tutorial&&o.push(`TUTORIAL: text="${a.tutorial.label_text||""}", helper="${a.tutorial.helper_text||""}"`),o.length>0&&(n=`
1028
+ `),n="";if(r.brandConfig){let a=r.brandConfig,s=[];a.splash&&s.push(`SPLASH: title="${a.splash.title||""}", subtitle="${a.splash.subtitle||""}", button="${a.splash.button_label||""}"`),a.endgame&&s.push(`ENDGAME: title="${a.endgame.title||""}", subtitle="${a.endgame.subtitle||""}", cta="${a.endgame.cta_label||""}"`),a.tutorial&&s.push(`TUTORIAL: text="${a.tutorial.label_text||""}", helper="${a.tutorial.helper_text||""}"`),s.length>0&&(n=`
998
1029
  BRAND CONTENT:
999
- ${o.join(`
1030
+ ${s.join(`
1000
1031
  `)}
1001
1032
  `)}return`
1002
1033
  You are analyzing a brand's visual design for use in a playable ad game.
@@ -1056,7 +1087,7 @@ OUTPUT ONLY VALID JSON (no markdown, no explanation):
1056
1087
  }
1057
1088
  ]
1058
1089
  }
1059
- `.trim()}function Fr(r){var n,a;let e=(n=r.brandDna)!=null&&n.colors?`Primary: ${r.brandDna.colors.primary}, Secondary: ${r.brandDna.colors.secondary||"N/A"}, Accent: ${r.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((a=r.brandDna)==null?void 0:a.style)||"modern gaming style",i=r.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
1090
+ `.trim()}function qr(r){var n,a;let e=(n=r.brandDna)!=null&&n.colors?`Primary: ${r.brandDna.colors.primary}, Secondary: ${r.brandDna.colors.secondary||"N/A"}, Accent: ${r.brandDna.colors.accent||"N/A"}`:"Use provided reference colors",t=((a=r.brandDna)==null?void 0:a.style)||"modern gaming style",i=r.needsTransparency?"BACKGROUND: REQUIRED solid magenta #FF00FF (for transparency removal)":"BACKGROUND: Use brand colors naturally, fill the entire frame";return`
1060
1091
  TASK: ${r.prompt}
1061
1092
 
1062
1093
  BRAND STYLE:
@@ -1077,7 +1108,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
1077
1108
 
1078
1109
  OUTPUT:
1079
1110
  Generate the requested asset matching the brand style.${r.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
1080
- `.trim()}function Br(r){return r.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function Ur(r,e){return!(r.includes("background")&&(r.includes("_1")||r.includes("splash")||r.includes("endgame")||r.includes("main"))||e==="text"||e==="effects"&&r.includes("particle"))}async function Gr(r){var o,s;let e=Br(r.gameObjects),t={gamePrompt:r.gamePrompt,gameObjects:e,brandAssets:r.manifest.assets,brandDna:r.manifest.brand_dna,brandName:r.manifest.brand_name},i=Nr(t),n=[];if(r.flatDesignDataUrl)try{let l=qr(r.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await Ri(r.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(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 Js(a,r.gameObjects)}function Js(r,e){try{let t=r,i=r.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=r.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:r,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:r,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:r,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function Gn(r,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let o=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,o.game_object);try{let s=await Zs(r,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 Zs(r,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&r.manifest){let s=r.manifest.assets.find(l=>l.id===e.reference_asset);if(s){let l=r.assetFiles.get(s.file);if(l){let c=await Le(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(r.flatDesignDataUrl){let s=qr(r.flatDesignDataUrl);s&&t.push(s)}let i=Ur(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:r.manifest.brand_dna,needsTransparency:i},a=Fr(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let o=await tt(r.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await et(o)||o}function qr(r){let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function Vr(r,e){let t=r.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],r.assets=i;for(let n of i){let a=e.get(n.file);if(a){let o=await Le(a);o&&(n.dataUrl=o.dataUrl)}}}var zi=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`
1111
+ `.trim()}function Vr(r){return r.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function Wr(r,e){return!(r.includes("background")&&(r.includes("_1")||r.includes("splash")||r.includes("endgame")||r.includes("main"))||e==="text"||e==="effects"&&r.includes("particle"))}async function Yr(r){var s,o;let e=Vr(r.gameObjects),t={gamePrompt:r.gamePrompt,gameObjects:e,brandAssets:r.manifest.assets,brandDna:r.manifest.brand_dna,brandName:r.manifest.brand_name},i=Gr(t),n=[];if(r.flatDesignDataUrl)try{let l=Kr(r.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await Di(r.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(s=l.message)!=null&&s.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return Qo(a,r.gameObjects)}function Qo(r,e){try{let t=r,i=r.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=r.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:r,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:r,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:r,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function Xn(r,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let s=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,s.game_object);try{let o=await el(r,s);s.output_dataUrl=o,s.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${s.game_object}:`,o),s.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function el(r,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&r.manifest){let o=r.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=r.assetFiles.get(o.file);if(l){let c=await ke(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(r.flatDesignDataUrl){let o=Kr(r.flatDesignDataUrl);o&&t.push(o)}let i=Wr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:r.manifest.brand_dna,needsTransparency:i},a=qr(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let s=await tt(r.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await et(s)||s}function Kr(r){let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function Xr(r,e){let t=r.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],r.assets=i;for(let n of i){let a=e.get(n.file);if(a){let s=await ke(a);s&&(n.dataUrl=s.dataUrl)}}}var Hi=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`
1081
1112
  <div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
1082
1113
  <div class="scene-panel-header" data-panel-handle>
1083
1114
  <div class="panel-title">
@@ -1193,15 +1224,15 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1193
1224
  </div>
1194
1225
  <div class="panel-resize-handle" data-panel-resize></div>
1195
1226
  </div>
1196
- `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,o,s,l,c,p,d,u,g,f;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let m=h.dataset.visionTab;this.switchTab(m)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let m=h.target.value;this.switchUploadMethod(m)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||m.click()}),(o=this.root.querySelector("[data-vision-zip-input]"))==null||o.addEventListener("change",h=>{this.handleZipUpload(h)}),(s=this.root.querySelector("[data-vision-manifest-input]"))==null||s.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(p=this.root.querySelector("[data-vision-upload-flat]"))==null||p.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||m.click()}),(d=this.root.querySelector("[data-vision-flat-input]"))==null||d.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(f=this.root.querySelector("[data-vision-apply-all]"))==null||f.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let m=h.target;if(!m)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;y&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(y),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(y),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(y),m.closest("[data-mapping-generate-one]")&&this.generateOne(y),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let m=h.target;if(!m||!this.mappingResult)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(w=>w.game_object===y);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let m=h.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(w=>w.game_object===y);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var o,s;let t=await Wr.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let p=l.toLowerCase();p.endsWith(".json")?i.push({name:l,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((o=t.file(l.name))==null?void 0:o.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let a=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),p=new Blob([c],{type:"image/png"}),d=l.name.split("/").pop()||l.name;console.log(`Processing ${d}, uint8array length: ${c.length}, blob size: ${p.size}`);let u;try{u=await this.blobToDataUrl(p)}catch(m){console.warn(`FileReader failed for ${d}, using fallback:`,m),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${d}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(d.replace(".png",""));console.log(`Saving ${d} to category: ${g}`);let h=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:g,filename:d,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${d}:`,h),h.success){console.log(`\u2705 Saved PNG to library: ${d} (${g}) at ${h.path}`);let m=new File([p],d,{type:"image/png"});a.set(d,m)}else console.warn(`\u274C Failed to save ${d}:`,h.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=a;try{this.normalizedManifest=Un(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[p,d]of a){let u=await this.fileToDataUrl(d);l.push({id:p.replace(".png",""),filename:p,dataUrl:u,category:this.inferAssetCategory(p.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
1197
- \u{1F3F7}\uFE0F Brand: ${((s=this.normalizedManifest)==null?void 0:s.brand_name)||"Imported Brand"}`),this.addAssetsToRegistry(l),this.refreshLibrary()}catch(l){console.error("[BrandVision] Failed to normalize ZIP manifest:",l),this.normalizedManifest=null,this.setStatus("zip","\u274C Failed to normalize manifest")}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let o=a.category||"misc";n[o]||(n[o]=[]),i.libraryAssets[o]||(i.libraryAssets[o]=[]),i.libraryAssets[o].some(l=>l.filename===a.filename)||(i.libraryAssets[o].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${o}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var a;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let o of Array.from(i))try{let s=await o.text(),l=JSON.parse(s);this.uploadedJsons.set(o.name,l),l.layers?n+=`\u2705 Layers: ${o.name}
1198
- `:l.brand_dna||l.colors?n+=`\u2705 Brand: ${o.name}
1199
- `:n+=`\u2705 Loaded: ${o.name}
1200
- `}catch{n+=`\u274C Error in ${o.name}
1201
- `}try{this.normalizedManifest=Un(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let o=Array.isArray((a=this.normalizedManifest)==null?void 0:a.assets)?this.normalizedManifest.assets.length:0;n+=`
1202
- \u{1F4E6} Normalized manifest: ${o} assets`,n+=`
1203
- \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,n+=`
1204
- \u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",n.trim())}async handleAssetsUpload(e){let i=e.target.files;if(!(!i||i.length===0)){for(let n of Array.from(i))this.assetFiles.set(n.name,n);this.setStatus("assets",`${this.assetFiles.size} files loaded`)}}async handleFlatDesignUpload(e){var a,o;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await Le(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let s=(o=this.root)==null?void 0:o.querySelector("[data-vision-flat-preview]");s&&(s.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,a,o,s,l,c;if(this.isAnalyzing)return;let e=(a=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await Vr(t,this.assetFiles);let p={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},d=await Gr(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,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Gn(a,this.mappingResult,{onProgress:(o,s,l)=>{this.setStatus("apply",`Generating ${o}/${s}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(a){console.error("[BrandVision] Generation failed:",a),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var s;let e=(s=this.root)==null?void 0:s.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,a=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),o=n?`
1227
+ `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,s,o,l,c,p,d,u,g,f;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let m=h.dataset.visionTab;this.switchTab(m)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let m=h.target.value;this.switchUploadMethod(m)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||m.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||m.click()}),(s=this.root.querySelector("[data-vision-zip-input]"))==null||s.addEventListener("change",h=>{this.handleZipUpload(h)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||m.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(p=this.root.querySelector("[data-vision-upload-flat]"))==null||p.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||m.click()}),(d=this.root.querySelector("[data-vision-flat-input]"))==null||d.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-analyze]"))==null||u.addEventListener("click",()=>{this.runAnalysis()}),(g=this.root.querySelector("[data-vision-generate-all]"))==null||g.addEventListener("click",()=>{this.generateAllMissing()}),(f=this.root.querySelector("[data-vision-apply-all]"))==null||f.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let m=h.target;if(!m)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;y&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(y),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(y),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(y),m.closest("[data-mapping-generate-one]")&&this.generateOne(y),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let m=h.target;if(!m||!this.mappingResult)return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(S=>S.game_object===y);v&&(m.matches("[data-mapping-action]")&&(v.action=String(m.value||"KEEP"),v.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(v.brand_asset=String(m.value||""),v.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let m=h.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let b=m.closest("[data-mapping-item]"),y=b==null?void 0:b.dataset.mappingItem;if(!y)return;let v=this.mappingResult.mappings.find(S=>S.game_object===y);v&&(v.generation_prompt=String(m.value||""),v.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var s,o;let t=await Jr.loadAsync(e),i=[],n=[];t.forEach((l,c)=>{let p=l.toLowerCase();p.endsWith(".json")?i.push({name:l,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&n.push({name:l,file:c})});for(let l of i)try{let c=await((s=t.file(l.name))==null?void 0:s.async("text"));c&&(l.content=JSON.parse(c))}catch(c){console.warn(`Failed to parse ${l.name}:`,c)}let a=new Map;for(let l of n)try{let c=await l.file.async("uint8array"),p=new Blob([c],{type:"image/png"}),d=l.name.split("/").pop()||l.name;console.log(`Processing ${d}, uint8array length: ${c.length}, blob size: ${p.size}`);let u;try{u=await this.blobToDataUrl(p)}catch(m){console.warn(`FileReader failed for ${d}, using fallback:`,m),u=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(c)))}`}if(console.log(`Data URL length: ${u.length}, starts with: ${u.substring(0,50)}...`),!u.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${d}:`,u.substring(0,100));continue}let g=this.inferAssetCategory(d.replace(".png",""));console.log(`Saving ${d} to category: ${g}`);let h=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:g,filename:d,data:u,overwrite:!0})})).json();if(console.log(`Save result for ${d}:`,h),h.success){console.log(`\u2705 Saved PNG to library: ${d} (${g}) at ${h.path}`);let m=new File([p],d,{type:"image/png"});a.set(d,m)}else console.warn(`\u274C Failed to save ${d}:`,h.error)}catch(c){console.warn(`Failed to extract ${l.name}:`,c)}this.uploadedJsons.clear(),i.forEach(({name:l,content:c})=>{c&&this.uploadedJsons.set(l,c)}),this.assetFiles=a;try{this.normalizedManifest=Kn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let l=[];for(let[p,d]of a){let u=await this.fileToDataUrl(d);l.push({id:p.replace(".png",""),filename:p,dataUrl:u,category:this.inferAssetCategory(p.replace(".png",""))})}this.normalizedManifest&&(this.normalizedManifest.assets=l);let c=l.length;this.setStatus("zip",`\u2705 Processed: ${i.length} JSONs, ${c} PNGs
1228
+ \u{1F3F7}\uFE0F Brand: ${((o=this.normalizedManifest)==null?void 0:o.brand_name)||"Imported Brand"}`),this.addAssetsToRegistry(l),this.refreshLibrary()}catch(l){console.error("[BrandVision] Failed to normalize ZIP manifest:",l),this.normalizedManifest=null,this.setStatus("zip","\u274C Failed to normalize manifest")}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let s=a.category||"misc";n[s]||(n[s]=[]),i.libraryAssets[s]||(i.libraryAssets[s]=[]),i.libraryAssets[s].some(l=>l.filename===a.filename)||(i.libraryAssets[s].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${s}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var a;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let s of Array.from(i))try{let o=await s.text(),l=JSON.parse(o);this.uploadedJsons.set(s.name,l),l.layers?n+=`\u2705 Layers: ${s.name}
1229
+ `:l.brand_dna||l.colors?n+=`\u2705 Brand: ${s.name}
1230
+ `:n+=`\u2705 Loaded: ${s.name}
1231
+ `}catch{n+=`\u274C Error in ${s.name}
1232
+ `}try{this.normalizedManifest=Kn(Array.from(this.uploadedJsons.values()),{defaultBrandName:"Imported Brand"});let s=Array.isArray((a=this.normalizedManifest)==null?void 0:a.assets)?this.normalizedManifest.assets.length:0;n+=`
1233
+ \u{1F4E6} Normalized manifest: ${s} assets`,n+=`
1234
+ \u{1F3F7}\uFE0F Brand: ${this.normalizedManifest.brand_name||"Imported Brand"}`,console.info("[BrandVision] Normalized manifest",{jsonFiles:Array.from(this.uploadedJsons.keys()),assetsType:typeof this.normalizedManifest.assets,assetsCount:s,brandName:this.normalizedManifest.brand_name})}catch(s){console.error("[BrandVision] Failed to normalize manifest:",s),this.normalizedManifest=null,n+=`
1235
+ \u274C Failed to normalize manifest`}t.value="",this.setStatus("manifest",n.trim())}async handleAssetsUpload(e){let i=e.target.files;if(!(!i||i.length===0)){for(let n of Array.from(i))this.assetFiles.set(n.name,n);this.setStatus("assets",`${this.assetFiles.size} files loaded`)}}async handleFlatDesignUpload(e){var a,s;let i=(a=e.target.files)==null?void 0:a[0];if(!i)return;let n=await ke(i);if(n){this.flatDesignDataUrl=n.dataUrl,this.setStatus("flat",i.name);let o=(s=this.root)==null?void 0:s.querySelector("[data-vision-flat-preview]");o&&(o.innerHTML=`<img src="${n.dataUrl}" style="max-width:100%;max-height:100px;border-radius:4px;">`)}}async runAnalysis(){var i,n,a,s,o,l,c;if(this.isAnalyzing)return;let e=(a=(n=(i=this.root)==null?void 0:i.querySelector("[data-vision-api-key]"))==null?void 0:n.value)==null?void 0:a.trim();if(!e){this.setStatus("upload","Missing API key");return}let t=this.manifest;if(!t){this.setStatus("upload","Upload manifest first");return}Array.isArray(t.assets)||console.warn("[BrandVision] Manifest assets not array at analysis time; continuing with normalization fallback.",{assets:t.assets}),this.isAnalyzing=!0,this.setStatus("upload","Analyzing...");try{await Xr(t,this.assetFiles);let p={apiKey:e,manifest:t,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()},d=await Yr(p);this.mappingResult=d.mappingResult,this.analysisRawResponse=d.rawResponse,this.analysisParsedOk=d.parsed,this.analysisParseError=(s=d.parseError)!=null?s:null,this.renderMappings(),d.parsed?(this.setStatus("upload","Analysis complete"),this.setStatus("mapping",`${(c=(l=(o=this.mappingResult)==null?void 0:o.mappings)==null?void 0:l.length)!=null?c:0} objects mapped`)):(this.setStatus("upload","Analysis response was not JSON"),this.setStatus("mapping",`Parse failed: ${d.parseError||"Unknown error"}`)),this.switchTab("mapping")}catch(p){console.error("[BrandVision] Analysis failed:",p),this.setStatus("upload","Analysis failed")}finally{this.isAnalyzing=!1}}async generateAllMissing(){var t,i,n;if(this.isGenerating||!this.mappingResult||!this.manifest)return;let e=(n=(i=(t=this.root)==null?void 0:t.querySelector("[data-vision-api-key]"))==null?void 0:i.value)==null?void 0:n.trim();if(!e){this.setStatus("apply","Missing API key");return}this.isGenerating=!0;try{let a={apiKey:e,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Xn(a,this.mappingResult,{onProgress:(s,o,l)=>{this.setStatus("apply",`Generating ${s}/${o}: ${l}`),this.renderMappings()}}),this.setStatus("apply","Generation complete"),this.renderMappings()}catch(a){console.error("[BrandVision] Generation failed:",a),this.setStatus("apply","Generation failed")}finally{this.isGenerating=!1}}renderMappings(){var o;let e=(o=this.root)==null?void 0:o.querySelector("[data-vision-mappings]");if(!e||!this.mappingResult)return;let t=this.manifest,i=this.getEngineAssets(),n=!!this.analysisRawResponse&&this.analysisParsedOk===!1,a=((t==null?void 0:t.assets)||[]).map(l=>`<option value="${l.id}">${l.id}</option>`).join(""),s=n?`
1205
1236
  <div class="vision-raw-block">
1206
1237
  <div class="inspector-text-sm" style="white-space: pre-wrap;">
1207
1238
  \u26A0\uFE0F AI response was not valid JSON (${this.analysisParseError||"unknown error"}).
@@ -1210,7 +1241,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1210
1241
  <textarea class="inspector-input vision-raw-textarea" readonly>${this.analysisRawResponse||""}</textarea>
1211
1242
  </div>
1212
1243
  `:"";e.innerHTML=`
1213
- ${o}
1244
+ ${s}
1214
1245
  ${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",p=l.brand_asset||"",d=(b=t==null?void 0:t.assets)==null?void 0:b.find(y=>y.id===p),u=(d==null?void 0:d.dataUrl)||"",g=l.output_dataUrl||"",f=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",h=!!f,m=`
1215
1246
  <select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
1216
1247
  <option value="">Select brand asset\u2026</option>
@@ -1263,8 +1294,8 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1263
1294
  </div>
1264
1295
  </div>
1265
1296
  `}).join("")}
1266
- `}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let o=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;o&&(await this.stageEngineAssetOverride(n,o),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(o=>o.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,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 i=(o=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:o.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let s={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Gn(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:i}=await Promise.resolve().then(()=>(X(),Je));i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let o=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(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(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(o.path)}catch(a){return console.error("[BrandVision] Save to library error:",a),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let o=n.slots.find(s=>s.slotId===e||s.currentAsset===e);if(o!=null&&o.category)return String(o.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let o=e.toLowerCase(),s=l=>a.find(c=>c.toLowerCase().includes(l));return o.includes("bg")||o.includes("background")?s("background")||a[0]:(o.includes("cta")||o.includes("button")||o.includes("ui")||o.includes("logo"))&&s("ui")||a[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var a;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(a=this.root)==null?void 0:a.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,a=s=>{let l=Math.max(300,n+(s.clientX-i));this.root.style.width=`${l}px`},o=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",o)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",o)})}refresh(){}};function Yr(r,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${r}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
1267
- `)}var Qs=["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"],el=["cta_hint","cta_label_end"],Kr=[{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"}],tl=["brand.primary","brand.heading","brand.body","brand.warning"],$i=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`
1297
+ `}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let s=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;s&&(await this.stageEngineAssetOverride(n,s),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(s=>s.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(s=>s.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,s;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(s=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:s.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let o={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await Xn(o,{mappings:[t]}),t.status=t.output_dataUrl?"Generated \u2713":t.status||"Done"}catch(o){console.error("[BrandVision] generateOne failed:",o),t.status="Failed \u2717"}finally{this.isGenerating=!1,this.renderMappings()}}async stageEngineAssetOverride(e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),Je));i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let s=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(s!=null&&s.success)||!(s!=null&&s.path))return console.error("[BrandVision] Save to library failed:",(s==null?void 0:s.error)||s),null;let o=window.addAssetToRegistry;typeof o=="function"&&o(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(s.path)}catch(a){return console.error("[BrandVision] Save to library error:",a),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let s=n.slots.find(o=>o.slotId===e||o.currentAsset===e);if(s!=null&&s.category)return String(s.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let s=e.toLowerCase(),o=l=>a.find(c=>c.toLowerCase().includes(l));return s.includes("bg")||s.includes("background")?o("background")||a[0]:(s.includes("cta")||s.includes("button")||s.includes("ui")||s.includes("logo"))&&o("ui")||a[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var a;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(a=this.root)==null?void 0:a.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,a=o=>{let l=Math.max(300,n+(o.clientX-i));this.root.style.width=`${l}px`},s=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",s)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",s)})}refresh(){}};function Zr(r,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${r}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
1298
+ `)}var tl=["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"],il=["cta_hint","cta_label_end"],Qr=[{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"}],nl=["brand.primary","brand.heading","brand.body","brand.warning"],Ni=class{constructor(){this.root=null;this.assetsContainer=null;this.colorsContainer=null;this.fontsContainer=null;this.textsContainer=null;this.audioContainer=null;this.options=null;this.previewModal=null;this.autoApplyTimer=null;this.activePreviewKey=null;this.activePreviewValue=null;this.activePreviewFileInput=null;this.retryTimer=null;this.aiModal=null;this.aiTargetKey=null;this.aiKeyInput=null;this.aiPromptInput=null;this.aiStrengthInput=null;this.aiStrengthValue=null;this.aiModelSelect=null;this.aiModalSubtitle=null;this.aiGalleryToggle=null;this.aiGalleryEl=null;this.aiGalleryGrid=null;this.aiReferenceInput=null;this.aiReferenceName=null;this.aiReferenceFile=null;this.aiRemoveBgToggle=null;this.aiUseOutputToggle=null;this.aiGenerateBtn=null;this.aiApplyBtn=null;this.aiSaveLibraryBtn=null;this.aiCropBtn=null;this.aiDownloadBtn=null;this.aiPreviewImg=null;this.aiStatusEl=null;this.aiOutputDataUrl=null;this.aiBaseDataUrl=null;this.aiBaseValue=null;this.aiOutputKey=null;this.aiContext=null;this.aiBgToleranceInput=null;this.aiBgToleranceValue=null;this.aiRawOutputDataUrl=null;this.aiLoadingEl=null}render(){return`
1268
1299
  <div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
1269
1300
  <div class="scene-panel-header" data-panel-handle>
1270
1301
  <div class="panel-title">
@@ -1322,17 +1353,17 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1322
1353
  </div>
1323
1354
  <div class="panel-resize-handle" data-panel-resize></div>
1324
1355
  </div>
1325
- `}initialize(e,t){var n,a,o,s,l,c;this.options=t,this.root=e.querySelector('[data-panel="customize-settings"]'),this.assetsContainer=(n=this.root)==null?void 0:n.querySelector("[data-customize-assets]"),this.colorsContainer=(a=this.root)==null?void 0:a.querySelector("[data-customize-colors]"),this.fontsContainer=(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 i=(c=this.root)==null?void 0:c.querySelector("[data-customize-apply]");i==null||i.addEventListener("click",()=>this.handleApply()),this.setupRenderModeHandlers(),this.setupResizeHandle(),this.refresh()}setupRenderModeHandlers(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector('[data-render-mode="endgame-png"]'),t=(n=this.root)==null?void 0:n.querySelector('[data-render-mode="splash-png"]');e==null||e.addEventListener("change",()=>{this.applyEndgamePngMode(e.checked)}),t==null||t.addEventListener("change",()=>{this.applySplashPngMode(t.checked)})}applyEndgamePngMode(e){let t=window.getEditableObjectConfig,i=window.applyEditableObjectConfig;if(typeof t!="function"||typeof i!="function")return;let n=["ui_endgame_title_1","ui_endgame_subtitle_1","ui_endgame_logo_1","ui_endgame_cta_1"];for(let a of n){let o=t(a);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"),i(a,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,i,n){this.openAiModal(e,i,n),t&&this.aiPromptInput&&(this.aiPromptInput.value=t,this.setAiStatus("Prompt loaded."))}refresh(){var t,i,n,a,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((i=(t=e.runtime)==null?void 0:t.theme)!=null?i:{}),this.renderFonts((a=(n=e.runtime)==null?void 0:n.fonts)!=null?a:{}),this.renderTexts((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(([i,n])=>{var u;let a=document.createElement("div");a.className="customize-row";let o=document.createElement("span");o.className="customize-key",o.textContent=i;let s=document.createElement("input");s.type="text",s.value=n!=null?n:"",s.className="customize-input",s.dataset.assetKey=i,s.addEventListener("input",()=>{this.handleAssetValueChange(i,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=`
1356
+ `}initialize(e,t){var n,a,s,o,l,c;this.options=t,this.root=e.querySelector('[data-panel="customize-settings"]'),this.assetsContainer=(n=this.root)==null?void 0:n.querySelector("[data-customize-assets]"),this.colorsContainer=(a=this.root)==null?void 0:a.querySelector("[data-customize-colors]"),this.fontsContainer=(s=this.root)==null?void 0:s.querySelector("[data-customize-fonts]"),this.textsContainer=(o=this.root)==null?void 0:o.querySelector("[data-customize-texts]"),this.audioContainer=(l=this.root)==null?void 0:l.querySelector("[data-customize-audio]");let i=(c=this.root)==null?void 0:c.querySelector("[data-customize-apply]");i==null||i.addEventListener("click",()=>this.handleApply()),this.setupRenderModeHandlers(),this.setupResizeHandle(),this.refresh()}setupRenderModeHandlers(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector('[data-render-mode="endgame-png"]'),t=(n=this.root)==null?void 0:n.querySelector('[data-render-mode="splash-png"]');e==null||e.addEventListener("change",()=>{this.applyEndgamePngMode(e.checked)}),t==null||t.addEventListener("change",()=>{this.applySplashPngMode(t.checked)})}applyEndgamePngMode(e){let t=window.getEditableObjectConfig,i=window.applyEditableObjectConfig;if(typeof t!="function"||typeof i!="function")return;let n=["ui_endgame_title_1","ui_endgame_subtitle_1","ui_endgame_logo_1","ui_endgame_cta_1"];for(let a of n){let s=t(a);s&&(s.ui||(s.ui={}),s.ui.renderMode=e?"png":"text",e&&(s.render||(s.render={}),s.render.asset||(s.render.asset={type:"image",path:""}),s.render.asset.type="image"),i(a,s))}console.log("[CustomizePanel] EndGame PNG mode:",e?"enabled":"disabled")}applySplashPngMode(e){let t=window.applyEditableEngineConfig;typeof t=="function"&&(t({splash:{type:e?"image":"text",image_path:e?"library/splash/splash.png":""}}),console.log("[CustomizePanel] Splash PNG mode:",e?"enabled":"disabled"))}openAiEditor(e,t,i,n){this.openAiModal(e,i,n),t&&this.aiPromptInput&&(this.aiPromptInput.value=t,this.setAiStatus("Prompt loaded."))}refresh(){var t,i,n,a,s,o,l,c;let e=this.getEngineSnapshot();if(console.log("[CustomizePanel] Refreshing with snapshot:",!!e),!e){this.scheduleRetry();return}console.log("[CustomizePanel] Snapshot assets count:",Object.keys(e.assets||{}).length),this.renderAssets(e.assets),this.renderColors((i=(t=e.runtime)==null?void 0:t.theme)!=null?i:{}),this.renderFonts((a=(n=e.runtime)==null?void 0:n.fonts)!=null?a:{}),this.renderTexts((o=(s=e.runtime)==null?void 0:s.ui)!=null?o:{}),this.renderAudio((c=(l=e.runtime)==null?void 0:l.audio)!=null?c:{})}getEngineSnapshot(){let e=window.getEditableEngineConfig;return typeof e!="function"?null:e()}renderAssets(e){if(!this.assetsContainer)return;this.assetsContainer.innerHTML="";let t=Object.entries(e!=null?e:{});if(!t.length){this.assetsContainer.innerHTML='<div class="customize-empty">No assets found.</div>',this.scheduleRetry();return}this.clearRetry(),t.forEach(([i,n])=>{var u;let a=document.createElement("div");a.className="customize-row";let s=document.createElement("span");s.className="customize-key",s.textContent=i;let o=document.createElement("input");o.type="text",o.value=n!=null?n:"",o.className="customize-input",o.dataset.assetKey=i,o.addEventListener("input",()=>{this.handleAssetValueChange(i,o)});let l=document.createElement("div");l.className="customize-actions";let c=document.createElement("button");c.type="button",c.className="customize-icon-btn",c.title="Preview asset",c.innerHTML=`
1326
1357
  <svg viewBox="0 0 24 24" aria-hidden="true">
1327
1358
  <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" />
1328
1359
  <circle cx="12" cy="12" r="3.2" />
1329
1360
  </svg>
1330
- `,c.addEventListener("click",()=>{this.previewAsset(i,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=`
1361
+ `,c.addEventListener("click",()=>{this.previewAsset(i,o.value,o.dataset.assetType,d)});let p=document.createElement("button");p.type="button",p.className="customize-icon-btn",p.title="Upload asset",p.innerHTML=`
1331
1362
  <svg viewBox="0 0 24 24" aria-hidden="true">
1332
1363
  <path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
1333
1364
  <path d="M5 14v4h14v-4h2v6H3v-6h2z" />
1334
1365
  </svg>
1335
- `;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var f;let g=(f=d.files)==null?void 0:f[0];g&&this.handleAssetUpload(g,s,i)}),p.addEventListener("click",()=>d.click()),l.appendChild(c),l.appendChild(p),l.appendChild(d),a.appendChild(o),a.appendChild(s),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",Qs.forEach(t=>{var l,c,p;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let o=document.createElement("input");o.type="color",o.value=i,o.dataset.colorKey=t;let s=document.createElement("input");s.type="text",s.value=i,s.className="customize-color-text",s.dataset.colorTextKey=t,o.addEventListener("input",()=>{s.value=o.value}),s.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(s.value)&&(o.value=s.value)}),n.appendChild(a),n.appendChild(o),n.appendChild(s),(p=this.colorsContainer)==null||p.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",tl.forEach(t=>{var o,s;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(o=e==null?void 0:e[t])!=null?o:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(s=this.fontsContainer)==null||s.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",el.forEach(t=>{var o,s;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(o=this.readUiValue(e,t))!=null?o:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(s=this.textsContainer)==null||s.appendChild(i)}),Kr.forEach(({key:t,objectId:i})=>{var s,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let o=document.createElement("input");o.type="text",o.value=(s=this.getObjectTextValue(i))!=null?s:"",o.className="customize-input",o.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(o),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var s,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let o=document.createElement("input");o.type=i.includes("volume")?"number":"text",o.min="0",o.max="1",o.step="0.1",o.value=String((s=e==null?void 0:e[i])!=null?s:""),o.className="customize-input",o.dataset.audioKey=i,i.includes("file")&&(o.placeholder="audio file path"),n.appendChild(a),n.appendChild(o),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let o of n){if(a==null)return null;a=a[o]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),o=n;for(let s of a){if(o==null)return null;o=o[s]}return typeof o=="string"?o:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(s=>{let l=s;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(s=>{let l=s,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(s=>{let l=s,c=l.dataset.fontKey;c&&(n[c]=l.value)});let a={};this.root.querySelectorAll("[data-text-key]").forEach(s=>{let l=s,c=l.dataset.textKey;c&&(a[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=Kr.find(d=>d.key===c);p&&this.applyObjectPropertyValue(p.objectId,p.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:o}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await ji(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,o;let t=(e==null?void 0:e.trim())||"";if(!t){let s=this.getSelectedAssetInput();t=(a=(n=s==null?void 0:s.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(o=i==null?void 0:i.dataUrl)!=null?o:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let o=this.resolveAssetUrls(i);o[0]&&(a.src=o[0]);let s=document.createElement("span");s.className="ai-gallery-label",s.textContent=t,n.appendChild(a),n.appendChild(s),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var o,s;let i=t,n=i.dataset.assetKey,a=(s=(o=i.value)==null?void 0:o.trim())!=null?s:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var s,l,c,p,d,u,g,f,h,m;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
1366
+ `;let d=document.createElement("input");d.type="file",d.accept="image/*,audio/*,application/json",d.className="customize-file",d.addEventListener("change",()=>{var f;let g=(f=d.files)==null?void 0:f[0];g&&this.handleAssetUpload(g,o,i)}),p.addEventListener("click",()=>d.click()),l.appendChild(c),l.appendChild(p),l.appendChild(d),a.appendChild(s),a.appendChild(o),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",tl.forEach(t=>{var l,c,p;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let s=document.createElement("input");s.type="color",s.value=i,s.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=i,o.className="customize-color-text",o.dataset.colorTextKey=t,s.addEventListener("input",()=>{o.value=s.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(s.value=o.value)}),n.appendChild(a),n.appendChild(s),n.appendChild(o),(p=this.colorsContainer)==null||p.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",nl.forEach(t=>{var s,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(s=e==null?void 0:e[t])!=null?s:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",il.forEach(t=>{var s,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(s=this.readUiValue(e,t))!=null?s:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(o=this.textsContainer)==null||o.appendChild(i)}),Qr.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let s=document.createElement("input");s.type="text",s.value=(o=this.getObjectTextValue(i))!=null?o:"",s.className="customize-input",s.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(s),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let s=document.createElement("input");s.type=i.includes("volume")?"number":"text",s.min="0",s.max="1",s.step="0.1",s.value=String((o=e==null?void 0:e[i])!=null?o:""),s.className="customize-input",s.dataset.audioKey=i,i.includes("file")&&(s.placeholder="audio file path"),n.appendChild(a),n.appendChild(s),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let s of n){if(a==null)return null;a=a[s]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),s=n;for(let o of a){if(s==null)return null;s=s[o]}return typeof s=="string"?s:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(o=>{let l=o;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(o=>{let l=o,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(o=>{let l=o,c=l.dataset.fontKey;c&&(n[c]=l.value)});let a={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(a[c]=l.value)});let s={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let p=parseFloat(l.value);s[c]=isNaN(p)?0:p}else s[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let p=Qr.find(d=>d.key===c);p&&this.applyObjectPropertyValue(p.objectId,p.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:s}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await $i(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,s;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(a=(n=o==null?void 0:o.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(s=i==null?void 0:i.dataUrl)!=null?s:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let s=this.resolveAssetUrls(i);s[0]&&(a.src=s[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(a),n.appendChild(o),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var s,o;let i=t,n=i.dataset.assetKey,a=(o=(s=i.value)==null?void 0:s.trim())!=null?o:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var o,l,c,p,d,u,g,f,h,m;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
1336
1367
  <div class="ai-modal-card">
1337
1368
  <div class="ai-modal-header">
1338
1369
  <div>
@@ -1403,7 +1434,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1403
1434
  </div>
1404
1435
  </div>
1405
1436
  </div>
1406
- `;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(s=this.aiRemoveBgToggle)==null||s.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let o=n.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,w;let b=(w=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?w:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(h=this.aiCropBtn)==null||h.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var p,d,u,g,f,h,m,b,y,v,w,A,L,$,x,_,O,S,E,k;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(f=(g=this.aiModelSelect)==null?void 0:g.value)!=null?f:"gemini-2.5-flash-image",i=(b=(m=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:m.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,a=n,o=n,s=Number((A=(w=this.aiStrengthInput)==null?void 0:w.value)!=null?A:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((L=l==null?void 0:l.value)==null?void 0:L.trim())||(($=this.aiBaseValue)==null?void 0:$.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let T=null,M=(x=this.getSelectedAssetKey())!=null?x:"unknown",P=(_=this.aiUseOutputToggle)!=null&&_.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((O=this.aiUseOutputToggle)!=null&&O.checked&&this.aiOutputDataUrl){let K=Fn(this.aiOutputDataUrl,"ai-output.png");if(K){let re=await Le(K);re&&(T={input:{base64:re.base64,mimeType:re.mimeType},dataUrl:re.dataUrl,width:re.width,height:re.height})}}if(T||(T=await this.getImageDataFromAsset(c)),!T){this.setAiStatus("Unable to load the base image.");return}let z=[T.input],C=!1;if(this.aiReferenceFile){let K=await Le(this.aiReferenceFile);K?(z.push({base64:K.base64,mimeType:K.mimeType}),C=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let I=Yr(i,{includeReference:C,includeMagenta:a,changeLevel:s}),j=(E=(S=this.aiReferenceFile)==null?void 0:S.name)!=null?E:"none";console.info("[AI] Final prompt:",I),console.info("[AI] Image sources:",{assetKey:M,base:P,reference:j});let F=zr(T.width,T.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let U=await tt(e,I,z,{aspectRatio:F,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",U==null?void 0:U.length),this.aiRawOutputDataUrl=U,await this.refreshAiOutputFromRaw()}catch(T){console.error("[CustomizePanel] AI Generate Error:",T),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((k=this.aiStatusEl)==null?void 0:k.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,o,s;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((s=(o=this.aiBgToleranceInput)==null?void 0:o.value)!=null?s:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await et(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),o=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&o)console.log("[CustomizePanel] Applying AI output directly to object:",a,o),this.applyObjectPropertyValue(a,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 a,o,s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),p(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),f=((o=this.aiContext)==null?void 0:o.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),h=this.getSelectedAssetInput();if(h&&(h.value=c.path,this.handleAssetValueChange((s=h.dataset.assetKey)!=null?s:"",h)),g&&f){console.log("[CustomizePanel] Applying saved asset to object:",g,f);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(c.path);await b(g,v,n)}else this.applyObjectPropertyValue(g,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{m(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var o;let t=(o=this.aiContext)==null?void 0:o.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let s=n();if(s!=null&&s.slots){let l=s.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(o=>o.currentAsset===e||o.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var s;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(s=e==null?void 0:e.value)!=null?s:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=Fn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let o=await Nn(a);o&&this.setAiOutput(o)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(n);if(p){let d=await this.showManualCropModal(e,p,n);if(!d)return;a=d}}let o=await Nn(a);if(!o){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:o,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=d.path,this.handleAssetValueChange(i,t);let f=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(f&&h){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(d.path);await b(f,v,c)}else this.applyObjectPropertyValue(f,h,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&f&&setTimeout(()=>{m(f,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let o=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,o)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1437
+ `;let a=n.querySelector(".ai-modal-close");a==null||a.addEventListener("click",()=>this.closeAiModal()),n.addEventListener("click",b=>{b.target===n&&this.closeAiModal()}),this.aiModal=n,this.aiKeyInput=n.querySelector("[data-ai-key]"),this.aiModelSelect=n.querySelector("[data-ai-model]"),this.aiPromptInput=n.querySelector("[data-ai-prompt]"),this.aiStrengthInput=n.querySelector("[data-ai-strength]"),this.aiStrengthValue=n.querySelector("[data-ai-strength-value]"),this.aiModalSubtitle=n.querySelector(".ai-modal-subtitle"),this.aiGalleryToggle=n.querySelector("[data-ai-gallery-toggle]"),this.aiGalleryEl=n.querySelector("[data-ai-gallery]"),this.aiGalleryGrid=n.querySelector("[data-ai-gallery-grid]"),this.aiReferenceInput=n.querySelector("[data-ai-ref-input]"),this.aiReferenceName=n.querySelector("[data-ai-ref-name]"),this.aiRemoveBgToggle=n.querySelector("[data-ai-remove-bg]"),this.aiUseOutputToggle=n.querySelector("[data-ai-use-output]"),this.aiGenerateBtn=n.querySelector("[data-ai-generate]"),this.aiApplyBtn=n.querySelector("[data-ai-apply]"),this.aiSaveLibraryBtn=n.querySelector("[data-ai-save-library]"),this.aiCropBtn=n.querySelector("[data-ai-crop]"),this.aiDownloadBtn=n.querySelector("[data-ai-download]"),this.aiPreviewImg=n.querySelector("[data-ai-preview]"),this.aiStatusEl=n.querySelector("[data-ai-status]"),this.aiLoadingEl=n.querySelector("[data-ai-loading]"),this.aiBgToleranceInput=n.querySelector("[data-ai-bg-tolerance]"),this.aiBgToleranceValue=n.querySelector("[data-ai-bg-tolerance-value]"),(o=this.aiRemoveBgToggle)==null||o.addEventListener("change",()=>{this.refreshAiOutputFromRaw()});let s=n.querySelector("[data-ai-ref-button]");s==null||s.addEventListener("click",()=>{var b;return(b=this.aiReferenceInput)==null?void 0:b.click()}),(l=this.aiGalleryToggle)==null||l.addEventListener("click",()=>this.toggleAiGallery()),(c=this.aiStrengthInput)==null||c.addEventListener("input",()=>{var 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,S;let b=(S=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?S:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(f=this.aiSaveLibraryBtn)==null||f.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(h=this.aiCropBtn)==null||h.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var p,d,u,g,f,h,m,b,y,v,S,x,w,O,E,k,I,C,A,M;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(d=(p=this.aiKeyInput)==null?void 0:p.value)==null?void 0:d.trim())!=null?u:"",t=(f=(g=this.aiModelSelect)==null?void 0:g.value)!=null?f:"gemini-2.5-flash-image",i=(b=(m=(h=this.aiPromptInput)==null?void 0:h.value)==null?void 0:m.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,a=n,s=n,o=Number((x=(S=this.aiStrengthInput)==null?void 0:S.value)!=null?x:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((w=l==null?void 0:l.value)==null?void 0:w.trim())||((O=this.aiBaseValue)==null?void 0:O.trim())||"";if(!c&&!this.aiOutputDataUrl){this.setAiStatus("Select an asset first.");return}this.setAiLoading(!0),this.setAiStatus("Generating...");try{let L=null,_=(E=this.getSelectedAssetKey())!=null?E:"unknown",P=(k=this.aiUseOutputToggle)!=null&&k.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((I=this.aiUseOutputToggle)!=null&&I.checked&&this.aiOutputDataUrl){let X=Wn(this.aiOutputDataUrl,"ai-output.png");if(X){let re=await ke(X);re&&(L={input:{base64:re.base64,mimeType:re.mimeType},dataUrl:re.dataUrl,width:re.width,height:re.height})}}if(L||(L=await this.getImageDataFromAsset(c)),!L){this.setAiStatus("Unable to load the base image.");return}let $=[L.input],T=!1;if(this.aiReferenceFile){let X=await ke(this.aiReferenceFile);X?($.push({base64:X.base64,mimeType:X.mimeType}),T=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let j=Zr(i,{includeReference:T,includeMagenta:a,changeLevel:o}),R=(A=(C=this.aiReferenceFile)==null?void 0:C.name)!=null?A:"none";console.info("[AI] Final prompt:",j),console.info("[AI] Image sources:",{assetKey:_,base:P,reference:R});let F=Nr(L.width,L.height);console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let U=await tt(e,j,$,{aspectRatio:F,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",U==null?void 0:U.length),this.aiRawOutputDataUrl=U,await this.refreshAiOutputFromRaw()}catch(L){console.error("[CustomizePanel] AI Generate Error:",L),this.setAiStatus("Generation failed. Check console.")}finally{this.setAiLoading(!1),((M=this.aiStatusEl)==null?void 0:M.textContent)==="Generating..."&&this.setAiStatus("Ready.")}}async refreshAiOutputFromRaw(){var n,a,s,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(s=this.aiBgToleranceInput)==null?void 0:s.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await et(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),s=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&s)console.log("[CustomizePanel] Applying AI output directly to object:",a,s),this.applyObjectPropertyValue(a,s,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,s,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let p=window.addAssetToRegistry;typeof p=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),p(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let d=window.refreshAssetLibrary;typeof d=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await d());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),f=((s=this.aiContext)==null?void 0:s.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),h=this.getSelectedAssetInput();if(h&&(h.value=c.path,this.handleAssetValueChange((o=h.dataset.assetKey)!=null?o:"",h)),g&&f){console.log("[CustomizePanel] Applying saved asset to object:",g,f);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(c.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(c.path);await b(g,v,n)}else this.applyObjectPropertyValue(g,f,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{m(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var s;let t=(s=this.aiContext)==null?void 0:s.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(s=>s.currentAsset===e||s.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=Wn(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let s=await Vn(a);s&&this.setAiOutput(s)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let p=await this.getImageDimensions(n);if(p){let d=await this.showManualCropModal(e,p,n);if(!d)return;a=d}}let s=await Vn(a);if(!s){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:s,overwrite:!0})})).json();if(d.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",d.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=d.path,this.handleAssetValueChange(i,t);let f=this.inferObjectIdFromAssetKey(i),h=this.inferPathFromAssetKey(i);if(f&&h){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(png|jpg|jpeg)$/i.test(String(d.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(d.path);await b(f,v,c)}else this.applyObjectPropertyValue(f,h,d.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&f&&setTimeout(()=>{m(f,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",d.error),alert(`Failed to save uploaded file: ${d.error}`)}catch(p){console.error("[CustomizePanel] \u274C Upload error:",p),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let s=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,s)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1407
1438
  <div class="asset-preview-card">
1408
1439
  <div class="asset-preview-header">
1409
1440
  <div class="asset-preview-title">${e}</div>
@@ -1419,7 +1450,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1419
1450
  <img class="asset-preview-ai-image" alt="AI output preview">
1420
1451
  </div>
1421
1452
  </div>
1422
- `;let o=a.querySelector(".asset-preview-body"),s=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),p=a.querySelector("[data-asset-ai-preview]");if(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()}),a.addEventListener("click",d=>{d.target===a&&this.closePreviewModal()}),o)if(n==="image"){let d=document.createElement("img");this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="audio"){let d=document.createElement("audio");d.controls=!0,this.loadWithFallback(d,i),o.appendChild(d)}else if(n==="json"){let d=document.createElement("pre");this.fetchWithFallback(i).then(u=>{d.textContent=u!=null?u:"Unable to load JSON."}),o.appendChild(d)}else{let d=document.createElement("a");d.href=i[0],d.target="_blank",d.rel="noreferrer",d.textContent="Open asset",o.appendChild(d)}document.body.appendChild(a),this.previewModal=a,this.updateAiModalPreview(p,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="function")return;let o=n(e);if(!o)return;let s=JSON.parse(JSON.stringify(o)),l=t.split("."),c=s;for(let p=0;p<l.length-1;p++){let d=l[p];c[d]=c[d]||{},c=c[d]}c[l[l.length-1]]=i,a(e,s)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var a;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(a=this.activePreviewFileInput)!=null?a:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=a=>{var u,g;a.preventDefault();let o=a.clientX,s=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,p=f=>{let h=f.clientX-o,m=Math.min(c,Math.max(l,s+h));this.root&&(this.root.style.width=`${m}px`)},d=()=>{var h,m;window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d);let f=(m=(h=this.root)==null?void 0:h.getBoundingClientRect().width)!=null?m:0;f>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(f)))};window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,a=URL.createObjectURL(e),o=await this.loadImage(a);try{URL.revokeObjectURL(a)}catch{}if(!(o!=null&&o.naturalWidth)||!(o!=null&&o.naturalHeight))return null;let s=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let p=Math.min(860,window.innerWidth-60),f=Math.max(220,Math.floor((p-32-16)/2)),h=Math.min(520,window.innerHeight-240),m=f,b=m/n;b>h&&(b=h,m=b*n),c.innerHTML=`
1453
+ `;let s=a.querySelector(".asset-preview-body"),o=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),p=a.querySelector("[data-asset-ai-preview]");if(o==null||o.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),a.addEventListener("click",d=>{d.target===a&&this.closePreviewModal()}),s)if(n==="image"){let d=document.createElement("img");this.loadWithFallback(d,i),s.appendChild(d)}else if(n==="audio"){let d=document.createElement("audio");d.controls=!0,this.loadWithFallback(d,i),s.appendChild(d)}else if(n==="json"){let d=document.createElement("pre");this.fetchWithFallback(i).then(u=>{d.textContent=u!=null?u:"Unable to load JSON."}),s.appendChild(d)}else{let d=document.createElement("a");d.href=i[0],d.target="_blank",d.rel="noreferrer",d.textContent="Open asset",s.appendChild(d)}document.body.appendChild(a),this.previewModal=a,this.updateAiModalPreview(p,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="function")return;let s=n(e);if(!s)return;let o=JSON.parse(JSON.stringify(s)),l=t.split("."),c=o;for(let p=0;p<l.length-1;p++){let d=l[p];c[d]=c[d]||{},c=c[d]}c[l[l.length-1]]=i,a(e,o)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var a;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(a=this.activePreviewFileInput)!=null?a:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=a=>{var u,g;a.preventDefault();let s=a.clientX,o=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,p=f=>{let h=f.clientX-s,m=Math.min(c,Math.max(l,o+h));this.root&&(this.root.style.width=`${m}px`)},d=()=>{var h,m;window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d);let f=(m=(h=this.root)==null?void 0:h.getBoundingClientRect().width)!=null?m:0;f>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(f)))};window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,a=URL.createObjectURL(e),s=await this.loadImage(a);try{URL.revokeObjectURL(a)}catch{}if(!(s!=null&&s.naturalWidth)||!(s!=null&&s.naturalHeight))return null;let o=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let p=Math.min(860,window.innerWidth-60),f=Math.max(220,Math.floor((p-32-16)/2)),h=Math.min(520,window.innerHeight-240),m=f,b=m/n;b>h&&(b=h,m=b*n),c.innerHTML=`
1423
1454
  <div class="asset-crop-card" style="width:${p}px;">
1424
1455
  <div class="asset-crop-header">
1425
1456
  <div>
@@ -1449,7 +1480,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1449
1480
  <button class="asset-crop-apply" type="button">Apply Crop</button>
1450
1481
  </div>
1451
1482
  </div>
1452
- `;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),w=c.querySelector(".asset-crop-zoom"),A=c.querySelector(".asset-crop-zoom-value"),L=c.querySelector(".asset-crop-close"),$=c.querySelector(".asset-crop-cancel"),x=c.querySelector(".asset-crop-apply"),_=c.querySelector(".asset-crop-reset");if(!y||!v||!w||!A){l(null);return}let O=y.getContext("2d"),S=v.getContext("2d");if(!O||!S){l(null);return}let E=o.naturalWidth,k=o.naturalHeight,T=Math.max(y.width/E,y.height/k),M=1,P=0,z=0,C=!1,I=0,j=0,F=0,U=0,K=()=>{let D=T*M,_e=Math.max(0,(E*D-y.width)/2),Be=Math.max(0,(k*D-y.height)/2);P=Math.min(_e,Math.max(-_e,P)),z=Math.min(Be,Math.max(-Be,z))},re=()=>{let D=T*M;O.clearRect(0,0,y.width,y.height);let _e=y.width/2-E*D/2+P,Be=y.height/2-k*D/2+z;if(O.drawImage(o,_e,Be,E*D,k*D),S.clearRect(0,0,v.width,v.height),s!=null&&s.naturalWidth&&(s!=null&&s.naturalHeight)){let Ge=Math.max(v.width/s.naturalWidth,v.height/s.naturalHeight),on=v.width/2-s.naturalWidth*Ge/2,ht=v.height/2-s.naturalHeight*Ge/2;S.drawImage(s,on,ht,s.naturalWidth*Ge,s.naturalHeight*Ge)}else S.fillStyle="rgba(255, 255, 255, 0.04)",S.fillRect(0,0,v.width,v.height),S.strokeStyle="rgba(255, 255, 255, 0.08)",S.strokeRect(4,4,v.width-8,v.height-8);let gt=v.width/y.width*(T*M),Ue=P*(v.width/y.width),Bt=z*(v.height/y.height),an=v.width/2-E*gt/2+Ue,rn=v.height/2-k*gt/2+Bt;S.save(),S.globalAlpha=.7,S.drawImage(o,an,rn,E*gt,k*gt),S.restore()},Oa=()=>{P=0,z=0,K(),re()};w.addEventListener("input",()=>{M=Number(w.value),A.textContent=`${M.toFixed(2)}\xD7`,K(),re()}),y.addEventListener("pointerdown",D=>{C=!0,I=D.clientX,j=D.clientY,F=P,U=z,y.setPointerCapture(D.pointerId)}),y.addEventListener("pointermove",D=>{C&&(P=F+(D.clientX-I),z=U+(D.clientY-j),K(),re())}),y.addEventListener("pointerup",D=>{C=!1,y.releasePointerCapture(D.pointerId)}),y.addEventListener("pointerleave",()=>{C=!1});let tn=()=>{c.remove()},nn=()=>{tn(),l(null)},Ho=async()=>{let D=document.createElement("canvas");D.width=t.width,D.height=t.height;let _e=D.getContext("2d");if(!_e){tn(),l(null);return}let Be=M,Ue=Math.max(D.width/E,D.height/k)*Be,Bt=D.width/y.width,an=P*Bt,rn=z*Bt,Ge=D.width/2-E*Ue/2+an,on=D.height/2-k*Ue/2+rn;_e.drawImage(o,Ge,on,E*Ue,k*Ue);let ht=await new Promise(No=>{D.toBlob(Fo=>No(Fo),e.type||"image/png")});if(tn(),!ht){l(null);return}l(new File([ht],e.name,{type:ht.type}))};L==null||L.addEventListener("click",nn),$==null||$.addEventListener("click",nn),_==null||_.addEventListener("click",Oa),x==null||x.addEventListener("click",()=>{Ho()}),c.addEventListener("click",D=>{D.target===c&&nn()}),document.body.appendChild(c),Oa()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var Di=class{constructor(){this.root=null;this.options=null}render(){return`
1483
+ `;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),S=c.querySelector(".asset-crop-zoom"),x=c.querySelector(".asset-crop-zoom-value"),w=c.querySelector(".asset-crop-close"),O=c.querySelector(".asset-crop-cancel"),E=c.querySelector(".asset-crop-apply"),k=c.querySelector(".asset-crop-reset");if(!y||!v||!S||!x){l(null);return}let I=y.getContext("2d"),C=v.getContext("2d");if(!I||!C){l(null);return}let A=s.naturalWidth,M=s.naturalHeight,L=Math.max(y.width/A,y.height/M),_=1,P=0,$=0,T=!1,j=0,R=0,F=0,U=0,X=()=>{let D=L*_,Oe=Math.max(0,(A*D-y.width)/2),Ue=Math.max(0,(M*D-y.height)/2);P=Math.min(Oe,Math.max(-Oe,P)),$=Math.min(Ue,Math.max(-Ue,$))},re=()=>{let D=L*_;I.clearRect(0,0,y.width,y.height);let Oe=y.width/2-A*D/2+P,Ue=y.height/2-M*D/2+$;if(I.drawImage(s,Oe,Ue,A*D,M*D),C.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),cn=v.width/2-o.naturalWidth*qe/2,ht=v.height/2-o.naturalHeight*qe/2;C.drawImage(o,cn,ht,o.naturalWidth*qe,o.naturalHeight*qe)}else C.fillStyle="rgba(255, 255, 255, 0.04)",C.fillRect(0,0,v.width,v.height),C.strokeStyle="rgba(255, 255, 255, 0.08)",C.strokeRect(4,4,v.width-8,v.height-8);let gt=v.width/y.width*(L*_),Ge=P*(v.width/y.width),Ut=$*(v.height/y.height),on=v.width/2-A*gt/2+Ge,ln=v.height/2-M*gt/2+Ut;C.save(),C.globalAlpha=.7,C.drawImage(s,on,ln,A*gt,M*gt),C.restore()},Da=()=>{P=0,$=0,X(),re()};S.addEventListener("input",()=>{_=Number(S.value),x.textContent=`${_.toFixed(2)}\xD7`,X(),re()}),y.addEventListener("pointerdown",D=>{T=!0,j=D.clientX,R=D.clientY,F=P,U=$,y.setPointerCapture(D.pointerId)}),y.addEventListener("pointermove",D=>{T&&(P=F+(D.clientX-j),$=U+(D.clientY-R),X(),re())}),y.addEventListener("pointerup",D=>{T=!1,y.releasePointerCapture(D.pointerId)}),y.addEventListener("pointerleave",()=>{T=!1});let rn=()=>{c.remove()},sn=()=>{rn(),l(null)},Bs=async()=>{let D=document.createElement("canvas");D.width=t.width,D.height=t.height;let Oe=D.getContext("2d");if(!Oe){rn(),l(null);return}let Ue=_,Ge=Math.max(D.width/A,D.height/M)*Ue,Ut=D.width/y.width,on=P*Ut,ln=$*Ut,qe=D.width/2-A*Ge/2+on,cn=D.height/2-M*Ge/2+ln;Oe.drawImage(s,qe,cn,A*Ge,M*Ge);let ht=await new Promise(Us=>{D.toBlob(Gs=>Us(Gs),e.type||"image/png")});if(rn(),!ht){l(null);return}l(new File([ht],e.name,{type:ht.type}))};w==null||w.addEventListener("click",sn),O==null||O.addEventListener("click",sn),k==null||k.addEventListener("click",Da),E==null||E.addEventListener("click",()=>{Bs()}),c.addEventListener("click",D=>{D.target===c&&sn()}),document.body.appendChild(c),Da()})}async loadImageForValue(e){let t=this.resolveAssetUrls(e);if(!t.length)return null;for(let i of t){let n=await this.loadImage(i);if(n)return n}return null}};var Fi=class{constructor(){this.root=null;this.options=null}render(){return`
1453
1484
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
1454
1485
  <div class="scene-panel-header" data-panel-handle>
1455
1486
  <div class="panel-title">
@@ -1515,10 +1546,10 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1515
1546
  </div>
1516
1547
  </div>
1517
1548
  </div>
1518
- `}initialize(e,t){var y,v,w,A,L,$,x,_,O,S,E,k,T,M,P,z;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var I;let C=window.getEditableEngineConfig;if(typeof C=="function"){let j=C();return(I=j==null?void 0:j.loading)!=null?I:{}}return{}})(),a=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{type:a.value}),this.updateFieldVisibility(a.value)}));let o=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");o&&(o.value=n.background_color||"#160a17",o.addEventListener("input",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{background_color:o.value})}));let s=(w=this.root)==null?void 0:w.querySelector("#loading-overlay-alpha"),l=(A=this.root)==null?void 0:A.querySelector("#loading-overlay-alpha-value");s&&(s.value=String((L=n.overlay_alpha)!=null?L:1),l&&(l.textContent=Number(s.value).toFixed(2)),s.addEventListener("input",()=>{var I,j;let C=Number(s.value);l&&(l.textContent=C.toFixed(2)),(j=(I=this.options)==null?void 0:I.onUpdateLoading)==null||j.call(I,{overlay_alpha:C})}));let c=($=this.root)==null?void 0:$.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{text:c.value})}));let p=(x=this.root)==null?void 0:x.querySelector("#loading-text-scale"),d=(_=this.root)==null?void 0:_.querySelector("#loading-text-scale-value");p&&(p.value=String((O=n.text_scale)!=null?O:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var I,j;let C=Number(p.value);d&&(d.textContent=C.toFixed(2)),(j=(I=this.options)==null?void 0:I.onUpdateLoading)==null||j.call(I,{text_scale:C})}));let u=(S=this.root)==null?void 0:S.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{enabled:u.checked})}));let g=(E=this.root)==null?void 0:E.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{blur_enabled:g.checked})}));let f=(k=this.root)==null?void 0:k.querySelector("#loading-blur-strength"),h=(T=this.root)==null?void 0:T.querySelector("#loading-blur-strength-value");f&&(f.value=String((M=n.blur_strength)!=null?M:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var C,I;h&&(h.textContent=f.value),(I=(C=this.options)==null?void 0:C.onUpdateLoading)==null||I.call(C,{blur_strength:Number(f.value)})}));let m=(P=this.root)==null?void 0:P.querySelector("#loading-show-btn"),b=(z=this.root)==null?void 0:z.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onShowLoadingScreen)==null||I.call(C)}),b==null||b.addEventListener("click",()=>{var C,I;(I=(C=this.options)==null?void 0:C.onHideLoadingScreen)==null||I.call(C)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var Lt=require("pixi.js");Ke();X();async function Xr(r,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),s=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",s);let l=await Lt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load texture:",s);return}let c=window.CustomAssets,p=Object.keys(c||{}).filter(u=>{let 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),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let d=window.gameObjectManager;if(d)for(let u of p){let g=d.get(u);if(g){let f=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function Jr(r,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,o=typeof a=="function"?a():null,s=(t=o==null?void 0:o.slots)==null?void 0:t.find(m=>m.category===e),l=s==null?void 0:s.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await Lt.Assets.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,g=e.replace(/s$/,""),f=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of f)se[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let h=window.gameObjectManager;if(h)for(let m of f){let b=h.get(m);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function Zr(r,e,t,i){var n,a,o,s,l,c,p,d,u,g,f,h,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let w=Date.now(),A=`/raw/library/${i}/${t}?t=${w}`;console.log("[LIBRARY] Loading texture from:",A);let L=await Lt.Assets.load(A);if(!L){console.error("[LIBRARY] Failed to load texture:",A);return}console.log("[LIBRARY] \u2705 Texture loaded"),se[v]=L,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let $=window.CustomAssets;$!=null&&$[v]&&($[v].texture=L,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let x=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!x),x){let O=Array.from(((n=x.keys)==null?void 0:n.call(x))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",O);let S=x.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!S),S){let E=((a=S.getDisplayObject)==null?void 0:a.call(S))||S.pixiObject||S.pixi||S,k=(o=E==null?void 0:E.constructor)==null?void 0:o.name;if(console.log("[LIBRARY] displayObject:",E),console.log("[LIBRARY] displayObject type:",k),console.log("[LIBRARY] has texture?",!!(E!=null&&E.texture)),E!=null&&E.texture)E.texture=L,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(k==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:T}=await import("pixi.js"),M=E.parent,P=(l=(s=M==null?void 0:M.getChildIndex)==null?void 0:s.call(M,E))!=null?l:0,z={x:E.x,y:E.y},C={x:(p=(c=E.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=E.anchor)==null?void 0:d.y)!=null?u:.5},I={x:(f=(g=E.scale)==null?void 0:g.x)!=null?f:1,y:(m=(h=E.scale)==null?void 0:h.y)!=null?m:1},j=(b=E.alpha)!=null?b:1,F=(y=E.visible)!=null?y:!0,U=new T(L);U.anchor.set(C.x,C.y),U.position.set(z.x,z.y),U.scale.set(I.x,I.y),U.alpha=j,U.visible=F,M&&(M.removeChild(E),M.addChildAt(U,P),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),S.pixiObject&&(S.pixiObject=U),S.pixi&&(S.pixi=U),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(E!=null&&E.children){let T=E.children.find(M=>M.texture);T?(T.texture=L,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let _=`raw/library/${i}/${t}`;Ae({objectId:v,path:"render.asset.path",value:_}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",_)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function Qr(r,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,o=Date.now(),s=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",s);let l=await Lt.Assets.load(s);if(!l){console.error("[LIBRARY] Failed to load default texture:",s);return}se[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(a);if(d){let u=((n=d.getDisplayObject)==null?void 0:n.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",a))}}Ae({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}var Mt=require("pixi.js");var qn=require("pixi.js"),ke=()=>window.debugConfig||{},eo=()=>window.resolveAnchorVec2||(r=>({x:.5,y:.5})),to=()=>window.resolveScreenAnchorPoint||(()=>new qn.Point),io=()=>window.resolveScreenRatioPoint||(()=>new qn.Point);function no(r){Hi(r)&&(r.objectDebugRaf||(r.objectDebugRaf=window.requestAnimationFrame(()=>Ni(r))))}function ao(r){r.objectDebugRaf&&(window.cancelAnimationFrame(r.objectDebugRaf),r.objectDebugRaf=null),Pt(r)}function Hi(r){return r.isDebugOpen}function Ni(r){var a,o,s;if(!Hi(r)){r.objectDebugRaf=null;return}r.objectDebugRaf=window.requestAnimationFrame(()=>Ni(r));let e=Vn(r);if(!e){kt(r,null),Pt(r);return}let t=Wn(r,e);if(!t){kt(r,null),Pt(r);return}let i=new Mt.Point;(a=t.getGlobalPosition)==null||a.call(t,i);let n=Yn(r,t);kt(r,{instanceId:e,worldX:i.x,worldY:i.y,configX:(o=n==null?void 0:n.x)!=null?o:null,configY:(s=n==null?void 0:n.y)!=null?s:null}),r.highlightObject?Zn(r,t):ea(r),r.highlightAnchor&&n?Qn(r,n):ta(r)}function Vn(r){var n;let e=r.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function Wn(r,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function _t(r){let e=r.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function Yn(r,e){var o,s;let t=_t(r);if(!t)return null;let i=(o=t.transform)!=null?o:{},n=Kn(r);if(!n)return null;if(i.position_ratio!=null)return io()(n.width,n.height,i.position_ratio);let a=(s=i.anchor)!=null?s:"center";return to()(n.width,n.height,a)}function Kn(r){var a;let e=(a=r.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function Xn(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectBoundsGfx&&r.objectBoundsGfx.parent!==e.stage&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectBoundsGfx||(r.objectBoundsGfx=new Mt.Graphics,r.objectBoundsGfx.zIndex=999999,e.stage.addChild(r.objectBoundsGfx)),r.objectBoundsGfx):null}function Jn(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectAnchorGfx&&r.objectAnchorGfx.parent!==e.stage&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null),r.objectAnchorGfx||(r.objectAnchorGfx=new Mt.Graphics,r.objectAnchorGfx.zIndex=1e6,e.stage.addChild(r.objectAnchorGfx)),r.objectAnchorGfx):null}function Zn(r,e){var n;let t=Xn(r);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function Qn(r,e){let t=Jn(r);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function ea(r){r.objectBoundsGfx&&r.objectBoundsGfx.clear()}function ta(r){r.objectAnchorGfx&&r.objectAnchorGfx.clear()}function Pt(r){r.objectBoundsGfx&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectAnchorGfx&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null)}function kt(r,e){r.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function ro(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function oo(r,e,t){var o;let i=e.split("."),n=i.pop(),a=r;for(let s of i)a[s]=(o=a[s])!=null?o:{},a=a[s];a[n]=t}function ia(r){var i,n,a,o,s;if(!r)return!1;if((i=r.transform)!=null&&i.offset)return!0;let e=((a=(n=r.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((s=(o=r.identity)==null?void 0:o.id)!=null?s:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function Bi(r){let e=ke();e.layout&&(e.layout.scale_multiplier=1,e.layout.position_offset={x:0,y:0},e.layout.debug_rect_visible=!0,e.layout.debug_rect_color=16711680,e.layout.debug_rect_thickness=4),e.engine&&(e.engine.scale=1,e.engine.background_scale=1.05,e.engine.label_pulse_speed=3,e.engine.label_pulse_intensity=.03),e.physics&&(e.physics.rope_length=420),window.location.reload()}function so(r){window.location.reload()}function Ui(r){let e=JSON.stringify(ke(),null,2);navigator.clipboard.writeText(e).then(()=>{alert("Debug config copied to clipboard!")}).catch(()=>{console.log(e),alert("Config logged to console (clipboard not available)")})}async function lo(r,e){var t,i,n;if(!(!r.configViewer||!r.container))try{let a=window.getEditableObjectConfig,o=typeof a=="function"?a(e):null;if(!o){let{loadObjectCentricConfig:s,loadObjectConfig:l}=await Promise.resolve().then(()=>(pi(),_r)),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),Fi(r,u),(i=r.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,o),Fi(r,o),(n=r.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function Fi(r,e){var d,u,g,f,h,m,b,y,v,w;if(!r.container)return;let t=r.container.querySelector("#config-pos-x"),i=r.container.querySelector("#config-pos-y"),n=r.container.querySelector("#config-scale"),a=r.container.querySelector("#config-anchor-x"),o=r.container.querySelector("#config-anchor-y"),l=ia(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((m=(h=e.transform)==null?void 0:h.scale)!=null?m:1));let c=(w=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?w:{x:.5,y:.5},p=eo()(c);a&&(a.value=String(p.x)),o&&(o.value=String(p.y))}function co(r){var l,c,p,d,u,g,f,h,m,b;let e=r.selectedObjectId;if(!e||!r.container)return;let t=(c=(l=r.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=r.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(g=(u=r.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(h=(f=r.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",o=(b=(m=r.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",s=`${e}:
1549
+ `}initialize(e,t){var y,v,S,x,w,O,E,k,I,C,A,M,L,_,P,$;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var j;let T=window.getEditableEngineConfig;if(typeof T=="function"){let R=T();return(j=R==null?void 0:R.loading)!=null?j:{}}return{}})(),a=(y=this.root)==null?void 0:y.querySelector("#loading-screen-type");a&&(a.value=n.type==="image"?"image":"color",a.addEventListener("change",()=>{var T,j;(j=(T=this.options)==null?void 0:T.onUpdateLoading)==null||j.call(T,{type:a.value}),this.updateFieldVisibility(a.value)}));let s=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");s&&(s.value=n.background_color||"#160a17",s.addEventListener("input",()=>{var T,j;(j=(T=this.options)==null?void 0:T.onUpdateLoading)==null||j.call(T,{background_color:s.value})}));let o=(S=this.root)==null?void 0:S.querySelector("#loading-overlay-alpha"),l=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((w=n.overlay_alpha)!=null?w:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var j,R;let T=Number(o.value);l&&(l.textContent=T.toFixed(2)),(R=(j=this.options)==null?void 0:j.onUpdateLoading)==null||R.call(j,{overlay_alpha:T})}));let c=(O=this.root)==null?void 0:O.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var T,j;(j=(T=this.options)==null?void 0:T.onUpdateLoading)==null||j.call(T,{text:c.value})}));let p=(E=this.root)==null?void 0:E.querySelector("#loading-text-scale"),d=(k=this.root)==null?void 0:k.querySelector("#loading-text-scale-value");p&&(p.value=String((I=n.text_scale)!=null?I:.6),d&&(d.textContent=Number(p.value).toFixed(2)),p.addEventListener("input",()=>{var j,R;let T=Number(p.value);d&&(d.textContent=T.toFixed(2)),(R=(j=this.options)==null?void 0:j.onUpdateLoading)==null||R.call(j,{text_scale:T})}));let u=(C=this.root)==null?void 0:C.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var T,j;(j=(T=this.options)==null?void 0:T.onUpdateLoading)==null||j.call(T,{enabled:u.checked})}));let g=(A=this.root)==null?void 0:A.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var T,j;(j=(T=this.options)==null?void 0:T.onUpdateLoading)==null||j.call(T,{blur_enabled:g.checked})}));let f=(M=this.root)==null?void 0:M.querySelector("#loading-blur-strength"),h=(L=this.root)==null?void 0:L.querySelector("#loading-blur-strength-value");f&&(f.value=String((_=n.blur_strength)!=null?_:8),h&&(h.textContent=f.value),f.addEventListener("input",()=>{var T,j;h&&(h.textContent=f.value),(j=(T=this.options)==null?void 0:T.onUpdateLoading)==null||j.call(T,{blur_strength:Number(f.value)})}));let m=(P=this.root)==null?void 0:P.querySelector("#loading-show-btn"),b=($=this.root)==null?void 0:$.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var T,j;(j=(T=this.options)==null?void 0:T.onShowLoadingScreen)==null||j.call(T)}),b==null||b.addEventListener("click",()=>{var T,j;(j=(T=this.options)==null?void 0:T.onHideLoadingScreen)==null||j.call(T)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var kt=require("pixi.js");Xe();K();async function es(r,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await kt.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)oe[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let d=window.gameObjectManager;if(d)for(let u of p){let g=d.get(u);if(g){let f=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;f!=null&&f.texture&&(f.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function ts(r,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,s=typeof a=="function"?a():null,o=(t=s==null?void 0:s.slots)==null?void 0:t.find(m=>m.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),p=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",p);let d=await kt.Assets.load(p);if(!d){console.error("[LIBRARY] Failed to load default texture:",p);return}let u=window.CustomAssets,g=e.replace(/s$/,""),f=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of f)oe[m]=d,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=d,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let h=window.gameObjectManager;if(h)for(let m of f){let b=h.get(m);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=d,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function is(r,e,t,i){var n,a,s,o,l,c,p,d,u,g,f,h,m,b,y;console.log("[LIBRARY] applySlotAsset:",{objectId:e,assetFilename:t,category:i});try{let v=e.startsWith("json.")?e.replace("json.",""):e;console.log("[LIBRARY] Asset key:",v);let S=Date.now(),x=`/raw/library/${i}/${t}?t=${S}`;console.log("[LIBRARY] Loading texture from:",x);let w=await kt.Assets.load(x);if(!w){console.error("[LIBRARY] Failed to load texture:",x);return}console.log("[LIBRARY] \u2705 Texture loaded"),oe[v]=w,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let O=window.CustomAssets;O!=null&&O[v]&&(O[v].texture=w,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let E=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!E),E){let I=Array.from(((n=E.keys)==null?void 0:n.call(E))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",I);let C=E.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!C),C){let A=((a=C.getDisplayObject)==null?void 0:a.call(C))||C.pixiObject||C.pixi||C,M=(s=A==null?void 0:A.constructor)==null?void 0:s.name;if(console.log("[LIBRARY] displayObject:",A),console.log("[LIBRARY] displayObject type:",M),console.log("[LIBRARY] has texture?",!!(A!=null&&A.texture)),A!=null&&A.texture)A.texture=w,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(M==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:L}=await import("pixi.js"),_=A.parent,P=(l=(o=_==null?void 0:_.getChildIndex)==null?void 0:o.call(_,A))!=null?l:0,$={x:A.x,y:A.y},T={x:(p=(c=A.anchor)==null?void 0:c.x)!=null?p:.5,y:(u=(d=A.anchor)==null?void 0:d.y)!=null?u:.5},j={x:(f=(g=A.scale)==null?void 0:g.x)!=null?f:1,y:(m=(h=A.scale)==null?void 0:h.y)!=null?m:1},R=(b=A.alpha)!=null?b:1,F=(y=A.visible)!=null?y:!0,U=new L(w);U.anchor.set(T.x,T.y),U.position.set($.x,$.y),U.scale.set(j.x,j.y),U.alpha=R,U.visible=F,_&&(_.removeChild(A),_.addChildAt(U,P),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),C.pixiObject&&(C.pixiObject=U),C.pixi&&(C.pixi=U),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(A!=null&&A.children){let L=A.children.find(_=>_.texture);L?(L.texture=w,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let k=`raw/library/${i}/${t}`;le({objectId:v,path:"render.asset.path",value:k}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",k)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function ns(r,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,s=Date.now(),o=`/raw/${t}?t=${s}`;console.log("[LIBRARY] Loading default texture from:",o);let l=await kt.Assets.load(o);if(!l){console.error("[LIBRARY] Failed to load default texture:",o);return}oe[a]=l,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let c=window.CustomAssets;c!=null&&c[a]&&(c[a].texture=l,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let p=window.gameObjectManager;if(p){let d=p.get(a);if(d){let u=((n=d.getDisplayObject)==null?void 0:n.call(d))||d.pixiObject||d;u!=null&&u.texture&&(u.texture=l,console.log("[LIBRARY] \u2705 Reset display object:",a))}}le({objectId:a,path:"render.asset.path",value:t}),console.log("[LIBRARY] \u2705 Reset config override for:",a)}catch(a){console.error("[LIBRARY] Error resetting slot asset:",a)}}var _t=require("pixi.js");var Jn=require("pixi.js"),Me=()=>window.debugConfig||{},as=()=>window.resolveAnchorVec2||(r=>({x:.5,y:.5})),rs=()=>window.resolveScreenAnchorPoint||(()=>new Jn.Point),ss=()=>window.resolveScreenRatioPoint||(()=>new Jn.Point);function os(r){Bi(r)&&(r.objectDebugRaf||(r.objectDebugRaf=window.requestAnimationFrame(()=>Ui(r))))}function ls(r){r.objectDebugRaf&&(window.cancelAnimationFrame(r.objectDebugRaf),r.objectDebugRaf=null),Pt(r)}function Bi(r){return r.isDebugOpen}function Ui(r){var a,s,o;if(!Bi(r)){r.objectDebugRaf=null;return}r.objectDebugRaf=window.requestAnimationFrame(()=>Ui(r));let e=Zn(r);if(!e){Mt(r,null),Pt(r);return}let t=Qn(r,e);if(!t){Mt(r,null),Pt(r);return}let i=new _t.Point;(a=t.getGlobalPosition)==null||a.call(t,i);let n=ea(r,t);Mt(r,{instanceId:e,worldX:i.x,worldY:i.y,configX:(s=n==null?void 0:n.x)!=null?s:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),r.highlightObject?aa(r,t):sa(r),r.highlightAnchor&&n?ra(r,n):oa(r)}function Zn(r){var n;let e=r.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function Qn(r,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function Ot(r){let e=r.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function ea(r,e){var s,o;let t=Ot(r);if(!t)return null;let i=(s=t.transform)!=null?s:{},n=ta(r);if(!n)return null;if(i.position_ratio!=null)return ss()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return rs()(n.width,n.height,a)}function ta(r){var a;let e=(a=r.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function ia(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectBoundsGfx&&r.objectBoundsGfx.parent!==e.stage&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectBoundsGfx||(r.objectBoundsGfx=new _t.Graphics,r.objectBoundsGfx.zIndex=999999,e.stage.addChild(r.objectBoundsGfx)),r.objectBoundsGfx):null}function na(r){let e=window.gameApp;return e!=null&&e.stage?(r.objectAnchorGfx&&r.objectAnchorGfx.parent!==e.stage&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null),r.objectAnchorGfx||(r.objectAnchorGfx=new _t.Graphics,r.objectAnchorGfx.zIndex=1e6,e.stage.addChild(r.objectAnchorGfx)),r.objectAnchorGfx):null}function aa(r,e){var n;let t=ia(r);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function ra(r,e){let t=na(r);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function sa(r){r.objectBoundsGfx&&r.objectBoundsGfx.clear()}function oa(r){r.objectAnchorGfx&&r.objectAnchorGfx.clear()}function Pt(r){r.objectBoundsGfx&&(r.objectBoundsGfx.destroy(),r.objectBoundsGfx=null),r.objectAnchorGfx&&(r.objectAnchorGfx.destroy(),r.objectAnchorGfx=null)}function Mt(r,e){r.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function cs(r,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,r)}function ds(r,e,t){var s;let i=e.split("."),n=i.pop(),a=r;for(let o of i)a[o]=(s=a[o])!=null?s:{},a=a[o];a[n]=t}function la(r){var i,n,a,s,o;if(!r)return!1;if((i=r.transform)!=null&&i.offset)return!0;let e=((a=(n=r.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(s=r.identity)==null?void 0:s.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function qi(r){let e=Me();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 ps(r){window.location.reload()}function Vi(r){let e=JSON.stringify(Me(),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 us(r,e){var t,i,n;if(!(!r.configViewer||!r.container))try{let a=window.getEditableObjectConfig,s=typeof a=="function"?a(e):null;if(!s){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await Promise.resolve().then(()=>(hi(),Rr)),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),Gi(r,u),(i=r.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,s),Gi(r,s),(n=r.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function Gi(r,e){var d,u,g,f,h,m,b,y,v,S;if(!r.container)return;let t=r.container.querySelector("#config-pos-x"),i=r.container.querySelector("#config-pos-y"),n=r.container.querySelector("#config-scale"),a=r.container.querySelector("#config-anchor-x"),s=r.container.querySelector("#config-anchor-y"),l=la(e)?(d=e.transform)==null?void 0:d.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((f=l==null?void 0:l.y)!=null?f:0)),n&&(n.value=String((m=(h=e.transform)==null?void 0:h.scale)!=null?m:1));let c=(S=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?S:{x:.5,y:.5},p=as()(c);a&&(a.value=String(p.x)),s&&(s.value=String(p.y))}function gs(r){var l,c,p,d,u,g,f,h,m,b;let e=r.selectedObjectId;if(!e||!r.container)return;let t=(c=(l=r.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(d=(p=r.container.querySelector("#config-pos-y"))==null?void 0:p.value)!=null?d:"0",n=(g=(u=r.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(h=(f=r.container.querySelector("#config-anchor-x"))==null?void 0:f.value)!=null?h:"0.5",s=(b=(m=r.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",o=`${e}:
1519
1550
  position: (${t}, ${i})
1520
1551
  scale: ${n}
1521
- anchor: (${a}, ${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 na(r,e){var d,u,g,f,h,m,b,y,v,w,A;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!r.container)return;let t=r.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=r.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(g=r.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),a=Number((m=(h=r.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),o=Number((y=(b=r.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),s=Number((w=(v=r.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?w:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:o,anchorY:s});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(X(),Je));l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:o,y:s}},{silent:e==null?void 0:e.silent});let c=_t(r);ia(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let L=(A=window.getEditableObjectConfig)==null?void 0:A.call(window,t);L?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,L)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function po(r,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(X(),Je));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([p,d])=>{var u;if(p)if(p.includes(".")){let g=p.split("."),f=c;for(let h=0;h<g.length-1;h++){let m=g[h];f[m]=(u=f[m])!=null?u:{},f=f[m]}f[g[g.length-1]]=d}else c[p]=d}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),o=(t==null?void 0:t.source)!=="auto"&&!a,s=window.__previewShell;o&&(s!=null&&s.refresh)&&s.refresh()}function uo(r){r.selectedObjectId&&(r.objectAutoApplyTimer&&window.clearTimeout(r.objectAutoApplyTimer),r.objectAutoApplyTimer=window.setTimeout(()=>{r.objectAutoApplyTimer=null,na(r,{silent:!0})},150))}var il=3e3;function Ot(r,e,t){let i=t!=null?t:r.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,o=0,s=0,l=0,c=0,p=0,d=g=>{if(!n)return;let f=i.getBoundingClientRect();r.style.left=`${g.clientX-f.left-c}px`,r.style.top=`${g.clientY-f.top-p}px`},u=()=>{n&&(n=!1,r.classList.remove("dragging"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let f=g.target;if(f!=null&&f.closest("button, input, select, textarea"))return;g.preventDefault();let h=r.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",r.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:h.left,top:h.top,width:h.width,height:h.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-h.left,p=g.clientY-h.top,console.log("[DRAG] offset:",{x:c,y:p});let b=h.left-m.left,y=h.top-m.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),r.style.left=`${b}px`,r.style.top=`${y}px`,r.style.right="auto",r.style.bottom="auto",r.style.zIndex=String(++il),n=!0,r.classList.add("dragging"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function go(r,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,o=0,s=0,l=0,c=!1,p=u=>{var y;if(!c)return;let g=u.clientX-s,f=u.clientY-l,h=Math.max(i,a+g),m=Math.max(n,o+f);r.style.width=`${h}px`,(y=r.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(r.style.height=`${m}px`),t==null||t(h,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=r.getBoundingClientRect();a=g.width,o=g.height,s=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function aa(r,e){var h,m,b,y;let t=(b=(m=(h=r.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:r.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=r.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,o=Math.max(250,Math.floor(i.width-a*2)),s=Math.max(200,Math.floor(i.height-a*2));n.width>o&&(e.style.width=`${o}px`),n.height>s&&(e.style.height=`${s}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),d),f=Math.min(Math.max(p,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function it(r){var i,n;if(!r.container)return;let e=r.container.querySelector("#debug-workbench");if(!e)return;if(aa(r,e),(i=r.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),o={activeTab:r.activeTab};if(a)try{o={...JSON.parse(a),activeTab:r.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(o));return}let t={activeTab:r.activeTab,width:e.style.width,height:(n=r.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function Gi(r){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(r.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=r.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let o=(a=r.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!o?i.style.height=t.height:o&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),aa(r,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function ra(r,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",aa(r,e),it(r))}function ho(r){var n,a,o;if(!r.container)return;let e=r.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var s;console.log("[PREVIEW] Debug toggle clicked"),(s=r.toggleDebug)==null||s.call(r)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var s;return(s=r.toggleDebug)==null?void 0:s.call(r,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>Bi(r)),(o=e.querySelector("#debug-export"))==null||o.addEventListener("click",()=>Ui(r)),e.querySelectorAll(".workbench-tab").forEach(s=>{s.addEventListener("click",()=>{let l=s.dataset.tab;r.activeTab=l,oa(r),it(r)})}),la(r,e),sa(r,e)}function oa(r){if(!r.container)return;let e=r.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===r.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===r.activeTab)})}function sa(r,e){ne(r,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ne(r,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ne(r,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ne(r,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ne(r,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ne(r,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ne(r,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ne(r,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ne(r,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=ke();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),o=ke();o.layout&&(o.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function fo(r){if(!r.container||!r.debugOverlay)return;let e=r.container.querySelector("#debug-workbench"),t=r.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Ot(e,t,r.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{it(r),ra(r,e)},10)}));let i=r.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),Ot(i,n,r.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{ra(r,i)},10)})),i&&a&&go(i,a);let o=r.container.querySelector('[data-panel="scene-tools-corner"]'),s=o==null?void 0:o.querySelector("[data-panel-handle]");o&&s&&Ot(o,s,r.debugOverlay);let l=r.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ot(l,c,r.debugOverlay),Gi(r)}function la(r,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function ne(r,e,t,i,n){let a=e.querySelector(`#${t}`),o=e.querySelector(n);if(!a||!o)return;let s=ro(ke(),i);typeof s=="number"&&(a.value=String(s),o.textContent=String(s)),a.addEventListener("input",()=>{let l=Number(a.value);o.textContent=String(l),oo(ke(),i,l)})}X();var qi=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=Xe(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let p of n){let d=p.objectId||"Engine";a[d]||(a[d]=[]),a[d].push(p)}let o=localStorage.getItem("handler_last_applied"),s=o?new Date(parseInt(o)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1552
+ anchor: (${a}, ${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 ca(r,e){var d,u,g,f,h,m,b,y,v,S,x;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!r.container)return;let t=r.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(d=r.container.querySelector("#config-pos-x"))==null?void 0:d.value)!=null?u:0),n=Number((f=(g=r.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?f:0),a=Number((m=(h=r.container.querySelector("#config-scale"))==null?void 0:h.value)!=null?m:1),s=Number((y=(b=r.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),o=Number((S=(v=r.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?S:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:s,anchorY:o});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Je));l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:s,y:o}},{silent:e==null?void 0:e.silent});let c=Ot(r);la(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let p=window.applyEditableObjectConfig;if(typeof p=="function"){let w=(x=window.getEditableObjectConfig)==null?void 0:x.call(window,t);w?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),p(t,w)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function hs(r,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),Je));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([p,d])=>{var u;if(p)if(p.includes(".")){let g=p.split("."),f=c;for(let h=0;h<g.length-1;h++){let m=g[h];f[m]=(u=f[m])!=null?u:{},f=f[m]}f[g[g.length-1]]=d}else c[p]=d}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),s=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;s&&(o!=null&&o.refresh)&&o.refresh()}function fs(r){r.selectedObjectId&&(r.objectAutoApplyTimer&&window.clearTimeout(r.objectAutoApplyTimer),r.objectAutoApplyTimer=window.setTimeout(()=>{r.objectAutoApplyTimer=null,ca(r,{silent:!0})},150))}var al=3e3;function It(r,e,t){let i=t!=null?t:r.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,s=0,o=0,l=0,c=0,p=0,d=g=>{if(!n)return;let f=i.getBoundingClientRect();r.style.left=`${g.clientX-f.left-c}px`,r.style.top=`${g.clientY-f.top-p}px`},u=()=>{n&&(n=!1,r.classList.remove("dragging"),window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let f=g.target;if(f!=null&&f.closest("button, input, select, textarea"))return;g.preventDefault();let h=r.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",r.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:h.left,top:h.top,width:h.width,height:h.height}),console.log("[DRAG] containerRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-h.left,p=g.clientY-h.top,console.log("[DRAG] offset:",{x:c,y:p});let b=h.left-m.left,y=h.top-m.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),r.style.left=`${b}px`,r.style.top=`${y}px`,r.style.right="auto",r.style.bottom="auto",r.style.zIndex=String(++al),n=!0,r.classList.add("dragging"),window.addEventListener("pointermove",d),window.addEventListener("pointerup",u)})}function ms(r,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,s=0,o=0,l=0,c=!1,p=u=>{var y;if(!c)return;let g=u.clientX-o,f=u.clientY-l,h=Math.max(i,a+g),m=Math.max(n,s+f);r.style.width=`${h}px`,(y=r.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(r.style.height=`${m}px`),t==null||t(h,m)},d=()=>{c&&(c=!1,window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",d))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=r.getBoundingClientRect();a=g.width,s=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",p),window.addEventListener("pointerup",d)})}function da(r,e){var h,m,b,y;let t=(b=(m=(h=r.container)==null?void 0:h.querySelector("#debug-overlay"))!=null?m:r.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=r.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,s=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>s&&(e.style.width=`${s}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,p=l.top-i.top,d=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),d),f=Math.min(Math.max(p,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(f)}px`,e.style.right="auto",e.style.bottom="auto"}function it(r){var i,n;if(!r.container)return;let e=r.container.querySelector("#debug-workbench");if(!e)return;if(da(r,e),(i=r.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),s={activeTab:r.activeTab};if(a)try{s={...JSON.parse(a),activeTab:r.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(s));return}let t={activeTab:r.activeTab,width:e.style.width,height:(n=r.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function Wi(r){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(r.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=r.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let s=(a=r.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!s?i.style.height=t.height:s&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),da(r,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function pa(r,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",da(r,e),it(r))}function bs(r){var n,a,s;if(!r.container)return;let e=r.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=r.toggleDebug)==null||o.call(r)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=r.toggleDebug)==null?void 0:o.call(r,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>qi(r)),(s=e.querySelector("#debug-export"))==null||s.addEventListener("click",()=>Vi(r)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;r.activeTab=l,ua(r),it(r)})}),ha(r,e),ga(r,e)}function ua(r){if(!r.container)return;let e=r.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===r.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===r.activeTab)})}function ga(r,e){ne(r,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ne(r,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ne(r,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ne(r,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ne(r,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ne(r,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ne(r,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ne(r,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ne(r,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=Me();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),s=Me();s.layout&&(s.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function ys(r){if(!r.container||!r.debugOverlay)return;let e=r.container.querySelector("#debug-workbench"),t=r.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),It(e,t,r.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{it(r),pa(r,e)},10)}));let i=r.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),It(i,n,r.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{pa(r,i)},10)})),i&&a&&ms(i,a);let s=r.container.querySelector('[data-panel="scene-tools-corner"]'),o=s==null?void 0:s.querySelector("[data-panel-handle]");s&&o&&It(s,o,r.debugOverlay);let l=r.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&It(l,c,r.debugOverlay),Wi(r)}function ha(r,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function ne(r,e,t,i,n){let a=e.querySelector(`#${t}`),s=e.querySelector(n);if(!a||!s)return;let o=cs(Me(),i);typeof o=="number"&&(a.value=String(o),s.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);s.textContent=String(l),ds(Me(),i,l)})}K();var Yi=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=ye(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let p of n){let d=p.objectId||"Engine";a[d]||(a[d]=[]),a[d].push(p)}let s=localStorage.getItem("handler_last_applied"),o=s?new Date(parseInt(s)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1522
1553
  <div class="config-persistence-panel">
1523
1554
  <!-- Status Footer (Always Visible) -->
1524
1555
  <div class="persistence-status-footer">
@@ -1536,7 +1567,7 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1536
1567
  </div>
1537
1568
  <div class="status-footer-row">
1538
1569
  <span class="status-footer-label">Last Applied:</span>
1539
- <span class="status-footer-value">${s}</span>
1570
+ <span class="status-footer-value">${o}</span>
1540
1571
  </div>
1541
1572
  </div>
1542
1573
 
@@ -1670,17 +1701,17 @@ Generate the requested asset matching the brand style.${r.needsTransparency?" Ba
1670
1701
  <p class="info-hint"><strong>Version Switching:</strong> Always clears overrides and reloads from selected Source.</p>
1671
1702
  </div>
1672
1703
  </div>
1673
- `}formatValue(e){return e===null?"null":typeof e=="string"?e.length>25?e.substring(0,22)+"...":e:typeof e=="object"?"{...}":String(e)}setupEventListeners(){if(!this.container)return;let e=this.container.querySelector("#create-version-btn");e==null||e.addEventListener("click",async()=>{var g;if(e.getAttribute("disabled")!==null)return;if(!Xe().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
1704
+ `}formatValue(e){return e===null?"null":typeof e=="string"?e.length>25?e.substring(0,22)+"...":e:typeof e=="object"?"{...}":String(e)}setupEventListeners(){if(!this.container)return;let e=this.container.querySelector("#create-version-btn");e==null||e.addEventListener("click",async()=>{var g;if(e.getAttribute("disabled")!==null)return;if(!ye().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
1674
1705
 
1675
1706
  This will:
1676
1707
  \u2022 Create a new version snapshot
1677
1708
  \u2022 Include all current changes
1678
1709
  \u2022 Clear staged overrides after save
1679
- \u2022 Set the new version as active`))try{let f=localStorage.getItem("handler_last_version_name")||"",m=((g=prompt("Version name (e.g. v1.2.0, test_2024):",f))!=null?g:"").trim();if(!m){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",m),e.textContent="\u23F3 Creating version...",e.setAttribute("disabled","true"),await ri(m),ee(),this.showSuccessNotification("Version created and set as active"),await this.loadVersionsList(),this.refreshPanel()}catch(f){console.error("[ConfigPersistence] Create version failed:",f),alert(`\u274C Failed to create version: ${f.message}`),e.textContent="\u{1F4DD} SAVE AS NEW VERSION",e.removeAttribute("disabled")}});let t=this.container.querySelector("#apply-current-btn");t==null||t.addEventListener("click",async()=>{if(t.getAttribute("disabled")!==null)return;let d=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
1710
+ \u2022 Set the new version as active`))try{let f=localStorage.getItem("handler_last_version_name")||"",m=((g=prompt("Version name (e.g. v1.2.0, test_2024):",f))!=null?g:"").trim();if(!m){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",m),e.textContent="\u23F3 Creating version...",e.setAttribute("disabled","true"),await li(m),ee(),this.showSuccessNotification("Version created and set as active"),await this.loadVersionsList(),this.refreshPanel()}catch(f){console.error("[ConfigPersistence] Create version failed:",f),alert(`\u274C Failed to create version: ${f.message}`),e.textContent="\u{1F4DD} SAVE AS NEW VERSION",e.removeAttribute("disabled")}});let t=this.container.querySelector("#apply-current-btn");t==null||t.addEventListener("click",async()=>{if(t.getAttribute("disabled")!==null)return;let d=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
1680
1711
 
1681
1712
  This will write all staged changes to ${d}.
1682
1713
 
1683
- After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let g=ze(),f={};for(let[b,y]of Object.entries(g.objects)){let v=y,w=b;/^(json\.|ui\.|effects\.|engine\.)/.test(w)||(w=`json.${b}`),v&&typeof v=="object"&&(v.identity||(v.identity={}),v.identity.id=w),f[`objects/${w}.json`]=v}g.engine&&(g.engine.runtime&&(f["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(f["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(f["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(f["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(f["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(f["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(f["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(f["engine/engine.json"]=g.engine));for(let[b,y]of Object.entries(g.scenes)){let v=b.startsWith("scene.")?b:`scene.${b}`;f[`scenes/${v}.json`]=y}let h=this.currentVersion?"/api/apply-current":"/api/apply-direct",m=await fetch(h,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:f,assets:{},hadCacheAtApply:!0})});if(!m.ok){let b=await m.json();throw new Error(b.error||"Apply to current source failed")}ee(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Apply current failed:",g),alert(`\u274C Apply to current source failed: ${g.message}`),t.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1714
+ After applying, staged overrides will be cleared.`))try{t.textContent="\u23F3 Applying...",t.setAttribute("disabled","true");let g=$e(),f={};for(let[b,y]of Object.entries(g.objects)){let v=y,S=b;/^(json\.|ui\.|effects\.|engine\.)/.test(S)||(S=`json.${b}`),v&&typeof v=="object"&&(v.identity||(v.identity={}),v.identity.id=S),f[`objects/${S}.json`]=v}g.engine&&(g.engine.runtime&&(f["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(f["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(f["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(f["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(f["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(f["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(f["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(f["engine/engine.json"]=g.engine));for(let[b,y]of Object.entries(g.scenes)){let v=b.startsWith("scene.")?b:`scene.${b}`;f[`scenes/${v}.json`]=y}let h=this.currentVersion?"/api/apply-current":"/api/apply-direct",m=await fetch(h,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:f,assets:{},hadCacheAtApply:!0})});if(!m.ok){let b=await m.json();throw new Error(b.error||"Apply to current source failed")}ee(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Apply current failed:",g),alert(`\u274C Apply to current source failed: ${g.message}`),t.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-base-btn");i==null||i.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
1684
1715
 
1685
1716
  This will DIRECTLY MODIFY base configuration files.
1686
1717
 
@@ -1690,25 +1721,25 @@ This is ONLY for active development.
1690
1721
 
1691
1722
  Make sure your project is under Git version control.
1692
1723
 
1693
- Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let u=ze(),g={};for(let[h,m]of Object.entries(u.objects)){let b=m,y=h;/^(json\.|ui\.|effects\.|engine\.)/.test(y)||(y=`json.${h}`),b&&typeof b=="object"&&(b.identity||(b.identity={}),b.identity.id=y),g[`objects/${y}.json`]=b}u.engine&&(u.engine.runtime&&(g["engine/engine.runtime.json"]=u.engine.runtime),u.engine.assets&&(g["engine/engine.assets.json"]=u.engine.assets),u.engine.splash&&(g["engine/engine.splash.json"]=u.engine.splash),u.engine.loading&&(g["engine/engine.loading.json"]=u.engine.loading),u.engine.start&&(g["engine/engine.start.json"]=u.engine.start),u.engine.tutorial&&(g["engine/engine.tutorial.json"]=u.engine.tutorial),u.engine.endgame&&(g["engine/engine.endgame.json"]=u.engine.endgame),!u.engine.runtime&&!u.engine.assets&&(g["engine/engine.json"]=u.engine));for(let[h,m]of Object.entries(u.scenes)){let b=h.startsWith("scene.")?h:`scene.${h}`;g[`scenes/${b}.json`]=m}let f=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:g,assets:{}})});if(!f.ok){let h=await f.json();throw new Error(h.error||"Apply to base failed")}ee(),this.showSuccessNotification(),this.refreshPanel()}catch(u){console.error("[ConfigPersistence] Apply to base failed:",u),alert(`\u274C Apply to base failed: ${u.message}`),i.textContent="\u{1F527} APPLY TO BASE (No Version)",i.removeAttribute("disabled")}});let n=this.container.querySelector("#version-selector");n==null||n.addEventListener("change",async d=>{let g=d.target.value;await this.switchVersion(g)}),this.container.querySelectorAll(".item-remove").forEach(d=>{d.addEventListener("click",()=>{let u=d.dataset.removePath,g=d.dataset.removeId;ai(g||void 0,u)})});let o=this.container.querySelector("#clear-all-overrides"),s=this.container.querySelector("#discard-all-overrides-btn"),l=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(ee(),St(),this.refreshPanel())};o==null||o.addEventListener("click",l),s==null||s.addEventListener("click",l);let c=this.container.querySelector("#reset-to-applied-btn");c==null||c.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&St()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await oi()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
1724
+ Continue?`))try{i.textContent="\u23F3 Writing to base...",i.setAttribute("disabled","true");let u=$e(),g={};for(let[h,m]of Object.entries(u.objects)){let b=m,y=h;/^(json\.|ui\.|effects\.|engine\.)/.test(y)||(y=`json.${h}`),b&&typeof b=="object"&&(b.identity||(b.identity={}),b.identity.id=y),g[`objects/${y}.json`]=b}u.engine&&(u.engine.runtime&&(g["engine/engine.runtime.json"]=u.engine.runtime),u.engine.assets&&(g["engine/engine.assets.json"]=u.engine.assets),u.engine.splash&&(g["engine/engine.splash.json"]=u.engine.splash),u.engine.loading&&(g["engine/engine.loading.json"]=u.engine.loading),u.engine.start&&(g["engine/engine.start.json"]=u.engine.start),u.engine.tutorial&&(g["engine/engine.tutorial.json"]=u.engine.tutorial),u.engine.endgame&&(g["engine/engine.endgame.json"]=u.engine.endgame),!u.engine.runtime&&!u.engine.assets&&(g["engine/engine.json"]=u.engine));for(let[h,m]of Object.entries(u.scenes)){let b=h.startsWith("scene.")?h:`scene.${h}`;g[`scenes/${b}.json`]=m}let f=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:g,assets:{}})});if(!f.ok){let h=await f.json();throw new Error(h.error||"Apply to base failed")}ee(),this.showSuccessNotification(),this.refreshPanel()}catch(u){console.error("[ConfigPersistence] Apply to base failed:",u),alert(`\u274C Apply to base failed: ${u.message}`),i.textContent="\u{1F527} APPLY TO BASE (No Version)",i.removeAttribute("disabled")}});let n=this.container.querySelector("#version-selector");n==null||n.addEventListener("change",async d=>{let g=d.target.value;await this.switchVersion(g)}),this.container.querySelectorAll(".item-remove").forEach(d=>{d.addEventListener("click",()=>{let u=d.dataset.removePath,g=d.dataset.removeId;St(g||void 0,u)})});let s=this.container.querySelector("#clear-all-overrides"),o=this.container.querySelector("#discard-all-overrides-btn"),l=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(ee(),At(),this.refreshPanel())};s==null||s.addEventListener("click",l),o==null||o.addEventListener("click",l);let c=this.container.querySelector("#reset-to-applied-btn");c==null||c.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&At()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await ci()})}showSuccessNotification(e){let t=document.createElement("div");t.className="persistence-notification success";let i=e&&e.trim().length>0?e.trim():"Changes Applied!";t.innerHTML=`
1694
1725
  <div class="notify-icon">\u2705</div>
1695
1726
  <div class="notify-content">
1696
1727
  <strong>${i}</strong>
1697
1728
  <span>Project files updated.</span>
1698
1729
  </div>
1699
- `,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,o;let t=Xe();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
1730
+ `,document.body.appendChild(t),setTimeout(()=>{t.classList.add("out"),setTimeout(()=>t.remove(),500)},3e3)}refreshPanel(){if(!this.container)return;let e=this.container.querySelector(".config-persistence-panel");e?e.outerHTML=this.render():this.container.innerHTML=this.render(),this.setupEventListeners()}async loadVersionsList(){try{let e=await fetch("/api/versions");if(!e.ok)throw new Error("Failed to fetch versions");let t=await e.json();this.availableVersions=t.versions||[],this.currentVersion=t.current||null}catch(e){console.error("[ConfigPersistence] Failed to load versions:",e),this.availableVersions=[],this.currentVersion=null}}async switchVersion(e){var n,a,s;let t=ye();if(t.hasChanges){if(!confirm(`Switch to version "${e||"original"}"?
1700
1731
 
1701
1732
  You have ${t.overrideCount} staged changes that will be discarded.
1702
1733
 
1703
1734
  Options:
1704
1735
  OK = Discard staged overrides and switch
1705
- Cancel = Stay on current version`)){let l=(n=this.container)==null?void 0:n.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}}else if(!confirm(`Switch to version "${e||"original"}"?`)){let l=(a=this.container)==null?void 0:a.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}try{let s=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!s.ok){let l=await s.json();throw new Error(l.error||"Failed to switch version")}ee(),localStorage.removeItem("handler_config_overrides"),localStorage.setItem("handler_preview_override_mode","false"),window.location.reload()}catch(s){alert(`\u274C Failed to switch version: ${s.message}`);let l=(o=this.container)==null?void 0:o.querySelector("#version-selector");l&&(l.value=this.currentVersion||"")}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
1736
+ Cancel = Stay on current version`)){let l=(n=this.container)==null?void 0:n.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}}else if(!confirm(`Switch to version "${e||"original"}"?`)){let l=(a=this.container)==null?void 0:a.querySelector("#version-selector");l&&(l.value=this.currentVersion||"");return}try{let o=await fetch("/api/switch-version",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({versionName:e||null})});if(!o.ok){let l=await o.json();throw new Error(l.error||"Failed to switch version")}ee(),localStorage.removeItem("handler_config_overrides"),localStorage.setItem("handler_preview_override_mode","false"),window.location.reload()}catch(o){alert(`\u274C Failed to switch version: ${o.message}`);let l=(s=this.container)==null?void 0:s.querySelector("#version-selector");l&&(l.value=this.currentVersion||"")}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
1706
1737
 
1707
1738
  This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snapshot.
1708
1739
 
1709
1740
  This cannot be undone unless you have git commits or backups.
1710
1741
 
1711
- Are you absolutely sure?`))try{let t=ze(),i={};for(let[a,o]of Object.entries(t.objects)){let s=o,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),s&&typeof s=="object"&&(s.identity||(s.identity={}),s.identity.id=l),i[`objects/${l}.json`]=s}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[a,o]of Object.entries(t.scenes)){let s=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${s}.json`]=o}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Direct apply failed")}ee(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var It=class{constructor(){this.debugOverlay=null;this.isDebugOpen=!1;this.selectedObjectId=null;this.configViewer=null;this.container=null;this.objectAutoApplyTimer=null;this.objectDebugRaf=null;this.objectBoundsGfx=null;this.objectAnchorGfx=null;this.highlightObject=!1;this.highlightAnchor=!1;this.activeTab="hierarchy";this.sceneObjectsPanel=new bi;this.sceneToolsPanel=new yi;this.nudgePanel=new vi;this.inspectorPanel=new Ii;this.libraryPanel=new Tt;this.libraryPanelDocked=new Tt;this.brandVisionPanel=new zi;this.customizeSettingsPanel=new $i;this.configPersistencePanel=new qi;this.loadingScreenPanel=new Di}applyAssetChange(e,t){return Xr(this,e,t)}resetAsset(e){return Jr(this,e)}applySlotAsset(e,t,i){return Zr(this,e,t,i)}resetSlotAsset(e,t,i){return Qr(this,e,t,i)}startObjectVisuals(){return no(this)}stopObjectVisuals(){return ao(this)}shouldRunObjectVisuals(){return Hi(this)}updateObjectVisuals(){return Ni(this)}getSelectedInstanceId(){return Vn(this)}getDisplayObjectById(e){return Wn(this,e)}getSelectedObjectConfig(){return _t(this)}getConfigAnchorWorldPoint(e){return Yn(this,e)}getScreenSize(){return Kn(this)}ensureBoundsGfx(){return Xn(this)}ensureAnchorGfx(){return Jn(this)}drawBounds(e){return Zn(this,e)}drawAnchor(e){return Qn(this,e)}clearBounds(){return ea(this)}clearAnchor(){return ta(this)}clearObjectVisuals(){return Pt(this)}updateObjectInfo(e){return kt(this,e)}resetDebugConfig(){return Bi(this)}applyDebugConfig(){return so(this)}exportDebugConfig(){return Ui(this)}loadObjectConfig(e){return lo(this,e)}fillConfigViewer(e){return Fi(this,e)}copyConfigValues(){return co(this)}applyObjectConfig(e){return na(this,e)}applyCustomizeSettings(e,t){return po(this,e,t)}scheduleObjectAutoApply(){return uo(this)}setupDebugEventListeners(){return ho(this)}setupDebugInputListeners(e){return sa(this,e)}setupPanelLayout(){return fo(this)}setupCollapsiblePanels(e){return la(this,e)}setupRangeInput(e,t,i,n){return ne(this,e,t,i,n)}updateWorkbenchTabs(){return oa(this)}saveWorkbenchState(){return it(this)}loadWorkbenchState(){return Gi(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let a=localStorage.getItem("preview_workbench_state");if(a){let o=JSON.parse(a);o.activeTab&&(this.activeTab=o.activeTab)}}catch(a){console.warn("[PREVIEW] Failed to load workbench tab state",a)}this.sceneObjectsPanel.initialize(e,{onSelect:a=>this.handleObjectSelect(a)}),this.libraryPanel.initialize(e,{onApply:(a,o,s)=>this.applySlotAsset(a,o,s),onReset:(a,o,s)=>this.resetSlotAsset(a,o,s)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,o,s)=>this.applySlotAsset(a,o,s),onReset:(a,o,s)=>this.resetSlotAsset(a,o,s)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,o,s)=>{console.log("[Inspector] Property changed:",a,o,s)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,o)=>this.applyCustomizeSettings(a,o)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:a=>{this.highlightObject=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:a=>{this.highlightAnchor=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(a,o)=>this.nudgeSelectedObject(a,o),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,o)=>{var g,f,h,m,b,y;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let l=(g=s.transform)==null?void 0:g.position,c=((f=l==null?void 0:l.x)!=null?f:0)+a,p=((h=l==null?void 0:l.y)!=null?h:0)+o,{applyConfigOverride:d}=await Promise.resolve().then(()=>(X(),Je));d({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:p}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let v=window.__editableConfig,w=(y=(b=(m=v==null?void 0:v.objects)==null?void 0:m.get)==null?void 0:b.call(m,this.selectedObjectId))!=null?y:s;await u(this.selectedObjectId,w)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var d,u,g,f,h;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let s=(u=(d=o.transform)==null?void 0:d.scale)!=null?u:1,l=Math.max(.1,s+a),{applyConfigOverride:c}=await Promise.resolve().then(()=>(X(),Je));c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let p=window.applyEditableObjectConfig;if(typeof p=="function"){let m=window.__editableConfig,b=(h=(f=(g=m==null?void 0:m.objects)==null?void 0:g.get)==null?void 0:f.call(g,this.selectedObjectId))!=null?h:o;await p(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let a=window;typeof a.__previewShowLoading=="function"?a.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let a=window;typeof a.__previewHideLoading=="function"?a.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:a=>{let o=window;typeof o.applyEditableEngineConfig=="function"&&o.applyEditableEngineConfig({loading:a}),typeof o.__previewUpdateLoading=="function"?o.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,o,s,l)=>{this.customizeSettingsPanel.openAiEditor(a,o,s,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var o,s;((o=a.detail)==null?void 0:o.action)!=="remove"&&((s=a.detail)==null?void 0:s.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,o,s)=>this.applySlotAsset(a,o,s),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var o;let a=window.getActiveConfig;if(typeof a=="function"){let s=a();return((o=s==null?void 0:s.engine)==null?void 0:o.splash)||null}return null},window.addAssetToRegistry=(a,o)=>{let s=window.getEditableAssets;if(typeof s=="function"){let l=s();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(p=>p.filename===o))){let p=o.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:o,displayName:p}),console.log(`[DEBUG] Added ${o} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,o)=>{this.libraryPanel.highlightSlot(a,o)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
1742
+ Are you absolutely sure?`))try{let t=$e(),i={};for(let[a,s]of Object.entries(t.objects)){let o=s,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[a,s]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=s}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Direct apply failed")}ee(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var jt=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 wi;this.sceneToolsPanel=new xi;this.nudgePanel=new Ei;this.inspectorPanel=new zi;this.libraryPanel=new Lt;this.libraryPanelDocked=new Lt;this.brandVisionPanel=new Hi;this.customizeSettingsPanel=new Ni;this.configPersistencePanel=new Yi;this.loadingScreenPanel=new Fi}applyAssetChange(e,t){return es(this,e,t)}resetAsset(e){return ts(this,e)}applySlotAsset(e,t,i){return is(this,e,t,i)}resetSlotAsset(e,t,i){return ns(this,e,t,i)}startObjectVisuals(){return os(this)}stopObjectVisuals(){return ls(this)}shouldRunObjectVisuals(){return Bi(this)}updateObjectVisuals(){return Ui(this)}getSelectedInstanceId(){return Zn(this)}getDisplayObjectById(e){return Qn(this,e)}getSelectedObjectConfig(){return Ot(this)}getConfigAnchorWorldPoint(e){return ea(this,e)}getScreenSize(){return ta(this)}ensureBoundsGfx(){return ia(this)}ensureAnchorGfx(){return na(this)}drawBounds(e){return aa(this,e)}drawAnchor(e){return ra(this,e)}clearBounds(){return sa(this)}clearAnchor(){return oa(this)}clearObjectVisuals(){return Pt(this)}updateObjectInfo(e){return Mt(this,e)}resetDebugConfig(){return qi(this)}applyDebugConfig(){return ps(this)}exportDebugConfig(){return Vi(this)}loadObjectConfig(e){return us(this,e)}fillConfigViewer(e){return Gi(this,e)}copyConfigValues(){return gs(this)}applyObjectConfig(e){return ca(this,e)}applyCustomizeSettings(e,t){return hs(this,e,t)}scheduleObjectAutoApply(){return fs(this)}setupDebugEventListeners(){return bs(this)}setupDebugInputListeners(e){return ga(this,e)}setupPanelLayout(){return ys(this)}setupCollapsiblePanels(e){return ha(this,e)}setupRangeInput(e,t,i,n){return ne(this,e,t,i,n)}updateWorkbenchTabs(){return ua(this)}saveWorkbenchState(){return it(this)}loadWorkbenchState(){return Wi(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let a=localStorage.getItem("preview_workbench_state");if(a){let s=JSON.parse(a);s.activeTab&&(this.activeTab=s.activeTab)}}catch(a){console.warn("[PREVIEW] Failed to load workbench tab state",a)}this.sceneObjectsPanel.initialize(e,{onSelect:a=>this.handleObjectSelect(a)}),this.libraryPanel.initialize(e,{onApply:(a,s,o)=>this.applySlotAsset(a,s,o),onReset:(a,s,o)=>this.resetSlotAsset(a,s,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,s,o)=>this.applySlotAsset(a,s,o),onReset:(a,s,o)=>this.resetSlotAsset(a,s,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,s,o)=>{console.log("[Inspector] Property changed:",a,s,o)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,s)=>this.applyCustomizeSettings(a,s)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:a=>{this.highlightObject=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:a=>{this.highlightAnchor=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(a,s)=>this.nudgeSelectedObject(a,s),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,s)=>{var g,f,h,m,b,y;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((f=l==null?void 0:l.x)!=null?f:0)+a,p=((h=l==null?void 0:l.y)!=null?h:0)+s,{applyConfigOverride:d}=await Promise.resolve().then(()=>(K(),Je));d({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:p}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let v=window.__editableConfig,S=(y=(b=(m=v==null?void 0:v.objects)==null?void 0:m.get)==null?void 0:b.call(m,this.selectedObjectId))!=null?y:o;await u(this.selectedObjectId,S)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var d,u,g,f,h;if(!this.selectedObjectId)return;let s=this.getSelectedObjectConfig();if(!s)return;let o=(u=(d=s.transform)==null?void 0:d.scale)!=null?u:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await Promise.resolve().then(()=>(K(),Je));c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let p=window.applyEditableObjectConfig;if(typeof p=="function"){let m=window.__editableConfig,b=(h=(f=(g=m==null?void 0:m.objects)==null?void 0:g.get)==null?void 0:f.call(g,this.selectedObjectId))!=null?h:s;await p(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let a=window;typeof a.__previewShowLoading=="function"?a.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let a=window;typeof a.__previewHideLoading=="function"?a.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:a=>{let s=window;typeof s.applyEditableEngineConfig=="function"&&s.applyEditableEngineConfig({loading:a}),typeof s.__previewUpdateLoading=="function"?s.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,s,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,s,o,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var s,o;((s=a.detail)==null?void 0:s.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,s,o)=>this.applySlotAsset(a,s,o),window.refreshAssetLibrary=()=>this.libraryPanel.refresh(),window.reRenderAssetLibrary=()=>this.libraryPanel.reRender(),window.getEngineSplashConfig=()=>{var s;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((s=o==null?void 0:o.engine)==null?void 0:s.splash)||null}return null},window.addAssetToRegistry=(a,s)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(p=>p.filename===s))){let p=s.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:s,displayName:p}),console.log(`[DEBUG] Added ${s} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,s)=>{this.libraryPanel.highlightSlot(a,s)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
1712
1743
  <div class="debug-overlay hidden" id="debug-overlay">
1713
1744
  <div class="debug-workbench" id="debug-workbench">
1714
1745
  <div class="workbench-header" id="workbench-handle">
@@ -1755,7 +1786,7 @@ Are you absolutely sure?`))try{let t=ze(),i={};for(let[a,o]of Object.entries(t.o
1755
1786
  ${this.sceneToolsPanel.render()}
1756
1787
  ${this.nudgePanel.render()}
1757
1788
  </div>
1758
- `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}nudgeSelectedObject(e,t){var p,d,u;if(!this.selectedObjectId||!this.container)return;let i=this.nudgePanel.getNudgeStep(),n=this.container.querySelector("#config-pos-x"),a=this.container.querySelector("#config-pos-y");if(!n||!a)return;let o=Number((p=n.value)!=null?p:0),s=Number((d=a.value)!=null?d:0),l=o+e*i,c=s+t*i;n&&(n.value=String(l)),a&&(a.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function nl(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function al(r){var n;let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function rl(r){return`
1789
+ `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals()}nudgeSelectedObject(e,t){var p,d,u;if(!this.selectedObjectId||!this.container)return;let i=this.nudgePanel.getNudgeStep(),n=this.container.querySelector("#config-pos-x"),a=this.container.querySelector("#config-pos-y");if(!n||!a)return;let s=Number((p=n.value)!=null?p:0),o=Number((d=a.value)!=null?d:0),l=s+e*i,c=o+t*i;n&&(n.value=String(l)),a&&(a.value=String(c)),(u=this.configViewer)==null||u.style.setProperty("display","block"),this.scheduleObjectAutoApply()}};function rl(r){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(r)})}function sl(r){var n;let[e,t]=r.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function ol(r){return`
1759
1790
  Analyze these screenshots of a brand or game and extract its "Brand DNA".
1760
1791
 
1761
1792
  Provide a concise summary (2-3 sentences) covering:
@@ -1772,9 +1803,9 @@ Palette: [#RRGGBB, #RRGGBB, ...]
1772
1803
  ${r?`
1773
1804
  ADDITIONAL RULES/NOTES:
1774
1805
  ${r}`:""}
1775
- `.trim()}function mo(){let r=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let o=await nl(a),s=al(o),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:s.base64,mimeType:s.mimeType,dataUrl:o};r.push(l),n.push(l)}return n},getSources(){return r.slice()},async analyze(i,n,a){if(r.length===0)throw new Error("No screenshots to analyze.");let o=rl(n),s=r.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await Ri(i,o,s,{model:a}),c=e,p=[],d=l.split(`
1806
+ `.trim()}function vs(){let r=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let s=await rl(a),o=sl(s),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:o.base64,mimeType:o.mimeType,dataUrl:s};r.push(l),n.push(l)}return n},getSources(){return r.slice()},async analyze(i,n,a){if(r.length===0)throw new Error("No screenshots to analyze.");let s=ol(n),o=r.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await Di(i,s,o,{model:a}),c=e,p=[],d=l.split(`
1776
1807
  `);for(let u of d)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let g=u.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(f=>{p.includes(f.toUpperCase())||p.push(f.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
1777
- Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Ne="handler_api_key_";var nt=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${Ne}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Ne}${e}`,i=localStorage.getItem(t);if(!i)return null;let n=JSON.parse(i);return n.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(n)),this.decryptKey(n.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${Ne}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Ne}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);if(i&&i.startsWith(Ne)){let n=i.substring(Ne.length),a=localStorage.getItem(i);if(a){let o=JSON.parse(a);e.push({service:n,label:o.label,created:o.created,lastUsed:o.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(Ne)&&e.push(i)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let i="handler_preview_salt_2024"+e;return btoa(i)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),i="handler_preview_salt_2024";return t.startsWith(i)?t.substring(i.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},ca=()=>nt.getKey("gemini"),da=(r,e)=>nt.setKey("gemini",r,e),ol=()=>nt.hasKey("gemini");window.ApiKeyStorage=nt;window.getGeminiApiKey=ca;window.setGeminiApiKey=da;window.hasGeminiApiKey=ol;var ua=class{constructor(){this.modal=null;this.options=null;this.analyzer=mo();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
1808
+ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var Fe="handler_api_key_";var nt=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${Fe}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${Fe}${e}`,i=localStorage.getItem(t);if(!i)return null;let n=JSON.parse(i);return n.lastUsed=Date.now(),localStorage.setItem(t,JSON.stringify(n)),this.decryptKey(n.key)}catch(t){return console.error("[ApiKeyStorage] Failed to retrieve API key:",t),null}}static hasKey(e){let t=`${Fe}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${Fe}${e}`;localStorage.removeItem(t)}catch(t){console.error("[ApiKeyStorage] Failed to remove API key:",t)}}static getStoredServices(){let e=[];try{for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);if(i&&i.startsWith(Fe)){let n=i.substring(Fe.length),a=localStorage.getItem(i);if(a){let s=JSON.parse(a);e.push({service:n,label:s.label,created:s.created,lastUsed:s.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(Fe)&&e.push(i)}e.forEach(t=>localStorage.removeItem(t))}catch(e){console.error("[ApiKeyStorage] Failed to clear API keys:",e)}}static encryptKey(e){try{let i="handler_preview_salt_2024"+e;return btoa(i)}catch(t){return console.warn("[ApiKeyStorage] Encryption failed, storing as-is:",t),e}}static decryptKey(e){try{let t=atob(e),i="handler_preview_salt_2024";return t.startsWith(i)?t.substring(i.length):t}catch(t){return console.warn("[ApiKeyStorage] Decryption failed, returning as-is:",t),e}}},fa=()=>nt.getKey("gemini"),ma=(r,e)=>nt.setKey("gemini",r,e),ll=()=>nt.hasKey("gemini");window.ApiKeyStorage=nt;window.getGeminiApiKey=fa;window.setGeminiApiKey=ma;window.hasGeminiApiKey=ll;var ya=class{constructor(){this.modal=null;this.options=null;this.analyzer=vs();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
1778
1809
  <div class="ai-modal-card">
1779
1810
  <div class="ai-modal-header">
1780
1811
  <div class="ai-modal-actions">
@@ -1853,14 +1884,14 @@ Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:p.slice(0
1853
1884
  <button class="ai-btn primary" data-action="apply" disabled>Apply</button>
1854
1885
  </div>
1855
1886
  </div>
1856
- `,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var n;this.currentPrompt=((n=this.promptInput)==null?void 0:n.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",n=>{var s;let a=n.target;switch(a.dataset.action||((s=a.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",n=>{let a=n.target;if(a.classList.contains("ai-gallery-item")||a.closest(".ai-gallery-item")){let o=a.closest(".ai-gallery-item"),s=parseInt(o.dataset.index||"-1");s>=0&&this.selectImage(s)}}),this.modal.addEventListener("click",n=>{n.target===this.modal&&this.close()}),this.updateGenerateButton()}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var t;let e=(t=this.modal)==null?void 0:t.querySelector("#ai-use-dna");if(e!=null&&e.checked)try{let i=this.analyzer.getResult();if(i!=null&&i.summary&&this.promptInput){let n=`${this.currentPrompt}
1887
+ `,this.modal=e,this.attachEventListeners(),this.updatePromptFromDna()}attachEventListeners(){var i;if(!this.modal)return;this.promptInput=this.modal.querySelector(".ai-textarea"),this.generateBtn=this.modal.querySelector('[data-action="generate"]'),this.loadingEl=this.modal.querySelector("[data-loading]"),this.galleryEl=this.modal.querySelector("[data-gallery]"),this.previewEl=this.modal.querySelector("[data-preview]"),(i=this.promptInput)==null||i.addEventListener("input",()=>{var n;this.currentPrompt=((n=this.promptInput)==null?void 0:n.value)||"",this.updateGenerateButton()});let e=this.modal.querySelector('[data-strength="creativity"]'),t=this.modal.querySelector(".ai-strength-value");e==null||e.addEventListener("input",()=>{t.textContent=e.value}),this.modal.addEventListener("click",n=>{var o;let a=n.target;switch(a.dataset.action||((o=a.closest("[data-action]"))==null?void 0:o.getAttribute("data-action"))){case"generate":this.generateImage();break;case"apply":this.applySelectedImage();break;case"gallery":this.toggleGallery();break;case"close":case"cancel":this.close();break}}),this.modal.addEventListener("click",n=>{let a=n.target;if(a.classList.contains("ai-gallery-item")||a.closest(".ai-gallery-item")){let s=a.closest(".ai-gallery-item"),o=parseInt(s.dataset.index||"-1");o>=0&&this.selectImage(o)}}),this.modal.addEventListener("click",n=>{n.target===this.modal&&this.close()}),this.updateGenerateButton()}updateGenerateButton(){if(!this.generateBtn)return;let e=this.currentPrompt.trim().length>0;this.generateBtn.disabled=!e||this.isGenerating}async updatePromptFromDna(){var t;let e=(t=this.modal)==null?void 0:t.querySelector("#ai-use-dna");if(e!=null&&e.checked)try{let i=this.analyzer.getResult();if(i!=null&&i.summary&&this.promptInput){let n=`${this.currentPrompt}
1857
1888
 
1858
- Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let a=this.getApiKey();if(!a){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let o=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await ji(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(a,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(a){console.error("[AiEditorModal] Generation failed:",a),alert(`Generation failed: ${a instanceof Error?a.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(n=this.previewEl)==null||n.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,i)=>`
1889
+ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}catch(i){console.warn("[AiEditorModal] Failed to apply brand DNA:",i)}}async generateImage(){var e,t,i,n;if(!(!this.options||this.isGenerating)){this.isGenerating=!0,this.updateGenerateButton(),(e=this.loadingEl)==null||e.classList.remove("hidden"),(t=this.previewEl)==null||t.classList.add("hidden");try{let a=this.getApiKey();if(!a){alert("Please set your Gemini API key first. You can do this in the AI Creative Suite panel.");return}let s=[];if(this.options.currentValue&&this.options.currentValue.startsWith("data:"))try{let c=await $i(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(a,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(a){console.error("[AiEditorModal] Generation failed:",a),alert(`Generation failed: ${a instanceof Error?a.message:"Unknown error"}`)}finally{this.isGenerating=!1,(i=this.loadingEl)==null||i.classList.add("hidden"),(n=this.previewEl)==null||n.classList.remove("hidden"),this.updateGenerateButton()}}}updateGallery(){if(!this.galleryEl)return;let e=this.galleryEl.querySelector("[data-gallery-grid]");e&&(e.innerHTML=this.generatedImages.map((t,i)=>`
1859
1890
  <div class="ai-gallery-item ${i===this.selectedImageIndex?"active":""}" data-index="${i}">
1860
1891
  <img class="ai-gallery-thumb" src="${t}" alt="Generated ${i+1}" />
1861
1892
  <div class="ai-gallery-label">#${i+1}</div>
1862
1893
  </div>
1863
- `).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=ca();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return da(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}},pa=null;window.__openAiEditor=function(r,e,t,i){pa||(pa=new ua),pa.open({objectId:r,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let a=window.updateManager;if(a)a.updateProperty(r,i.path,n);else{let o=window.getEditableObjectConfig,s=o==null?void 0:o(r);if(s){let l=i.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]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};ha();var fa=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1894
+ `).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=fa();if(e)return e;try{let t=this.analyzer.getResult();if(t&&t.apiKey)return ma(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}},ba=null;window.__openAiEditor=function(r,e,t,i){ba||(ba=new ya),ba.open({objectId:r,initialPrompt:e,currentValue:t,path:i==null?void 0:i.path,onApply:n=>{if(i!=null&&i.path){let a=window.updateManager;if(a)a.updateProperty(r,i.path,n);else{let s=window.getEditableObjectConfig,o=s==null?void 0:s(r);if(o){let l=i.path.split("."),c=o;for(let p=0;p<l.length-1;p++)c[l[p]]||(c[l[p]]={}),c=c[l[p]];c[l[l.length-1]]=n}}}window.dispatchEvent(new CustomEvent("inspector:refresh"))}})};wa();var xa=class{constructor(){this.modal=null;this.options=null}open(e){this.options=e,this.createModal(),document.body.appendChild(this.modal)}createModal(){if(!this.options)return;let{assetPath:e,assetType:t,objectId:i}=this.options,n=i||"Asset Preview",a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1864
1895
  <div class="asset-preview-card">
1865
1896
  <div class="asset-preview-header">
1866
1897
  <div class="asset-preview-title">${n}</div>
@@ -1887,7 +1918,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1887
1918
  <source src="${n}" type="audio/wav">
1888
1919
  Your browser does not support the audio element.
1889
1920
  </audio>
1890
- `;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&Promise.resolve().then(()=>(ha(),bo)).then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(r){new fa().open(r)};var ma=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=`
1921
+ `;case"text":return`<pre style="background: rgba(0,0,0,0.2); padding: 16px; border-radius: 8px; max-height: 300px; overflow-y: auto; white-space: pre-wrap;">${e}</pre>`;default:return`<div class="asset-preview-placeholder">Cannot preview ${t} assets</div>`}}resolveAssetUrl(e){return e.startsWith("data:")||e.startsWith("blob:")||e.startsWith("/")?e:`/raw/${e}`}attachEventListeners(){if(!this.modal)return;this.modal.addEventListener("click",i=>{let n=i.target;(n.dataset.action==="close"||n===this.modal)&&this.close()});let e=this.modal.querySelector('[data-action="change"]');e&&e.addEventListener("click",()=>{this.openAssetEditor()});let t=this.modal.querySelector('[data-action="edit"]');t&&t.addEventListener("click",()=>{this.openAiEditor(),this.close()})}openAssetEditor(){this.options&&Promise.resolve().then(()=>(wa(),ws)).then(({AssetEditorModal:e})=>{new e().show(this.options.objectId||"unknown",this.options.propertyPath||"",this.options.assetPath,i=>{var n;(n=this.options)!=null&&n.onChange&&this.options.onChange(i),this.close()})})}openAiEditor(){if(!this.options||this.options.assetType!=="image")return;let e=window.__openAiEditor;typeof e=="function"&&e(this.options.objectId||"asset","Edit this image asset",this.options.assetPath,{path:this.options.propertyPath,onApply:t=>{var i;(i=this.options)!=null&&i.onChange&&this.options.onChange(t)}})}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal),this.modal=null,this.options=null}};window.openAssetPreview=function(r){new xa().open(r)};var Ea=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=`
1891
1922
  <div class="asset-crop-card">
1892
1923
  <div class="asset-crop-header">
1893
1924
  <div>
@@ -1938,7 +1969,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1938
1969
  <button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
1939
1970
  </div>
1940
1971
  </div>
1941
- `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([s,l])=>{var c;(c=this.ctx)==null||c.fillRect(s,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,o=Math.min(n,a),s=this.cropWidth*o,l=this.cropHeight*o,c=(i-s)/2,p=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,p,s,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(r){new ma().open(r)};var Vi=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[He("playable-portrait"),He("iphone-14"),He("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=He(e.defaultDevice||ui.id),this.debugPanel=new It,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=He(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=s=>{let l=s.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},o=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",s=>{s.preventDefault(),i=s.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",o),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,o=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,p=Math.max(200,Math.min(600,a+c));e.style.width=`${p}px`;let d=this.container.querySelector(".preview-main");if(d){let g=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${g} 1fr ${f}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},s=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",s),e.classList.add("resizing")})}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
1972
+ `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,s=Math.min(n,a),o=this.cropWidth*s,l=this.cropHeight*s,c=(i-o)/2,p=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,p,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(r){new Ea().open(r)};K();var Ki=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";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.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=Ne(e.defaultDevice||fi.id),this.debugPanel=new jt,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.autoScale*this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=Ne(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:i}),t.suppressCallback||(a=(n=this.options).onDeviceChange)==null||a.call(n,this.getEffectivePreset()),this.emitScreenChange()}setTheme(e){e==="dark"?this.container.classList.add("theme-dark"):this.container.classList.remove("theme-dark"),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let p=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:p})},s=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",s),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",s),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,s=l=>{let c=i==="left"?l.clientX-n:n-l.clientX,p=Math.max(200,Math.min(600,a+c));e.style.width=`${p}px`;let d=this.container.querySelector(".preview-main");if(d){let g=i==="left"?`${p}px`:d.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${p}px`:d.style.gridTemplateColumns.split(" ")[2]||"350px";d.style.gridTemplateColumns=`${g} 1fr ${f}`}let u=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:u})},o=()=>{document.removeEventListener("pointermove",s),document.removeEventListener("pointerup",o),e.classList.remove("resizing")};t.addEventListener("pointerdown",l=>{l.preventDefault(),n=l.clientX,a=e.offsetWidth,document.addEventListener("pointermove",s),document.addEventListener("pointerup",o),e.classList.add("resizing")})}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
1942
1973
  <div class="preview-toolbar">
1943
1974
  <div class="preview-toolbar-left">
1944
1975
  <span class="preview-logo">PREVIEWER</span>
@@ -1947,7 +1978,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
1947
1978
  <div class="preview-toolbar-center">
1948
1979
  <div class="device-selector-wrapper">
1949
1980
  <select class="device-dropdown" id="device-select">
1950
- ${$n.map(i=>`
1981
+ ${Un.map(i=>`
1951
1982
  <optgroup label="${i.label}">
1952
1983
  ${i.devices.map(n=>`
1953
1984
  <option value="${n.id}" ${n.id===this.currentPreset.id?"selected":""}>
@@ -2099,7 +2130,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2099
2130
  </div>
2100
2131
 
2101
2132
  </div>
2102
- `,this.setupEventListeners(e),e}setupEventListeners(e){var g,f,h,m,b,y,v,w;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",A=>{if(this.viewMode==="compare")return;let L=A.target.value;this.setDevice(L)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",A=>{let L=A.target.value;this.setTheme(L)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(A=>{A.addEventListener("click",()=>{let L=A.dataset.viewToggle;L&&this.setViewMode(L)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(A=>{A.addEventListener("click",()=>{let L=A.dataset.layoutToggle;L&&this.setLayoutMode(L)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(h=e.querySelector("#zoom-out-btn"))==null||h.addEventListener("click",()=>this.adjustUserZoom(-.1)),(m=e.querySelector("#refresh-btn"))==null||m.addEventListener("click",()=>this.refresh());let o=e.querySelector("#bottom-dock"),s=e.querySelector("#bottom-dock-resize");o&&s&&this.makeBottomDockResizable(o,s);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(A=>{A.addEventListener("click",()=>{let L=A.dataset.dockTab;if(!L)return;l.forEach(x=>x.classList.remove("active")),A.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(x=>{let _=x.dataset.dockPanel;x.classList.toggle("active",_===L)})})}),(b=e.querySelector("#console-clear"))==null||b.addEventListener("click",()=>this.clearConsole()),(y=e.querySelector("#corner-zoom-in-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(.1)),(v=e.querySelector("#corner-zoom-out-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(-.1)),(w=e.querySelector("#corner-grab-btn"))==null||w.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),p=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&p&&this.makeSidebarResizable(c,p,"left");let d=e.querySelector(".debug-workbench"),u=d==null?void 0:d.querySelector("#workbench-resize-v");d&&u&&this.makeSidebarResizable(d,u,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let o=n/t.width,s=a/t.height;if(this.autoScale=Math.max(.01,Math.min(o,s)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(o=>typeof o=="object"?this.safeStringify(o):String(o)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let o=this.consoleMessages.filter(s=>s.type==="error").length;a.textContent=o>0?`${o}!`:"0",a.classList.toggle("has-errors",o>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let a=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]");!a||!o||!s||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:o,wrapper:s,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,o;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((s,l)=>{s.root.classList.toggle("is-active",l===e),s.ghost.classList.toggle("hidden",l===e),s.focus&&(s.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(o=(a=this.options).onDeviceChange)==null||o.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,o=n/e.preset.height,s=Math.max(.01,Math.min(a,o));e.wrapper.style.transform=`scale(${s})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,o=t.canvas.height,s=Math.min(a/i.width,o/i.height),l=i.width*s,c=i.height*s,p=(a-l)/2,d=(o-c)/2;n.clearRect(0,0,a,o),n.drawImage(i,p,d,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function ba(r={}){let e=new Vi(r);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}X();function ya(r){try{if(r&&typeof r.keys=="function")return Array.from(r.keys())}catch{}return[]}function yo(r){var e;return r?((e=r.getDisplayObject)==null?void 0:e.call(r))||r.pixiObject||r:null}function sl(r,e){if(!r||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);r.eventMode=i?"static":"none",r.interactive=i,i&&(r.cursor=t.draggable?"move":"pointer")}function vo(r,e){var l,c,p;if(!r||!e)return;let t=e.transform||{};sl(r,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),o=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=r.position)!=null&&l.set?r.position.set(a,o):(typeof r.x=="number"&&(r.x=a),typeof r.y=="number"&&(r.y=o)),typeof t.scale=="number"&&((c=r.scale)!=null&&c.set?r.scale.set(t.scale):r.scale&&(r.scale.x=t.scale,r.scale.y=t.scale));let s=t.anchor;if(s&&((p=r.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"&&r.anchor.set(d.x,d.y)}}function wo(r){if(typeof window=="undefined")return;let e=r==null?void 0:r.objects,t=ya(e),i=a=>{try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return a;let s=window.__HANDLER_SCREEN_INDEX,l=s==null?void 0:s.instanceToScreen;return l?a.filter(c=>l[c]===o):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>wo(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(ya((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return ya((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var p,d,u,g,f;let o=(g=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,a))!=null?g:null,s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return o;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[a];return c&&c===s?o:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let o={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(o.assets||{})),o}return a}}function ll(){if(typeof window=="undefined")return;let r=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,o,s;let n=r(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(Ke(),hr))]),p=Date.now(),d=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let f=window.gameObjectManager,h=(o=f==null?void 0:f.get)==null?void 0:o.call(f,t);if(h){let m=((s=h.getDisplayObject)==null?void 0:s.call(h))||h.pixiObject||h.pixi||h;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ce(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Ce(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,o]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:o});if(t.assets)for(let[a,o]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:o}),typeof o=="string"&&e(a,o);if(t.splash)for(let[a,o]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:o});if(t.loading)for(let[a,o]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:o});if(t.start)for(let[a,o]of Object.entries(t.start))n.push({path:`start.${a}`,value:o});n.length&&Ce(n,{silent:!0,persist:!0,emitEvent:!0})}}function Wi(r){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=r;t&&(t.onObjectRebuildRequired=async(a,o)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let s=t.get(a),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(a):l&&l.destroy();let d=window.gameApp,u=await Se.create(a,o,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(ll(),window.applyEditableObjectConfig=(a,o)=>{var s,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let p=window.__editableConfig;(s=p==null?void 0:p.objects)!=null&&s.set&&(p.objects.set(a,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,a);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(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=yo(d);vo(u,o)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(a,o){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let s=e();(p=s==null?void 0:s.objects)!=null&&p.set&&(s.objects.set(a,o),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(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=yo(l);vo(u,o)}let c=[a];i==null||i(a,o,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,wo(a))}};return n.rebuildIndexes(),n}X();var So=qe(require("lottie-web"),1);gn(pn);typeof window!="undefined"&&!window.lottie&&(window.lottie=So.default);var at=null,cl=async()=>{if(!at){let r=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(r==null?void 0:r["handler.config"])||(r==null?void 0:r["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);at=JSON.parse(i)}else at=JSON.parse(e);return at}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}at=await(await fetch("./handler.config.json")).json()}return at},Ea,Rt,Ao,rt,wa,xa;function dl(r){Ea=r.initGame,Rt=r.CustomAssets,Ao=r.updateScreenState,rt=r.globalResponsiveMultipliers,wa=r.layout,xa=r.clearResponsiveElements}var Yi="web_embed",jt="https://example.com",xo={profile_id:Yi},Pe=null,le=null,va={width:0,height:0},pl=!0,ul=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let r=await cl();xo={...r.ids||{},profile_id:Yi},jt=r.destination_url||((p=(c=r.export_profiles)==null?void 0:c[Yi])==null?void 0:p.destination_url)||jt,Oe.init({ids:xo,profile:Yi,destinationUrl:jt});let e=Oe.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),le=ba({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),Eo()},onRefresh:Eo});let g=le.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var v,w,A,L,$,x,_,O,S,E,k;let h=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=f.detail;if(va.width=b,va.height=y,Ao(b,y),!(!h||!h.renderer)){m&&s(h,m);try{h.renderer.resize(b,y);let T=h.view;T&&(T.style.width="100%",T.style.height="100%",T.style.display="block")}catch(T){console.warn("[SCREEN] Error resizing renderer:",T);return}if(t&&m&&wa)try{let T=(v=window.__mainContainer)!=null?v:h.stage,M=(_=(x=(L=window.__tutorialLabel)!=null?L:(A=(w=m.get("label_1"))==null?void 0:w.getDisplayObject)==null?void 0:A.call(w))!=null?x:($=m.get("label_1"))==null?void 0:$.pixiObject)!=null?_:m.get("label_1"),P=m.get("background_1"),z=(k=(E=(S=window.__background)!=null?S:(O=P==null?void 0:P.getDisplayObject)==null?void 0:O.call(P))!=null?E:P==null?void 0:P.pixiObject)!=null?k:P;if(T){let C=T===h.stage;wa({mainContainer:T,label:M,background:z,backgroundTexture:(z==null?void 0:z.texture)||null,app:h},t,0,va,m,{skipMainContainerTransform:C})}}catch(T){console.warn("[SCREEN] Error in layout:",T)}}})}let t=await be("scene.main");window.__editableConfig=t,o(),window.__editableConfigBaseline||(window.__editableConfigBaseline=V(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(d=t.engine.runtime)==null?void 0:d.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await be("scene.main"));let i=await Ea(e,t,jt,le);Pe=i.app;let n=i.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=n;try{window.__liveEditBridge=Wi({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Rt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}le&&le.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(rt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),s(Pe,n);async function o(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,w=await fetch(v,{cache:"no-cache"});if(!w.ok)return null;let A=await w.text();try{return JSON.parse(A)}catch{return null}},f=await g("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let h=f.screens;if(!h||typeof h!="object")return;let m={},b={};for(let[y,v]of Object.entries(h)){let w=v==null?void 0:v.source;if(typeof w!="string")continue;let A=await g(w),L=A==null?void 0:A.elements;if(!Array.isArray(L))continue;let $=L.map(x=>x==null?void 0:x.instance_id).filter(x=>typeof x=="string");m[y]=$;for(let x of $)b[x]||(b[x]=y)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function s(g,f){if(pl){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${rt.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((w,A)=>{if(w&&w.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(w&&w.scale){let L=w.scale.x||1,$=w.scale.y||1;w.__originalScale||(w.__originalScale={x:L,y:$},console.log(`${v}[RESPONSIVE] Stored original scale for child[${A}]: ${L.toFixed(3)}, ${$.toFixed(3)}`));let x=w.__originalScale.x*rt.scale,_=w.__originalScale.y*rt.scale;typeof w.scale.set=="function"?w.scale.set(x,_):(w.scale.x=x,w.scale.y=_),console.log(`${v}[RESPONSIVE] Child[${A}] scale: ${L.toFixed(3)}\u2192${w.scale.x.toFixed(3)} (type: ${w.constructor.name})`),m(w,y+1)}else w&&console.log(`${v}[RESPONSIVE] Child[${A}] has no scale (type: ${w.constructor.name})`)})};var h=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){rt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let f=window.gameApp,h=window.gameObjectManager;f&&h?(s(f,h),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!h}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Oe.start()},Eo=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let r=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(r){let a=((t=r.getDisplayObject)==null?void 0:t.call(r))||r;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(le){le.notifyGameDestroyed();try{xa&&xa()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=le.getGameContainer(),o=window.gameObjectManager;if(o&&typeof o.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),o.clear()),Pe){try{Pe.destroy(!0,{children:!0,texture:!1})}catch(s){console.warn("[PREVIEW] Destroy warning:",s)}Pe=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof Rt.resetScene=="function"&&Rt.resetScene()}catch(s){console.warn("Asset reset failed",s)}setTimeout(()=>{be("scene.main").then(s=>{window.__editableConfig=s,window.__editableConfigBaseline||(window.__editableConfigBaseline=V(s)),Ea(a,s,jt).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Wi({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Rt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}le&&le.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Oe.start()}catch{}})})},100)},1e3)}};pi();X();var ce={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Co=1.25,To={fontFamily:"Inter, system-ui, sans-serif"};var Ki=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=`
2133
+ `,this.setupEventListeners(e),e}setupEventListeners(e){var g,f,h,m,b,y,v,S;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",x=>{if(this.viewMode==="compare")return;let w=x.target.value;this.setDevice(w)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",x=>{let w=x.target.value;this.setTheme(w)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(x=>{x.addEventListener("click",()=>{let w=x.dataset.viewToggle;w&&this.setViewMode(w)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(x=>{x.addEventListener("click",()=>{let w=x.dataset.layoutToggle;w&&this.setLayoutMode(w)})}),(g=e.querySelector("#rotate-btn"))==null||g.addEventListener("click",()=>this.toggleRotation()),(f=e.querySelector("#zoom-in-btn"))==null||f.addEventListener("click",()=>this.adjustUserZoom(.1)),(h=e.querySelector("#zoom-out-btn"))==null||h.addEventListener("click",()=>this.adjustUserZoom(-.1)),(m=e.querySelector("#refresh-btn"))==null||m.addEventListener("click",()=>this.refresh());let s=e.querySelector("#bottom-dock"),o=e.querySelector("#bottom-dock-resize");s&&o&&this.makeBottomDockResizable(s,o);let l=Array.from(e.querySelectorAll(".bottom-dock-tab"));l.forEach(x=>{x.addEventListener("click",()=>{let w=x.dataset.dockTab;if(!w)return;l.forEach(E=>E.classList.remove("active")),x.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(E=>{let k=E.dataset.dockPanel;E.classList.toggle("active",k===w)})})}),(b=e.querySelector("#console-clear"))==null||b.addEventListener("click",()=>this.clearConsole()),(y=e.querySelector("#corner-zoom-in-btn"))==null||y.addEventListener("click",()=>this.adjustUserZoom(.1)),(v=e.querySelector("#corner-zoom-out-btn"))==null||v.addEventListener("click",()=>this.adjustUserZoom(-.1)),(S=e.querySelector("#corner-grab-btn"))==null||S.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let c=e.querySelector(".scene-panel.scene-objects"),p=c==null?void 0:c.querySelector("[data-panel-resize-v]");c&&p&&this.makeSidebarResizable(c,p,"left");let d=e.querySelector(".debug-workbench"),u=d==null?void 0:d.querySelector("#workbench-resize-v");d&&u&&this.makeSidebarResizable(d,u,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let s=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(s,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),si();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),oi();return}})}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.autoScale*this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepVisibleScale:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(s=>typeof s=="object"?this.safeStringify(s):String(s)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let s=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=s>0?`${s}!`:"0",a.classList.toggle("has-errors",s>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(d=>d.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),s=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),p=t.querySelector("[data-compare-focus]");!a||!s||!o||!l||(t.addEventListener("click",d=>{let u=d.target;if(u!=null&&u.closest("[data-compare-focus]")){d.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:s,wrapper:o,frame:l,canvas:c,focus:p}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");if(i&&(i.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,s;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(s=(a=this.options).onDeviceChange)==null||s.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,s=n/e.preset.height,o=Math.max(.01,Math.min(a,s));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,s=t.canvas.height,o=Math.min(a/i.width,s/i.height),l=i.width*o,c=i.height*o,p=(a-l)/2,d=(s-c)/2;n.clearRect(0,0,a,s),n.drawImage(i,p,d,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare")return{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40};let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function Sa(r={}){let e=new Ki(r);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function Aa(r){try{if(r&&typeof r.keys=="function")return Array.from(r.keys())}catch{}return[]}function xs(r){var e;return r?((e=r.getDisplayObject)==null?void 0:e.call(r))||r.pixiObject||r:null}function cl(r,e){if(!r||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);r.eventMode=i?"static":"none",r.interactive=i,i&&(r.cursor=t.draggable?"move":"pointer")}function Es(r,e){var l,c,p;if(!r||!e)return;let t=e.transform||{};cl(r,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),s=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=r.position)!=null&&l.set?r.position.set(a,s):(typeof r.x=="number"&&(r.x=a),typeof r.y=="number"&&(r.y=s)),typeof t.scale=="number"&&((c=r.scale)!=null&&c.set?r.scale.set(t.scale):r.scale&&(r.scale.x=t.scale,r.scale.y=t.scale));let o=t.anchor;if(o&&((p=r.anchor)!=null&&p.set)){let d=null;typeof window!="undefined"&&window.resolveAnchorVec2?d=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?d=o:Array.isArray(o)&&o.length===2&&(d={x:o[0],y:o[1]}),d&&typeof d.x=="number"&&typeof d.y=="number"&&r.anchor.set(d.x,d.y)}}function Ss(r){if(typeof window=="undefined")return;let e=r==null?void 0:r.objects,t=Aa(e),i=a=>{try{let s=window.__HANDLER_ACTIVE_SCREEN;if(!s||s==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===s):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Ss(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Aa((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Aa((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var p,d,u,g,f;let s=(g=(u=(d=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:d.get)==null?void 0:u.call(d,a))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return s;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.instanceToScreen)==null?void 0:f[a];return c&&c===o?s:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let s={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(s.assets||{})),s}return a}}function dl(){if(typeof window=="undefined")return;let r=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,s,o;let n=r(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(Xe(),wr))]),p=Date.now(),d=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${p}`:`?t=${p}`),u=await l.load(d);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let f=window.gameObjectManager,h=(s=f==null?void 0:f.get)==null?void 0:s.call(f,t);if(h){let m=((o=h.getDisplayObject)==null?void 0:o.call(h))||h.pixiObject||h.pixi||h;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Te(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Y();Array.isArray(i)&&i.length&&(window.__editableConfig=t,Te(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,s]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:s});if(t.assets)for(let[a,s]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:s}),typeof s=="string"&&e(a,s);if(t.splash)for(let[a,s]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:s});if(t.loading)for(let[a,s]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:s});if(t.start)for(let[a,s]of Object.entries(t.start))n.push({path:`start.${a}`,value:s});n.length&&Te(n,{silent:!0,persist:!0,emitEvent:!0})}}function Xi(r){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=r;t&&(t.onObjectRebuildRequired=async(a,s)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,p=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let d=window.gameApp,u=await Ce.create(a,s,d);c&&(p!==void 0&&p!==-1?c.addChildAt(u,p):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(dl(),window.applyEditableObjectConfig=(a,s)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let p=window.__editableConfig;(o=p==null?void 0:p.objects)!=null&&o.set&&(p.objects.set(a,s),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let d=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!d),d&&(console.log("[LIVE-EDIT] gameObject type:",(c=d.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof d.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof d.onConfigUpdate=="function")),d&&typeof d.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),d.updateConfig(s);else if(d&&typeof d.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),d.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=xs(d);Es(u,s)}}catch(p){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",p)}});let n={async applyObjectConfig(a,s){var p,d;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(p=o==null?void 0:o.objects)!=null&&p.set&&(o.objects.set(a,s),console.log("[BRIDGE] \u2705 Updated config"));let l=(d=t==null?void 0:t.get)==null?void 0:d.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(s);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=xs(l);Es(u,s)}let c=[a];i==null||i(a,s,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,Ss(a))}};return n.rebuildIndexes(),n}K();var Ts=Ve(require("lottie-web"),1);mn(hn);typeof window!="undefined"&&!window.lottie&&(window.lottie=Ts.default);var at=null,pl=async()=>{if(!at){let r=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(r==null?void 0:r["handler.config"])||(r==null?void 0:r["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);at=JSON.parse(i)}else at=JSON.parse(e);return at}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}at=await(await fetch("./handler.config.json")).json()}return at},ka,zt,Ls,rt,Ta,La;function ul(r){ka=r.initGame,zt=r.CustomAssets,Ls=r.updateScreenState,rt=r.globalResponsiveMultipliers,Ta=r.layout,La=r.clearResponsiveElements}var Ji="web_embed",Rt="https://example.com",As={profile_id:Ji},Pe=null,ce=null,Ca={width:0,height:0},gl=!0,hl=async()=>{var c,p,d,u;document.title="Handler Pixi Game";let r=await pl();As={...r.ids||{},profile_id:Ji},Rt=r.destination_url||((p=(c=r.export_profiles)==null?void 0:c[Ji])==null?void 0:p.destination_url)||Rt,Ie.init({ids:As,profile:Ji,destinationUrl:Rt});let e=Ie.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),ce=Sa({onDeviceChange:f=>{console.log(`[PREVIEW] Device switched to ${f.width}x${f.height}, restarting game...`),Cs()},onRefresh:Cs});let g=ce.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",f=>{var v,S,x,w,O,E,k,I,C,A,M;let h=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=f.detail;if(Ca.width=b,Ca.height=y,Ls(b,y),!(!h||!h.renderer)){m&&o(h,m);try{h.renderer.resize(b,y);let L=h.view;L&&(L.style.width="100%",L.style.height="100%",L.style.display="block")}catch(L){console.warn("[SCREEN] Error resizing renderer:",L);return}if(t&&m&&Ta)try{let L=(v=window.__mainContainer)!=null?v:h.stage,_=(k=(E=(w=window.__tutorialLabel)!=null?w:(x=(S=m.get("label_1"))==null?void 0:S.getDisplayObject)==null?void 0:x.call(S))!=null?E:(O=m.get("label_1"))==null?void 0:O.pixiObject)!=null?k:m.get("label_1"),P=m.get("background_1"),$=(M=(A=(C=window.__background)!=null?C:(I=P==null?void 0:P.getDisplayObject)==null?void 0:I.call(P))!=null?A:P==null?void 0:P.pixiObject)!=null?M:P;if(L){let T=L===h.stage;Ta({mainContainer:L,label:_,background:$,backgroundTexture:($==null?void 0:$.texture)||null,app:h},t,0,Ca,m,{skipMainContainerTransform:T})}}catch(L){console.warn("[SCREEN] Error in layout:",L)}}})}let t=await ve("scene.main");window.__editableConfig=t,s(),window.__editableConfigBaseline||(window.__editableConfigBaseline=V(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 ve("scene.main"));let i=await ka(e,t,Rt,ce);Pe=i.app;let n=i.gameObjectManager;window.gameApp=Pe,window.gameObjectManager=n;try{window.__liveEditBridge=Xi({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:zt})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}ce&&ce.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(rt.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(Pe,n);async function s(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,S=await fetch(v,{cache:"no-cache"});if(!S.ok)return null;let x=await S.text();try{return JSON.parse(x)}catch{return null}},f=await g("configs/flow/app.flow.json");if(!f||typeof f!="object")return;let h=f.screens;if(!h||typeof h!="object")return;let m={},b={};for(let[y,v]of Object.entries(h)){let S=v==null?void 0:v.source;if(typeof S!="string")continue;let x=await g(S),w=x==null?void 0:x.elements;if(!Array.isArray(w))continue;let O=w.map(E=>E==null?void 0:E.instance_id).filter(E=>typeof E=="string");m[y]=O;for(let E of O)b[E]||(b[E]=y)}window.__HANDLER_APP_FLOW=f,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,f){if(gl){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${rt.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((S,x)=>{if(S&&S.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(S&&S.scale){let w=S.scale.x||1,O=S.scale.y||1;S.__originalScale||(S.__originalScale={x:w,y:O},console.log(`${v}[RESPONSIVE] Stored original scale for child[${x}]: ${w.toFixed(3)}, ${O.toFixed(3)}`));let E=S.__originalScale.x*rt.scale,k=S.__originalScale.y*rt.scale;typeof S.scale.set=="function"?S.scale.set(E,k):(S.scale.x=E,S.scale.y=k),console.log(`${v}[RESPONSIVE] Child[${x}] scale: ${w.toFixed(3)}\u2192${S.scale.x.toFixed(3)} (type: ${S.constructor.name})`),m(S,y+1)}else S&&console.log(`${v}[RESPONSIVE] Child[${x}] has no scale (type: ${S.constructor.name})`)})};var h=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){rt.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let f=window.gameApp,h=window.gameObjectManager;f&&h?(o(f,h),f.renderer&&(f.renderer.render(f.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!f}) or gameObjectManager (${!!h}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,Ie.start()},Cs=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let r=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(r){let a=((t=r.getDisplayObject)==null?void 0:t.call(r))||r;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(ce){ce.notifyGameDestroyed();try{La&&La()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=ce.getGameContainer(),s=window.gameObjectManager;if(s&&typeof s.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),s.clear()),Pe){try{Pe.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}Pe=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof zt.resetScene=="function"&&zt.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{ve("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=V(o)),ka(a,o,Rt).then(l=>{Pe=l.app,window.gameApp=Pe,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=Xi({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:zt})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}ce&&ce.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{Ie.start()}catch{}})})},100)},1e3)}};hi();K();var de={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},ks=1.25,Ms={fontFamily:"Inter, system-ui, sans-serif"};var Zi=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=`
2103
2134
  position: fixed;
2104
2135
  inset: 0;
2105
2136
  display: flex;
@@ -2108,7 +2139,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2108
2139
  z-index: 50;
2109
2140
  user-select: none;
2110
2141
  overflow: hidden;
2111
- background-color: ${ce.background};
2142
+ background-color: ${de.background};
2112
2143
  `;let t=document.createElement("div");t.style.cssText=`
2113
2144
  position: relative;
2114
2145
  width: 288px;
@@ -2134,17 +2165,17 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2134
2165
  justify-content: space-between;
2135
2166
  align-items: flex-end;
2136
2167
  margin-bottom: 8px;
2137
- `;let o=document.createElement("span");o.style.cssText=`
2168
+ `;let s=document.createElement("span");s.style.cssText=`
2138
2169
  font-size: 12px;
2139
2170
  font-weight: 900;
2140
2171
  letter-spacing: 0.15em;
2141
- color: ${ce.ink};
2142
- `,o.innerHTML='LOADING<span class="loading-dots" style="animation: pulse 1.5s infinite;">..</span>',this.progressText=document.createElement("span"),this.progressText.style.cssText=`
2172
+ color: ${de.ink};
2173
+ `,s.innerHTML='LOADING<span class="loading-dots" style="animation: pulse 1.5s infinite;">..</span>',this.progressText=document.createElement("span"),this.progressText.style.cssText=`
2143
2174
  font-size: 10px;
2144
2175
  font-family: monospace;
2145
2176
  font-weight: bold;
2146
- color: ${ce.primaryAccent};
2147
- `,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,a.appendChild(o),a.appendChild(this.progressText);let s=document.createElement("div");s.style.cssText=`
2177
+ color: ${de.primaryAccent};
2178
+ `,this.progressText.textContent=`${Math.floor(this.currentProgress)}%`,a.appendChild(s),a.appendChild(this.progressText);let o=document.createElement("div");o.style.cssText=`
2148
2179
  height: 4px;
2149
2180
  width: 100%;
2150
2181
  background-color: #E0DDD8;
@@ -2158,7 +2189,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2158
2189
  border-radius: 9999px;
2159
2190
  position: relative;
2160
2191
  width: ${this.currentProgress}%;
2161
- background-color: ${ce.primaryAccent};
2192
+ background-color: ${de.primaryAccent};
2162
2193
  `;let l=document.createElement("div");l.style.cssText=`
2163
2194
  position: absolute;
2164
2195
  inset: 0;
@@ -2167,7 +2198,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2167
2198
  width: 50%;
2168
2199
  filter: blur(4px);
2169
2200
  animation: shimmer 2s infinite;
2170
- `,this.progressBar.appendChild(l),s.appendChild(this.progressBar);let c=document.createElement("div");c.style.cssText=`
2201
+ `,this.progressBar.appendChild(l),o.appendChild(this.progressBar);let c=document.createElement("div");c.style.cssText=`
2171
2202
  display: flex;
2172
2203
  justify-content: space-between;
2173
2204
  width: 100%;
@@ -2178,7 +2209,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2178
2209
  width: 1.5px;
2179
2210
  background-color: black;
2180
2211
  height: ${u%4===0?"6px":"2px"};
2181
- `,c.appendChild(g)}n.appendChild(a),n.appendChild(s),n.appendChild(c);let p=document.createElement("div");return p.id="handler-load-centered",p.style.cssText=`
2212
+ `,c.appendChild(g)}n.appendChild(a),n.appendChild(o),n.appendChild(c);let p=document.createElement("div");return p.id="handler-load-centered",p.style.cssText=`
2182
2213
  position: absolute;
2183
2214
  top: 48px;
2184
2215
  width: 600px;
@@ -2197,7 +2228,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2197
2228
  font-size: 24px;
2198
2229
  letter-spacing: -0.05em;
2199
2230
  animation: handlerMove 2.5s linear infinite;
2200
- color: ${ce.ink};
2231
+ color: ${de.ink};
2201
2232
  display: flex;
2202
2233
  align-items: center;
2203
2234
  justify-content: center;
@@ -2210,7 +2241,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2210
2241
  letter-spacing: 0.3em;
2211
2242
  opacity: 0.2;
2212
2243
  text-transform: uppercase;
2213
- color: ${ce.ink};
2244
+ color: ${de.ink};
2214
2245
  `,this.authSeq.textContent=`Auth_Seq: 0x${Math.floor(this.currentProgress*2.55).toString(16).toUpperCase()} // System_Ready`,e.appendChild(t),e.appendChild(this.authSeq),this.injectStyles(),e}injectStyles(){if(document.getElementById("handler-loading-screen-styles"))return;let e=document.createElement("style");e.id="handler-loading-screen-styles",e.textContent=`
2215
2246
  /* Box Loading Styles */
2216
2247
  .boxLoading {
@@ -2241,7 +2272,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2241
2272
  content: '';
2242
2273
  width: 50px;
2243
2274
  height: 50px;
2244
- background: ${ce.primaryAccent};
2275
+ background: ${de.primaryAccent};
2245
2276
  animation: animate 0.5s linear infinite;
2246
2277
  position: absolute;
2247
2278
  top: 0;
@@ -2298,7 +2329,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2298
2329
  0%, 100% { opacity: 1; }
2299
2330
  50% { opacity: 0.3; }
2300
2331
  }
2301
- `,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 Sa=Ga.version,gl=new Set(["init","boot","view","ready","start","pause","resume","complete","error","engagement","first_interaction","retry","cta_show","cta_click","cta_dismiss","clickout","conversion","session_time","level_time","load_time","level_start","level_complete","level_fail","checkpoint","reward","tutorial_start","tutorial_complete","tutorial_skip","ab_assign","fps","memory","asset_load_start","asset_load_complete"]);Ua();var Io={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"},jo=Math.random().toString(36).slice(2),lt=null,ot={...Io},Ro="web_embed",La={},$t,Aa=!1,zt=!1,Ht=!1,zo=!1,_a=1,Ji=0,en=!1,ve=!1,st="",ct=Math.floor(window.innerWidth),dt=Math.floor(window.innerHeight),ka=ct>dt,we=!1,Dt=!1,Lo=!1,ko=!1,Ca=!1,Zi=null,Fe=null,Pa=!1,Ma=!1,Xi=new Map;function $o(){if(!Fe)return null;let r=Date.now()-Fe;return!Number.isFinite(r)||r<0?null:r}function Ta(r){if(Pa)return;let e=$o();e!==null&&(Pa=!0,R("session_time",{duration_ms:e,reason:r}))}function Po(){if(lt)return lt;let r=document.createElement("div");return r.id="handler-root",r.setAttribute("data-handler-root","true"),document.body.appendChild(r),lt=r,r}function Qi(r){switch(r){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return r}}function Do(r,e){return{event_name:r,ts:Date.now(),session_id:jo,deployment_id:ot.deployment_id,variant_id:ot.variant_id,export_profile_id:ot.profile_id,instance_id:ot.instance_id||"default",env:Ro==="mraid"?"mraid":"web",attribution:$t,payload:e}}function R(r,e){let t=Qi(r),i=Do(t,e);ln(i,!!La.analytics),qt(t,i),t!==r&&qt(r,i)}function Nt(){Zi&&(Zi(ct,dt),Zi=null)}function pt(r){_a=r,R("volume",r)}function ut(r){r&&(zo=!0),!Ht&&(Ht=!0,R("pause"),pt(0))}function Ft(r){!r&&zo||Ht&&(Ht=!1,R("resume"),pt(_a))}function Me(r,e){ct=Math.floor(r||window.innerWidth),dt=Math.floor(e||window.innerHeight),ka=ct>dt,R("resize",{width:ct,height:dt})}function hl(){if(ir())try{let r=mraid.getMaxSize();Me(r.width,r.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Ft():ut()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();Me(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();pt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&pt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),en=!0,mraid.isViewable()&&mraid.getState()!=="hidden")we=!0,R("boot"),R("view"),R("ready"),ve=!0,Nt();else{let t=()=>{we=!0,R("boot"),R("view"),R("ready"),ve=!0,Nt()};mraid.addEventListener("ready",t)}}catch(r){console.warn("MRAID hook skipped",r)}}function fl(){if(nr())try{let r=dapi.getScreenSize();Me(r.width,r.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Ft():ut()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();Me(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(pt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>pt(t?1:0)),en=!0,dapi.isViewable())we=!0,R("boot"),R("view"),R("ready"),ve=!0,Nt();else{let t=()=>{we=!0,R("boot"),R("view"),R("ready"),ve=!0,Nt()};dapi.addEventListener("ready",t)}}catch(r){console.warn("DAPI hook skipped",r)}}function Mo(){let r=()=>{we||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(we=!0,R("boot"),R("view"),R("ready"),ve=!0,Nt(),Dt&&(Dt=!1,ae.start()))};window.addEventListener("resize",()=>Me()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Ft(),r()):ut()}),document.readyState==="complete"||document.readyState==="interactive"?r():window.addEventListener("load",r),en=!0}function ml(){let r=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Lo=!0),!(Lo&&e instanceof MouseEvent)&&(Ji+=1,Ma||(Ma=!0,R("first_interaction",{count:Ji})),R("interaction",Ji))};document.addEventListener("mousedown",r),document.addEventListener("touchstart",r)}function _o(r){var i,n,a,o,s,l,c,p,d,u,g,f;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(r||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ye())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(ar())(s=(o=window.FbPlayableAd)==null?void 0:o.onCTAClick)==null||s.call(o);else if(lr())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(sr())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(rr()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(r||st||""):r&&window.open(r)}else We()?(u=window.install)==null||u.call(window):or()?(g=window.openAppStore)==null||g.call(window):cn()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):r&&window.open(r)}function bl(){let r=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(r==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;J("view",()=>e(t.mraid_viewable)),J("start",()=>e(t.game_viewable)),J("engagement",()=>e(t.engagement));let i=()=>e(t.complete);J("complete",i),Gt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),J("cta_click",()=>e(t.click))}else if(r==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;J("view",()=>e(t.Ad_Load_Start)),J("start",()=>e(t.Ad_Viewable)),J("engagement",()=>e(t.First_Engagement)),J("complete",()=>e(t.Gameplay_Complete)),J("cta_click",()=>e(t.DSP_Click)),J("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function yl(){if(!Ye())return;let r=window.TJ_API;r&&r.setPlayableAPI&&r.setPlayableAPI({skipAd:()=>{try{ae.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Oo(){var e,t,i;let r=window.TJ_API;(e=r==null?void 0:r.objectiveComplete)==null||e.call(r),(t=r==null?void 0:r.playableFinished)==null||t.call(r),(i=r==null?void 0:r.gameplayFinished)==null||i.call(r)}function vl(){We()&&(window.mintGameStart=()=>{Ft(!0),Me()},window.mintGameClose=()=>{ut(!0)})}function wl(){if(!dn())return;let r=window.NUC;!r||!r.trigger||(ae.on("cta_click",()=>{var e,t;return(t=(e=r.trigger).convert)==null?void 0:t.call(e,st)}),ae.on("complete",()=>{var e,t;return(t=(e=r.trigger).tryAgain)==null?void 0:t.call(e)}))}var ae={init(r={},e){var t;if(Ro=r.profile||"web_embed",La=r.consent||{},ot={...Io,...r.ids||{}},lt=r.rootEl||lt,$t=void 0,za((t=r.telemetry)!=null&&t.endpoint?r.telemetry:null),Fe=null,Pa=!1,Ma=!1,Xi.clear(),st=r.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(Zi=e),R("init"),document.body.oncontextmenu=()=>!1,Po(),El(lt),cr(),hl(),fl(),!en){if(document.readyState==="complete")Mo();else if(!ko){ko=!0;let i=()=>{Mo(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}ml(),bl(),yl(),vl(),wl(),console.log(`%c @handler/playable-sdk %c v${Sa} `,"background: var(--ui-console-info); color: var(--ui-white); font-size: 14px; padding: 4px 8px; border-top-left-radius: 4px; border-bottom-left-radius: 4px;","background: var(--ui-console-bg); color: var(--ui-console-text); font-size: 14px; padding: 4px 8px; border-top-right-radius: 4px; border-bottom-right-radius: 4px;"),we&&!ve&&(R("boot"),R("view"),R("ready"),Dt&&(Dt=!1,ae.start()),ve=!0),ve=we},getRoot(){return Po()},get version(){return Sa},get maxWidth(){return ct},get maxHeight(){return dt},get isLandscape(){return ka},get isReady(){return ve},get isStarted(){return Aa},get isPaused(){return Ht},get isFinished(){return zt},get volume(){return _a},get interactions(){return Ji},on(r,e){Gt(Qi(r),e)},off(r,e){sn(Qi(r),e)},start(){var r,e;if(!Aa){if(!we){Dt=!0;return}if(Aa=!0,Fe||(Fe=Date.now()),R("start"),Me(),We())ut(),(r=window.gameReady)==null||r.call(window);else if(Ye()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:ka?"landscape":"portrait",buildID:Sa})}}},finish(){var r,e;zt||(zt=!0,R("complete"),Ta("complete"),We()?(r=window.gameEnd)==null||r.call(window):cn()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ye()&&Oo())},install(r){if(!zt){zt=!0,Ye()?(Oo(),setTimeout(()=>ae.install(r),300)):(R("complete"),setTimeout(()=>ae.install(r),0));return}Ca||(Ca=!0,setTimeout(()=>Ca=!1,500),R("cta_click"),R("conversion"),Ta("cta"),_o(r||st))},emit(r,e){let t=Qi(r);if(!gl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${r} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Do(t,e);ln(i,!!La.analytics),qt(t,i)},gameStart(){ae.start()},gameEnd(){ae.finish()},ctaClick(r,e){R("cta_click",{url:r||st,manual:!0}),(e==null?void 0:e.open)!==!1&&_o(r||st)},ctaShow(r){R("cta_show",r)},ctaDismiss(r){R("cta_dismiss",r)},getGameTimeMs(){return $o()},endSession(r="manual"){Ta(r)},setAttribution(r){$t=r},abTest(r,e){if(!r)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(xl(`${jo}:${r}`))%e.length,i=e[t];return $t={...$t||{},experiment_id:r},ot.variant_id=i,R("ab_assign",{experiment_id:r,variant_id:i}),i},levelStart(r,e){Fe||(Fe=Date.now()),R("level_start",{level_id:r,...e})},levelComplete(r,e){R("level_complete",{level_id:r,...e})},levelFail(r,e){R("level_fail",{level_id:r,...e})},checkpoint(r,e){R("checkpoint",{checkpoint_id:r,...e})},reward(r,e){R("reward",{reward_id:r,...e})},tutorialStart(r,e){R("tutorial_start",{step_id:r,...e})},tutorialComplete(r,e){R("tutorial_complete",{step_id:r,...e})},tutorialSkip(r,e){R("tutorial_skip",{step_id:r,...e})},timerStart(r){r&&Xi.set(r,Date.now())},timerEnd(r,e="custom",t){if(!r)return;let i=Xi.get(r);if(!i)return;Xi.delete(r);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){R("engagement",{action:"timer",key:r,duration_ms:n,...t});return}R(e,{key:r,duration_ms:n,...t})}},fps(r,e){R("fps",{value:r,...e})},memory(r,e){R("memory",{bytes:r,...e})},assetLoadStart(r,e){R("asset_load_start",{asset_id:r,...e})},assetLoadComplete(r,e){R("asset_load_complete",{asset_id:r,...e})},reportError(r,e,t){R("error",{code:r,message:e,...t})},retry(){var r,e,t;if(We())(r=window.gameRetry)==null||r.call(window);else if(dn()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}R("engagement",{action:"retry"})},pause(){ut(!0)},resume(){Ft(!0)},resize(r,e){Me(r,e)}},Oe=ae;function xl(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function El(r){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2332
+ `,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 Ma=Xa.version,fl=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"]);Ka();var zs={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"},$s=Math.random().toString(36).slice(2),lt=null,st={...zs},Ds="web_embed",Ia={},Dt,Pa=!1,$t=!1,Nt=!1,Hs=!1,$a=1,en=0,an=!1,xe=!1,ot="",ct=Math.floor(window.innerWidth),dt=Math.floor(window.innerHeight),ja=ct>dt,Ee=!1,Ht=!1,Ps=!1,_s=!1,_a=!1,tn=null,Be=null,Ra=!1,za=!1,Qi=new Map;function Ns(){if(!Be)return null;let r=Date.now()-Be;return!Number.isFinite(r)||r<0?null:r}function Oa(r){if(Ra)return;let e=Ns();e!==null&&(Ra=!0,z("session_time",{duration_ms:e,reason:r}))}function Os(){if(lt)return lt;let r=document.createElement("div");return r.id="handler-root",r.setAttribute("data-handler-root","true"),document.body.appendChild(r),lt=r,r}function nn(r){switch(r){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return r}}function Fs(r,e){return{event_name:r,ts:Date.now(),session_id:$s,deployment_id:st.deployment_id,variant_id:st.variant_id,export_profile_id:st.profile_id,instance_id:st.instance_id||"default",env:Ds==="mraid"?"mraid":"web",attribution:Dt,payload:e}}function z(r,e){let t=nn(r),i=Fs(t,e);pn(i,!!Ia.analytics),Vt(t,i),t!==r&&Vt(r,i)}function Ft(){tn&&(tn(ct,dt),tn=null)}function pt(r){$a=r,z("volume",r)}function ut(r){r&&(Hs=!0),!Nt&&(Nt=!0,z("pause"),pt(0))}function Bt(r){!r&&Hs||Nt&&(Nt=!1,z("resume"),pt($a))}function _e(r,e){ct=Math.floor(r||window.innerWidth),dt=Math.floor(e||window.innerHeight),ja=ct>dt,z("resize",{width:ct,height:dt})}function ml(){if(lr())try{let r=mraid.getMaxSize();_e(r.width,r.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Bt():ut()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();_e(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();pt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&pt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),an=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Ee=!0,z("boot"),z("view"),z("ready"),xe=!0,Ft();else{let t=()=>{Ee=!0,z("boot"),z("view"),z("ready"),xe=!0,Ft()};mraid.addEventListener("ready",t)}}catch(r){console.warn("MRAID hook skipped",r)}}function bl(){if(cr())try{let r=dapi.getScreenSize();_e(r.width,r.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Bt():ut()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();_e(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(pt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>pt(t?1:0)),an=!0,dapi.isViewable())Ee=!0,z("boot"),z("view"),z("ready"),xe=!0,Ft();else{let t=()=>{Ee=!0,z("boot"),z("view"),z("ready"),xe=!0,Ft()};dapi.addEventListener("ready",t)}}catch(r){console.warn("DAPI hook skipped",r)}}function Is(){let r=()=>{Ee||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Ee=!0,z("boot"),z("view"),z("ready"),xe=!0,Ft(),Ht&&(Ht=!1,ae.start()))};window.addEventListener("resize",()=>_e()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Bt(),r()):ut()}),document.readyState==="complete"||document.readyState==="interactive"?r():window.addEventListener("load",r),an=!0}function yl(){let r=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Ps=!0),!(Ps&&e instanceof MouseEvent)&&(en+=1,za||(za=!0,z("first_interaction",{count:en})),z("interaction",en))};document.addEventListener("mousedown",r),document.addEventListener("touchstart",r)}function js(r){var i,n,a,s,o,l,c,p,d,u,g,f;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(r||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(Ke())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(dr())(o=(s=window.FbPlayableAd)==null?void 0:s.onCTAClick)==null||o.call(s);else if(hr())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(gr())try{(d=(p=window.smxTracking)==null?void 0:p.redirect)==null||d.call(p)}catch(h){console.warn("Smadex redirect failed",h)}else if(pr()){let h=window.ExitApi;h&&typeof h.exit=="function"?h.exit(r||ot||""):r&&window.open(r)}else Ye()?(u=window.install)==null||u.call(window):ur()?(g=window.openAppStore)==null||g.call(window):un()?(f=parent==null?void 0:parent.postMessage)==null||f.call(parent,"download","*"):r&&window.open(r)}function vl(){let r=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(r==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;J("view",()=>e(t.mraid_viewable)),J("start",()=>e(t.game_viewable)),J("engagement",()=>e(t.engagement));let i=()=>e(t.complete);J("complete",i),qt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),J("cta_click",()=>e(t.click))}else if(r==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;J("view",()=>e(t.Ad_Load_Start)),J("start",()=>e(t.Ad_Viewable)),J("engagement",()=>e(t.First_Engagement)),J("complete",()=>e(t.Gameplay_Complete)),J("cta_click",()=>e(t.DSP_Click)),J("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function wl(){if(!Ke())return;let r=window.TJ_API;r&&r.setPlayableAPI&&r.setPlayableAPI({skipAd:()=>{try{ae.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Rs(){var e,t,i;let r=window.TJ_API;(e=r==null?void 0:r.objectiveComplete)==null||e.call(r),(t=r==null?void 0:r.playableFinished)==null||t.call(r),(i=r==null?void 0:r.gameplayFinished)==null||i.call(r)}function xl(){Ye()&&(window.mintGameStart=()=>{Bt(!0),_e()},window.mintGameClose=()=>{ut(!0)})}function El(){if(!gn())return;let r=window.NUC;!r||!r.trigger||(ae.on("cta_click",()=>{var e,t;return(t=(e=r.trigger).convert)==null?void 0:t.call(e,ot)}),ae.on("complete",()=>{var e,t;return(t=(e=r.trigger).tryAgain)==null?void 0:t.call(e)}))}var ae={init(r={},e){var t;if(Ds=r.profile||"web_embed",Ia=r.consent||{},st={...zs,...r.ids||{}},lt=r.rootEl||lt,Dt=void 0,Ba((t=r.telemetry)!=null&&t.endpoint?r.telemetry:null),Be=null,Ra=!1,za=!1,Qi.clear(),ot=r.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(tn=e),z("init"),document.body.oncontextmenu=()=>!1,Os(),Al(lt),fr(),ml(),bl(),!an){if(document.readyState==="complete")Is();else if(!_s){_s=!0;let i=()=>{Is(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}yl(),vl(),wl(),xl(),El(),console.log(`%c @handler/playable-sdk %c v${Ma} `,"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;"),Ee&&!xe&&(z("boot"),z("view"),z("ready"),Ht&&(Ht=!1,ae.start()),xe=!0),xe=Ee},getRoot(){return Os()},get version(){return Ma},get maxWidth(){return ct},get maxHeight(){return dt},get isLandscape(){return ja},get isReady(){return xe},get isStarted(){return Pa},get isPaused(){return Nt},get isFinished(){return $t},get volume(){return $a},get interactions(){return en},on(r,e){qt(nn(r),e)},off(r,e){dn(nn(r),e)},start(){var r,e;if(!Pa){if(!Ee){Ht=!0;return}if(Pa=!0,Be||(Be=Date.now()),z("start"),_e(),Ye())ut(),(r=window.gameReady)==null||r.call(window);else if(Ke()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:ja?"landscape":"portrait",buildID:Ma})}}},finish(){var r,e;$t||($t=!0,z("complete"),Oa("complete"),Ye()?(r=window.gameEnd)==null||r.call(window):un()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):Ke()&&Rs())},install(r){if(!$t){$t=!0,Ke()?(Rs(),setTimeout(()=>ae.install(r),300)):(z("complete"),setTimeout(()=>ae.install(r),0));return}_a||(_a=!0,setTimeout(()=>_a=!1,500),z("cta_click"),z("conversion"),Oa("cta"),js(r||ot))},emit(r,e){let t=nn(r);if(!fl.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${r} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Fs(t,e);pn(i,!!Ia.analytics),Vt(t,i)},gameStart(){ae.start()},gameEnd(){ae.finish()},ctaClick(r,e){z("cta_click",{url:r||ot,manual:!0}),(e==null?void 0:e.open)!==!1&&js(r||ot)},ctaShow(r){z("cta_show",r)},ctaDismiss(r){z("cta_dismiss",r)},getGameTimeMs(){return Ns()},endSession(r="manual"){Oa(r)},setAttribution(r){Dt=r},abTest(r,e){if(!r)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(Sl(`${$s}:${r}`))%e.length,i=e[t];return Dt={...Dt||{},experiment_id:r},st.variant_id=i,z("ab_assign",{experiment_id:r,variant_id:i}),i},levelStart(r,e){Be||(Be=Date.now()),z("level_start",{level_id:r,...e})},levelComplete(r,e){z("level_complete",{level_id:r,...e})},levelFail(r,e){z("level_fail",{level_id:r,...e})},checkpoint(r,e){z("checkpoint",{checkpoint_id:r,...e})},reward(r,e){z("reward",{reward_id:r,...e})},tutorialStart(r,e){z("tutorial_start",{step_id:r,...e})},tutorialComplete(r,e){z("tutorial_complete",{step_id:r,...e})},tutorialSkip(r,e){z("tutorial_skip",{step_id:r,...e})},timerStart(r){r&&Qi.set(r,Date.now())},timerEnd(r,e="custom",t){if(!r)return;let i=Qi.get(r);if(!i)return;Qi.delete(r);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){z("engagement",{action:"timer",key:r,duration_ms:n,...t});return}z(e,{key:r,duration_ms:n,...t})}},fps(r,e){z("fps",{value:r,...e})},memory(r,e){z("memory",{bytes:r,...e})},assetLoadStart(r,e){z("asset_load_start",{asset_id:r,...e})},assetLoadComplete(r,e){z("asset_load_complete",{asset_id:r,...e})},reportError(r,e,t){z("error",{code:r,message:e,...t})},retry(){var r,e,t;if(Ye())(r=window.gameRetry)==null||r.call(window);else if(gn()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}z("engagement",{action:"retry"})},pause(){ut(!0)},resume(){Bt(!0)},resize(r,e){_e(r,e)}},Ie=ae;function Sl(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function Al(r){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2302
2333
  (function(){
2303
2334
  var events = ['touchstart','touchend','mousedown','keydown'];
2304
2335
  function unlock(){
@@ -2314,4 +2345,4 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2314
2345
  }
2315
2346
  events.forEach(function(e){ document.addEventListener(e, unlock, false); });
2316
2347
  })();
2317
- `,r.appendChild(e)}0&&(module.exports={COLORS,ConfigWatcher,DebugPanel,DefaultReloadStrategy,Handler,PlayableLoadingScreen,PreviewShell,STROKE_WIDTH,THEME,applyConfigOverride,applyConfigOverrides,applyConfigsToDisk,applyDefaults,baseLottie,bootstrap,clearConfigOverrides,clearConfigOverridesForObject,configOverrideManager,createPreviewShell,deepClone,defaultPreset,deviceGroups,devicePresets,diffConfigs,exportConfigsAsJSON,getConfigOverrides,getConfigStateSummary,getOverrideMode,getPresetById,getPresetsByCategory,loadAllObjectConfigs,loadComponentSchemas,loadEngineConfig,loadGamePromptConfig,loadObjectCentricConfig,loadObjectConfig,loadSceneConfig,rehydrateObject,removeConfigOverride,resetToApplied,resetToOriginal,setBootstrapDependencies,setOverrideMode,setupHotReload,setupLiveEditBridge,toLegacyFormat,validateObjectConfig});
2348
+ `,r.appendChild(e)}0&&(module.exports={COLORS,ConfigWatcher,DebugPanel,DefaultReloadStrategy,Handler,PlayableLoadingScreen,PreviewShell,STROKE_WIDTH,THEME,applyConfigOverride,applyConfigOverrides,applyConfigsToDisk,applyDefaults,baseLottie,bootstrap,clearConfigOverrides,clearConfigOverridesForObject,configOverrideManager,createPreviewShell,deepClone,defaultPreset,deviceGroups,devicePresets,diffConfigs,exportConfigsAsJSON,getConfigOverrides,getConfigStateSummary,getOverrideMode,getPresetById,getPresetsByCategory,loadAllObjectConfigs,loadComponentSchemas,loadEngineConfig,loadGamePromptConfig,loadObjectCentricConfig,loadObjectConfig,loadSceneConfig,redoLastConfigChange,rehydrateObject,removeConfigOverride,resetToApplied,resetToOriginal,setBootstrapDependencies,setOverrideMode,setupHotReload,setupLiveEditBridge,toLegacyFormat,undoLastConfigChange,validateObjectConfig});