handler-playable-sdk 1.0.18 → 1.0.21

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.
Files changed (41) hide show
  1. package/dist/{chunk-PJT377H6.js → chunk-KHEZYZMO.js} +132 -132
  2. package/dist/cli/brand-dna.mjs +1 -1
  3. package/dist/cli/canva-import.mjs +1 -1
  4. package/dist/cli/cleanup-assets.mjs +1 -1
  5. package/dist/cli/fix-scales.mjs +1 -1
  6. package/dist/cli/index.js +1 -1
  7. package/dist/cli/screen-helper.mjs +1 -1
  8. package/dist/cli/setup-library.mjs +1 -1
  9. package/dist/cli/student-helper/add-logic.mjs +1 -1
  10. package/dist/cli/student-helper/add-object.mjs +1 -1
  11. package/dist/cli/student-helper/arg-parsing.mjs +1 -1
  12. package/dist/cli/student-helper/asset-registry.mjs +1 -1
  13. package/dist/cli/student-helper/bullet-system.mjs +1 -1
  14. package/dist/cli/student-helper/collectable-system.mjs +1 -1
  15. package/dist/cli/student-helper/constants.mjs +1 -1
  16. package/dist/cli/student-helper/drag-snap-couples.mjs +1 -1
  17. package/dist/cli/student-helper/endgame-screen.mjs +1 -1
  18. package/dist/cli/student-helper/fs-io.mjs +1 -1
  19. package/dist/cli/student-helper/logic-defaults.mjs +1 -1
  20. package/dist/cli/student-helper/print-help.mjs +1 -1
  21. package/dist/cli/student-helper/prompts.mjs +1 -1
  22. package/dist/cli/student-helper/scratch-card.mjs +1 -1
  23. package/dist/cli/student-helper/screen-utils.mjs +1 -1
  24. package/dist/cli/student-helper/snippets.mjs +1 -1
  25. package/dist/cli/student-helper/start-screen.mjs +1 -1
  26. package/dist/cli/student-helper/swerve-collect.mjs +1 -1
  27. package/dist/cli/student-helper/tap-destroy.mjs +1 -1
  28. package/dist/cli/student-helper/template-packs.mjs +1 -1
  29. package/dist/cli/student-helper.mjs +1 -1
  30. package/dist/cli/sync-screens.mjs +1 -1
  31. package/dist/cli/validate-assets.mjs +1 -1
  32. package/dist/cli/validate.mjs +1 -1
  33. package/dist/index.cjs +69 -69
  34. package/dist/index.d.cts +7 -0
  35. package/dist/index.d.ts +7 -0
  36. package/dist/index.js +1 -1
  37. package/dist/pixi/index.cjs +8 -8
  38. package/dist/pixi/index.js +1 -1
  39. package/dist/three/index.cjs +11 -11
  40. package/dist/three/index.js +1 -1
  41. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var io=Object.create;var Zt=Object.defineProperty;var no=Object.getOwnPropertyDescriptor;var ao=Object.getOwnPropertyNames;var so=Object.getPrototypeOf,ro=Object.prototype.hasOwnProperty;var be=(s,e)=>()=>(s&&(e=s(s=0)),e);var St=(s,e)=>{for(var t in e)Zt(s,t,{get:e[t],enumerable:!0})},Ya=(s,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ao(e))!ro.call(s,n)&&n!==t&&Zt(s,n,{get:()=>e[n],enumerable:!(i=no(e,n))||i.enumerable});return s};var Ze=(s,e,t)=>(t=s!=null?io(so(s)):{},Ya(e||!s||!s.__esModule?Zt(t,"default",{value:s,enumerable:!0}):t,s)),oo=s=>Ya(Zt({},"__esModule",{value:!0}),s);var ie,ii=be(()=>{"use strict";ie=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()}};ie.store=new Map});function fo(){var s,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(s=document.querySelector("script"))==null?void 0:s.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 bo(){try{if(typeof window!="undefined"){let s=await fetch("./build-settings.json");if(s.ok){let e=await s.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function yo(){try{if(typeof window!="undefined"){let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function vo(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${G}`),Object.keys(ye).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(ye)),ye;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),ye={...window.INLINE_ASSETS},ye;if(!(G==="publish"&&de!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ye;if(!kn){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),kn=(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 r=new Function("return "+a)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(r)),r}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 ye=await kn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ye)),ye}function Pn(s){return s===null||typeof s!="object"||(Object.freeze(s),Object.values(s).forEach(e=>Pn(e))),s}function wo(s=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=s,i.height=e;let n=i.getContext("2d");return n.fillStyle=`#${t.toString(16).padStart(6,"0")}`,n.fillRect(0,0,s,e),n.strokeStyle="#000",n.strokeRect(0,0,s,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",s/2,e/2),ve.Texture.from(i)}function In(s,e){Ts.set(s,e)}var ve,As,Ls,Ne,G,de,Te,ye,kn,Ts,He,ni=be(()=>{"use strict";ve=require("pixi.js");ii();As=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Ls=fo(),Ne=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,G=Ls?"publish":As,de=Ne==null?void 0:Ne.assetsInlined;Ne!=null&&Ne.buildMode&&(G=Ne.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${G}`));Te=yo();Te!=null&&Te.buildMode&&(G=Te.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${G}`));(Te==null?void 0:Te.assetsInlined)!==void 0&&(de=Te.assetsInlined);bo().then(s=>{s!=null&&s.buildMode&&s.buildMode!==G&&(G=s.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${G}`)),(s==null?void 0:s.assetsInlined)!==void 0&&(de=s.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${As}, Runtime: ${Ls?"publish":"dev"}, Effective: ${G}`);ye={},kn=null;Ts=new Map;He=class{static async load(e,t,i,n){let a=`${e}:${t.path}`,r=ie.get(a);if(r!==void 0)return r;console.log(`[AssetLoader] Loading asset: ${e}, type: ${t.type}, Effective mode: ${G}`),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 vo(),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 p=t.path.split("/");if(p.length>=2){let u=p[p.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"),G==="publish"&&de!==!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 d=Ts.get(t.type);if(d)try{let p=await d(t.path,l,e,i);return ie.set(a,p),p}catch(p){return this.handleFailure(e,t.type,p)}try{let p;switch(t.type){case"image":p=await this.loadImage(t.path,l);break;case"json":p=await this.loadJSON(t.path,l),p=Pn(p);break;default:throw new Error(`Unknown asset type: ${t.type}`)}return ie.set(a,p),p}catch(p){return this.handleFailure(e,t.type,p)}}static async loadImage(e,t){let i=G==="publish",n=i&&de!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${G}, 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 ve.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 ve.Assets.load(t)}catch(a){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",a),await ve.Assets.load(e)}return await ve.Assets.load(e)}static async loadJSON(e,t){let i=G==="publish",n=i&&de!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${G}, 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 r=atob(t.split(",")[1]);return JSON.parse(r)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let r=atob(t.split(",")[1]);return JSON.parse(r)}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(G==="dev"){let a=t==="image"?wo():Pn({__placeholder:!0,type:t});return ie.set(e+":"+((i==null?void 0:i.path)||"missing"),a),a}throw i}};In("image",async(s,e)=>{let t=G==="publish",i=t&&de!==!1,n=G==="brand",a=t&&de===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${G}, 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: ${s}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return ve.Assets.load(e)}let r=s;return(n||a)&&s&&!s.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(r=s,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${s}" as-is`)):(r=`assets/${s}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${s}" -> "${r}"`))),ve.Assets.load(e||r)});In("json",async(s,e)=>{let t=G==="publish",i=t&&de!==!1,n=G==="brand",a=t&&de===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${G}, 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: ${s}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let r=s;if((n||a)&&s&&!s.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(r=s,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${s}" as-is`)):(r=`assets/${s}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${s}" -> "${r}"`))),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(r);if(!o.ok)throw new Error(`JSON fetch failed: ${s}`);return o.json()})});var Ps={};St(Ps,{AssetTextures:()=>ue,initAssetTextures:()=>_n});function _n(s,e){ks.init(s,e),typeof window!="undefined"&&(window.__AssetTextures=ue)}var jn,ks,ue,it=be(()=>{"use strict";ni();jn=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 r;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=(r=l.render)==null?void 0:r.asset;if(!c)continue;let d=async()=>{var p;try{let u=(p=l.identity)==null?void 0:p.id;console.log(`[AssetTextures] Loading ${c.type}: ${o} (${u})`);let g=await He.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(d()):a.push(d())}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,d,p;try{let u=(d=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:d.call(c,o);return!!((p=u==null?void 0:u.render)!=null&&p.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 r=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(),r>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:n}),o())},r)})}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())}},ks=new jn,ue=new Proxy(ks,{get(s,e){return e in s&&typeof s[e]=="function"?s[e].bind(s):s.get(e)},set(s,e,t){return s.set(e,t),!0}})});var Ie={};St(Ie,{applyConfigOverride:()=>Q,applyConfigOverrides:()=>ke,applyConfigsToDisk:()=>mi,clearConfigOverrides:()=>ae,clearConfigOverridesForObject:()=>zs,configOverrideManager:()=>$s,deepClone:()=>Y,exportConfigsAsJSON:()=>Be,getConfigOverrides:()=>Z,getConfigStateSummary:()=>Pe,getOverrideMode:()=>It,redoLastConfigChange:()=>hi,removeConfigOverride:()=>Mt,resetToApplied:()=>jt,resetToOriginal:()=>fi,setOverrideMode:()=>Fn,trackObjectCreation:()=>Ds,trackObjectDeletion:()=>Ns,undoLastConfigChange:()=>gi});function di(){return typeof window=="undefined"?null:window.__editableConfig||null}function Dn(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function $n(s,e){var t,i;if(!s)return null;try{if(s instanceof Map)return(t=s.get(e))!=null?t:null;if(typeof s=="object")return(i=s[e])!=null?i:null}catch{}return null}function Vo(s,e,t){if(s){if(s instanceof Map){s.set(e,t);return}typeof s=="object"&&(s[e]=t)}}function _s(s,e){for(let t of e)Pt(s,t.path,t.value)}function pi(s){var o;if(typeof window=="undefined")return;let e=di();if(!e)return;let t=Dn(),i=(o=t?$n(t.objects,s):null)!=null?o:$n(e.objects,s);if(!i)return;let n=Y(i),a=Z().filter(l=>l.objectId===s);try{_s(n,a)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",s,l);return}Vo(e.objects,s,n);let r=window.applyEditableObjectConfig;if(typeof r=="function")try{r(s,n)}catch{}}function Nn(){var n;if(typeof window=="undefined")return;let s=di();if(!(s!=null&&s.engine))return;let e=Dn(),t=Y(((n=e==null?void 0:e.engine)!=null?n:s.engine)||{}),i=Z().filter(a=>!a.objectId&&!a.sceneId);try{_s(t,i)}catch(a){console.error("[CONFIG] Failed to reapply engine overrides",a);return}try{let a=s.engine;for(let r of Object.keys(a))r in t||delete a[r];for(let[r,o]of Object.entries(t))a[r]=o}catch{s.engine=t}}function Wo(){if(typeof window=="undefined")return"unknown";let s=window;return typeof s.__HANDLER_PROJECT_ID=="string"?s.__HANDLER_PROJECT_ID:"handler-default"}function Os(){return`handler_preview_config_overrides::${Wo()}`}function Yo(){if(typeof window=="undefined")return[];try{let s=window.localStorage.getItem(Os());if(!s)return[];let e=JSON.parse(s);return Array.isArray(e)?e:[]}catch{return[]}}function ui(s){if(typeof window!="undefined")try{window.localStorage.setItem(Os(),JSON.stringify(s))}catch{}}function It(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function Fn(s){if(typeof window!="undefined"){window.__enableConfigOverrides=s;try{window.localStorage.setItem(Rs,s?"true":"false")}catch{}}}function Q(s,e={}){var u,g;let{objectId:t,path:i,value:n}=s,{silent:a=!1,persist:r=!0,emitEvent:o=!0}=e,l=di();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 d;try{d=Hs(c,i),Pt(c,i,n)}catch(h){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:n},h);return}if(e.trackHistory!==!1){window.__configChanges=window.__configChanges||[];let h=window.__configChanges;h.push({objectId:t,path:i,oldValue:d,newValue:n,ts:Date.now()}),h.length>Hn&&h.shift(),window.__configChangeRedo=[]}if(r){let h=Z(),m=h.findIndex(f=>f.objectId===t&&f.sceneId===s.sceneId&&f.path===i);m>=0?h[m].value=n:h.push(s),window.__configOverrides=h,ui(h),It()||Fn(!0)}a||console.log("[CONFIG] Applied override:",s),o&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:s}))}function ke(s,e={}){let t=e.emitEvent!==!1,i=[];for(let n of s)n!=null&&n.objectId&&typeof n.objectId=="string"&&i.push(n.objectId),Q(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:s.length}}))}}function ae(){window.__configOverrides=[],window.__configChanges=[],window.__configChangeRedo=[],ui([]),console.log("[CONFIG] Cleared all overrides")}function zs(s){let e=Z().filter(i=>i.objectId!==s);window.__configOverrides=e,ui(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==s),pi(s),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:s}}))}function Mt(s,e){let t=Z().filter(n=>n.objectId!==s||n.path!==e);window.__configOverrides=t,ui(t);let i=window.__configChanges||[];window.__configChanges=i.filter(n=>n.objectId!==s||n.path!==e),s?pi(s):Nn(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:s,path:e}}))}function Z(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Yo()),window.__configOverrides||[])}function gi(){var a;if(typeof window=="undefined")return!1;let s=window.__configChanges||[];if(s.length===0)return!1;let e=s.pop();window.__configChangeRedo=window.__configChangeRedo||[];let t=window.__configChangeRedo;if(e.changeType==="object_create"){let{screenId:r}=e.metadata||{};return e.objectId&&r&&fetch("/api/objects/delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e.objectId,screenId:r})}).catch(o=>console.error("[CONFIG] Failed to delete object on undo:",o)),t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Undo: Deleted object",e.objectId),!0}if(e.changeType==="object_delete"){let{screenId:r,objectConfigId:o}=e.metadata||{},l=e.oldValue;return e.objectId&&r&&l&&fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:r,instanceId:e.objectId,objectConfigId:o||((a=l==null?void 0:l.identity)==null?void 0:a.id),config:l})}).catch(c=>console.error("[CONFIG] Failed to recreate object on undo:",c)),t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Undo: Recreated object",e.objectId),!0}t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType});let i=Dn(),n=!1;if(i){let r=e.objectId?$n(i.objects,e.objectId):i.engine;if(r){let o=Hs(r,e.path);JSON.stringify(o)===JSON.stringify(e.oldValue)&&(n=!0)}}return n?Mt(e.objectId,e.path):(Q({objectId:e.objectId,path:e.path,value:e.oldValue},{trackHistory:!1,persist:!0,emitEvent:!0}),e.objectId?pi(e.objectId):Nn()),console.log("[CONFIG] Undo:",e.path),!0}function hi(){var i;if(typeof window=="undefined")return!1;let s=window.__configChangeRedo||[];if(s.length===0)return!1;let e=s.pop();if(e.changeType==="object_create"){let{screenId:n,objectConfigId:a}=e.metadata||{},r=e.newValue;return e.objectId&&n&&r&&fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:n,instanceId:e.objectId,objectConfigId:a||((i=r==null?void 0:r.identity)==null?void 0:i.id),config:r})}).catch(l=>console.error("[CONFIG] Failed to recreate object on redo:",l)),window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Redo: Recreated object",e.objectId),!0}if(e.changeType==="object_delete"){let{screenId:n}=e.metadata||{};return e.objectId&&n&&fetch("/api/objects/delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e.objectId,screenId:n})}).catch(r=>console.error("[CONFIG] Failed to delete object on redo:",r)),window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Redo: Deleted object",e.objectId),!0}return window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType}),Q({objectId:e.objectId,path:e.path,value:e.oldValue},{trackHistory:!1,persist:!0,emitEvent:!0}),e.objectId?pi(e.objectId):Nn(),console.log("[CONFIG] Redo:",e.path),!0}function Ds(s,e,t){var n;if(typeof window=="undefined")return;window.__configChanges=window.__configChanges||[];let i=window.__configChanges;i.push({objectId:s,path:"__object_create__",oldValue:null,newValue:t,ts:Date.now(),changeType:"object_create",metadata:{screenId:e,objectConfigId:(n=t==null?void 0:t.identity)==null?void 0:n.id}}),window.__configChangeRedo=[],i.length>Hn&&i.shift(),console.log("[CONFIG] Tracked object creation:",s)}function Ns(s,e,t){if(typeof window=="undefined")return;window.__configChanges=window.__configChanges||[];let i=window.__configChanges;i.push({objectId:s,path:"__object_delete__",oldValue:t,newValue:null,ts:Date.now(),changeType:"object_delete",metadata:{screenId:e}}),window.__configChangeRedo=[],i.length>Hn&&i.shift(),console.log("[CONFIG] Tracked object deletion:",s)}function Pt(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;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]=(r=a[o])!=null?r:{},a=a[o]}a[n]=t}function Hs(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function Y(s){if(s===null||typeof s!="object")return s;if(s instanceof Date)return new Date(s.getTime());if(s instanceof Set)return new Set([...s].map(t=>Y(t)));if(ArrayBuffer.isView(s))return s.slice();if(s instanceof Array)return s.map(t=>Y(t));if(s instanceof Map){let t=new Map;return s.forEach((i,n)=>t.set(n,Y(i))),t}let e={};for(let t in s)Object.prototype.hasOwnProperty.call(s,t)&&(e[t]=Y(s[t]));return e}function Be(){let s=window.__editableConfigBaseline;if(!s){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return js(e)}return js(s)}function js(s){let e={objects:{},scenes:{},engine:Y(s.engine||{})},t=s.objects;if(t instanceof Map)t.forEach((a,r)=>{e.objects[r]=Y(a)});else if(t&&typeof t=="object")for(let a in t)e.objects[a]=Y(t[a]);let i=s.scenes;if(i instanceof Map)i.forEach((a,r)=>{e.scenes[r]=Y(a)});else if(i&&typeof i=="object")for(let a in i)e.scenes[a]=Y(i[a]);let n=Z();for(let a of n)a.objectId?(e.objects[a.objectId]||(e.objects[a.objectId]={}),Pt(e.objects[a.objectId],a.path,a.value)):a.sceneId?(e.scenes[a.sceneId]||(e.scenes[a.sceneId]={}),Pt(e.scenes[a.sceneId],a.path,a.value)):Pt(e.engine,a.path,a.value);return e}function Pe(){let s=Z(),e=new Set;for(let t of s)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:s.length,hasChanges:s.length>0,overrides:s}}async function mi(s){let e=Be(),t={};for(let[n,a]of Object.entries(e.objects)){let r=a,o=n;/^(json\.|ui\.|effects\.|engine\.)/.test(o)||(o=`json.${n}`),r&&typeof r=="object"&&(r.identity||(r.identity={}),r.identity.id=o),t[`objects/${o}.json`]=r}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 r=n.startsWith("scene.")?n:`scene.${n}`;t[`scenes/${r}.json`]=a}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Z().length>0,versionName:s})});if(!i.ok){let n=await i.json();throw new Error(`Apply failed: ${n.error||"Unknown error"}`)}ae();try{let n=di();n&&(window.__editableConfigBaseline=Y(n))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function jt(){ae(),window.location.reload()}async function fi(){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"}`)}ae(),window.location.reload()}var Rs,Hn,$s,K=be(()=>{"use strict";Rs="handler_preview_override_mode";if(typeof window!="undefined"){let s=window.localStorage.getItem(Rs);window.__enableConfigOverrides=s===null?!0:s==="true"}Hn=500;$s={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[],window.__configChangeRedo=[]}}});function Ko(s,e){try{if(typeof s=="object"&&s!==null)return s;if(typeof s!="string")return null;if(s.startsWith("data:")){let i=s.indexOf(",");if(i===-1)return null;let n=s.slice(0,i);if(!n.includes("application/json")&&!n.includes("text/plain"))return null;let a=s.slice(i+1),r=n.includes("base64")?typeof atob=="function"?atob(a):a:decodeURIComponent(a);return JSON.parse(r)}let t=s.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(s):null}catch{return null}}function Xo(s){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=s.replace(/^\.\/+/,""),i=t.split("/").pop()||t,n=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let a of n){let r=e[a];if(r){let o=Ko(r,a);if(o!==null)return o}}return null}async function _t(s){if(Bn.has(s)&&!Gn)return console.log(`[CONFIG] Using cached config for: "${s}"`),Bn.get(s);if(console.log(`[CONFIG] loadConfigFile called with: "${s}", MODE: ${B.toUpperCase()}, CACHE: ${Gn?"DISABLED":"ENABLED"}`),B==="publish"){let i=Xo(s);return i?(console.log(`[CONFIG] \u2713 Loaded ${s} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${s} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}B==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${s}"`);let e;B==="brand"?e=[`./${s.split("/").pop()||s}`,`./${s}`,`./${s.replace(/^configs\//,"")}`,`./${s.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${s}`,`./${s.replace(/^configs\//,"")}`,`./${s.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=Gn?"no-store":"force-cache";for(let n of e)try{let a=await fetch(n,{cache:i});if(!a.ok)continue;let r=await a.json();return console.log(`[CONFIG] \u2713 Loaded ${s} via ${n}`,r),r}catch(a){console.warn(`[CONFIG] \u2717 Failed to load ${n} (mode: ${B}):`,a)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${s}; using defaults`),{}})();return Bn.set(s,t),t}async function bi(){console.log("[CONFIG] Loading component schemas...");let s=["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 s)try{let i=B==="publish"||B==="brand"?t.split("/").pop()||t:`configs/${t}`,n=await _t(i);n.component&&(e.set(n.component,n),console.log(`[CONFIG] \u2713 Schema loaded: ${n.component} ${B==="publish"||B==="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 Me(s){console.log(`[CONFIG] Loading object config: ${s}`);let e=B==="publish"||B==="brand"?`${s}.json`:`configs/objects/${s}.json`;return await _t(e)}async function yi(s){let e=new Map;if(s.objects&&Array.isArray(s.objects)){for(let t of s.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 Me(i);(!n||Object.keys(n).length===0)&&i!==t.instance_id&&(n=await Me(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 Me(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 vi(){console.log("[CONFIG] Loading engine configs...");let s=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(s.map(i=>{let n=`engine.${i}.json`,a=B==="publish"||B==="brand"?n:`configs/engine/${n}`;return _t(a)})),t=Object.fromEntries(s.map((i,n)=>[i,e[n]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(s.map(i=>{var r;let n=(r=t[i])!=null?r:{},a=Object.keys(n);return[i,a.length>0?a:"empty"]}))),t}async function Un(){return await _t(B==="publish"||B==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function wi(s="scene.main"){console.log(`[CONFIG] Loading scene config: ${s}`);let e=B==="publish"||B==="brand"?`${s}.json`:`configs/scenes/${s}.json`;return await _t(e)}function st(s,e){let t=[];if(!s.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||[])s.identity[n]||t.push(`Missing required identity field: ${n}`);for(let[n,a]of Object.entries(s)){if(n==="identity")continue;let r=e.get(n);if(r&&a&&typeof a=="object"){let o=a;for(let l of r.required||[])o[l]===void 0&&t.push(`Missing required field in ${n}: ${l}`);if(r.constraints&&typeof r.constraints=="object")for(let[l,c]of Object.entries(r.constraints)){let d=o[l];if(d!==void 0&&c&&typeof c=="object"){let p=c;typeof d=="number"&&(p.min!==void 0&&d<p.min&&t.push(`${n}.${l} value ${d} is below minimum ${p.min}`),p.max!==void 0&&d>p.max&&t.push(`${n}.${l} value ${d} is above maximum ${p.max}`))}}}}return{valid:t.length===0,errors:t}}function Ge(s,e){let t={...s},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 se(s,e,t,i){return typeof s!="number"||!Number.isFinite(s)?e:Math.min(Math.max(s,t),i)}function Bs(s,e){if(Array.isArray(s))return{x:se(s[0],e.x,-2e3,2e3),y:se(s[1],e.y,-2e3,2e3)};if(!s||typeof s!="object")return e;let{x:t,y:i}=s;return{x:se(t,e.x,-2e3,2e3),y:se(i,e.y,-2e3,2e3)}}function Jo(s,e){if(Array.isArray(s))return{x:se(s[0],e.x,0,1),y:se(s[1],e.y,0,1)};if(!s||typeof s!="object")return e;let{x:t,y:i}=s;return{x:se(t,e.x,0,1),y:se(i,e.y,0,1)}}function Zo(s){if(Array.isArray(s))return{x:se(s[0],.5,-10,10),y:se(s[1],.5,-10,10)};if(s&&typeof s=="object"){let{x:e,y:t}=s;return{x:se(e,.5,-10,10),y:se(t,.5,-10,10)}}return typeof s=="string"?s:null}async function Se(s="scene.main",e){var l,c,d,p,u,g,h,m,f,b,y,v,S,C;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await bi(),i=Z();i.length>0&&console.log(`[CONFIG] Applying ${i.length} active overrides`);let n=await wi(s);console.log(`[CONFIG] Scene config loaded: ${((l=n.objects)==null?void 0:l.length)||0} objects`);let a=await vi();console.log("[CONFIG] Loading object configs...");let r=await yi(n);console.log(`[CONFIG] Loaded ${r.size} object configs:`,Array.from(r.keys()));for(let[I,O]of r.entries()){let w=Ge(O,t),T=st(w,t);T.valid||console.warn(`Object ${I} validation errors:`,T.errors),(c=w.transform)!=null&&c.position&&(w.transform.position=Bs(w.transform.position,{x:0,y:0})),(d=w.transform)!=null&&d.offset&&(w.transform.offset=Bs(w.transform.offset,{x:0,y:0})),((p=w.transform)==null?void 0:p.anchor)!==void 0&&(w.transform.anchor=Zo(w.transform.anchor)),((u=w.transform)==null?void 0:u.position_ratio)!==void 0&&w.transform.position_ratio!==null&&(w.transform.position_ratio=Jo(w.transform.position_ratio,{x:.5,y:.5})),r.set(I,w)}if(e){if(e.objects)for(let[I,O]of e.objects.entries())r.set(I,O);e.engine&&(a.runtime={...a.runtime,...e.engine.runtime},a.assets={...a.assets,...e.engine.assets},a.splash={...(g=a.splash)!=null?g:{},...(h=e.engine.splash)!=null?h:{}})}let o={objects:r,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=Ge(o,t))),i.length>0&&It()&&ke(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(r.keys()),engine:{runtime:Object.keys((m=a.runtime)!=null?m:{}),assets:Object.keys((f=a.assets)!=null?f:{}),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((C=a.endgame)!=null?C:{})},scene:n.scene_id||"unknown"}),o}function qn(s){var t,i,n,a,r,o,l,c,d,p,u,g,h,m,f,b,y,v,S,C,I,O,w,T,j,A,k,M,L,E,x,_,P;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[R,z]of s.objects.entries()){let N=((t=z.identity)==null?void 0:t.id)||R;N.includes("character")&&(e.gameplay.character_pos=((i=z.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((n=z.transform)==null?void 0:n.scale)||1,e.gameplay.character_anim_speed=((r=(a=z.gameplay)==null?void 0:a.tuning)==null?void 0:r.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(o=z.gameplay)==null?void 0:o.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((d=(c=z.gameplay)==null?void 0:c.tuning)==null?void 0:d.relief_speed)||.22),(N.includes("gun")||N.includes("flame"))&&(e.gameplay.gun=z.gun||{},e.gameplay.gunmuzzle=((p=z.effects)==null?void 0:p.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=z.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=z.effects)==null?void 0:g.flame)||{}),N.includes("diamond")&&(e.gameplay.diamond=z),N.includes("ice")&&(e.gameplay.melt=z.melt||{},e.gameplay.melt_anchor=((h=z.transform)==null?void 0:h.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((m=z.transform)==null?void 0:m.position)||{x:0,y:0},e.gameplay.hybrid_melting=((f=z.effects)==null?void 0:f.hybrid_melting)||{},e.gameplay.physics_chunks=((b=z.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=z.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=z.hard_ice||{}),N.includes("water")&&(e.gameplay.water_drops=z),N.includes("crack")&&(e.gameplay.crack=z),N.includes("hand")&&(e.gameplay.hand=((v=z.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((S=z.transform)==null?void 0:S.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((C=z.transform)==null?void 0:C.scale)||1.5),N.includes("hazard")&&(e.gameplay.hazard=((I=z.gameplay)==null?void 0:I.tuning)||{},e.gameplay.danger_pos=((O=z.transform)==null?void 0:O.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((T=(w=z.gameplay)==null?void 0:w.tuning)==null?void 0:T.danger_pulse)||{},e.gameplay.hazard_height=((A=(j=z.gameplay)==null?void 0:j.tuning)==null?void 0:A.hazard_height)||140)}return e.gameplay.timeline=((k=s.engine.runtime)==null?void 0:k.timeline)||{},e.gameplay.drag_surface=((M=s.engine.runtime)==null?void 0:M.drag_surface)||{},e.gameplay.background=((L=s.engine.runtime)==null?void 0:L.background)||{},e.gameplay.ui_styles=((E=s.engine.runtime)==null?void 0:E.ui_styles)||{},e.gameplay.label_pulse=((x=s.engine.runtime)==null?void 0:x.label_pulse)||{},e.ui=((_=s.engine.runtime)==null?void 0:_.ui)||{},e.theme=((P=s.engine.runtime)==null?void 0:P.theme)||{},e.assets=s.engine.assets||{},e}var Fs,B,Bn,Gn,Vn=be(()=>{"use strict";K();Fs=null,B="dev";if(typeof window!="undefined"){let s=window.__BUILD_SETTINGS__;if(s!=null&&s.buildMode)Fs=s,B=s.buildMode,console.log("[CONFIG] Loaded inline build settings:",s,"buildMode:",B);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);Fs=t,B=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",B)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",B)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",B);Bn=new Map,Gn=B==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function Wn(s,e){let t=[];function i(n,a,r=""){if(n!==a){if(typeof n!=typeof a){t.push(`${r}: 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=r?`${r}.${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(`${r}: changed`)}}return i(s,e),t}function Yn(s,e,t,i){let n={...t};for(let[a,r]of i.entries())n[a]&&r.defaults&&(n[a]={...r.defaults,...n[a]});return n}var Ot,Ue,Kn=be(()=>{"use strict";Ot=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},Ue=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(),r=this.hashString(a),o=this.fileHashes.get(e);if(o&&o!==r&&console.log(`[HOT-RELOAD] File changed: ${e}`),o&&o!==r){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,r)}else o||this.fileHashes.set(e,r)}}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(s){if(typeof window=="undefined")return;let e=typeof Xn!="undefined"&&!!Xn.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let n=null,a=!1,r=null;if(t){r=new Ue;let h=window.__configWatcher;h!=null&&h.stop&&h.stop(),window.__configWatcher=r}let o=new Set,l=h=>{var b,y;if(!r)return;let m=new Set;m.add("configs/engine/engine.runtime.json"),m.add("configs/engine/engine.assets.json"),m.add("configs/engine/engine.splash.json"),m.add("configs/scenes/scene.main.json");let f=(y=(b=h.scene)==null?void 0:b.objects)!=null?y:[];for(let v of f)v!=null&&v.object_config&&m.add(`configs/objects/${v.object_config}.json`);for(let v of o)m.has(v)||r.unwatch(v);for(let v of m)o.has(v)||r.watch(v,S=>g(S));o=m},c=new Set,d=!1,p=async h=>{let m=await Me(h),f=Ge(m,s.activeConfig.schemas),b=st(f,s.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${h} validation errors:`,b.errors),await s.liveEditBridge.applyObjectConfig(h,f)};async function u(h){if(!a){a=!0;try{if(d||c.size===0){s.audioSystem.destroy();let m=await Se("scene.main");s.setActiveConfig(m),s.gameObjectManager.updateConfig(m),s.CustomAssets.updateConfig(m),await s.CustomAssets.ready();let f=s.createAudioSystem(m);s.setAudioSystem(f),window.__audioSystem=f,await f.start(),s.liveEditBridge.rebuildIndexes(),l(m),console.log(`[GAME] Hot-reload complete (${h})`)}else{let m=Array.from(c);c.clear();for(let f of m)await p(f);console.log(`[GAME] Hot-reload updated objects: ${m.join(", ")}`)}}catch(m){console.warn("[GAME] Hot-reload failed:",m)}finally{a=!1,d=!1,c.clear()}}}function g(h){h.type==="object"&&h.objectId?c.add(h.objectId):d=!0,n&&window.clearTimeout(n),n=window.setTimeout(()=>{u(h.type)},120)}e&&Xn.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(s.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${o.size} files)`))}var Xn,Gs=be(()=>{"use strict";Kn();Vn();Xn={}});var Us={};St(Us,{ConfigWatcher:()=>Ue,DefaultReloadStrategy:()=>Ot,applyDefaults:()=>Ge,diffConfigs:()=>Wn,loadAllObjectConfigs:()=>yi,loadComponentSchemas:()=>bi,loadEngineConfig:()=>vi,loadGamePromptConfig:()=>Un,loadObjectCentricConfig:()=>Se,loadObjectConfig:()=>Me,loadSceneConfig:()=>wi,rehydrateObject:()=>Yn,setupHotReload:()=>Jn,toLegacyFormat:()=>qn,validateObjectConfig:()=>st});var xi=be(()=>{"use strict";Vn();Kn();Gs()});var Mr={};St(Mr,{AssetEditorModal:()=>Ia});var Ia,Ma=be(()=>{"use strict";Ia=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 io=Object.create;var Zt=Object.defineProperty;var no=Object.getOwnPropertyDescriptor;var ao=Object.getOwnPropertyNames;var so=Object.getPrototypeOf,ro=Object.prototype.hasOwnProperty;var be=(s,e)=>()=>(s&&(e=s(s=0)),e);var St=(s,e)=>{for(var t in e)Zt(s,t,{get:e[t],enumerable:!0})},Ya=(s,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ao(e))!ro.call(s,n)&&n!==t&&Zt(s,n,{get:()=>e[n],enumerable:!(i=no(e,n))||i.enumerable});return s};var Ze=(s,e,t)=>(t=s!=null?io(so(s)):{},Ya(e||!s||!s.__esModule?Zt(t,"default",{value:s,enumerable:!0}):t,s)),oo=s=>Ya(Zt({},"__esModule",{value:!0}),s);var ne,ii=be(()=>{"use strict";ne=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()}};ne.store=new Map});function mo(){var s,e;try{let t=typeof window!="undefined"&&(document.querySelector('script[src*="inline-assets.js"]')||((e=(s=document.querySelector("script"))==null?void 0:s.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 bo(){try{if(typeof window!="undefined"){let s=await fetch("./build-settings.json");if(s.ok){let e=await s.json();return console.log("[AssetLoader] Loaded build settings:",e),e}}}catch{}return null}function yo(){try{if(typeof window!="undefined"){let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);return console.log("[AssetLoader] Loaded build settings (sync):",e),e}}}catch{}return null}async function vo(){if(console.log(`[AssetLoader] getInlineAssets() called - Effective mode: ${G}`),Object.keys(ye).length>0)return console.log("[AssetLoader] Returning cached inline assets:",Object.keys(ye)),ye;if(typeof window!="undefined"&&window.INLINE_ASSETS)return console.log("[AssetLoader] Using pre-loaded INLINE_ASSETS from window:",Object.keys(window.INLINE_ASSETS)),ye={...window.INLINE_ASSETS},ye;if(!(G==="publish"&&pe!==!1))return console.log("[AssetLoader] Inline assets disabled for this build mode."),ye;if(!kn){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),kn=(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 r=new Function("return "+a)();return console.log("[AssetLoader] Parsed inline assets:",Object.keys(r)),r}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 ye=await kn,console.log("[AssetLoader] Final inline assets cache:",Object.keys(ye)),ye}function Pn(s){return s===null||typeof s!="object"||(Object.freeze(s),Object.values(s).forEach(e=>Pn(e))),s}function wo(s=64,e=64,t=16711680){let i=document.createElement("canvas");i.width=s,i.height=e;let n=i.getContext("2d");return n.fillStyle=`#${t.toString(16).padStart(6,"0")}`,n.fillRect(0,0,s,e),n.strokeStyle="#000",n.strokeRect(0,0,s,e),n.fillStyle="#fff",n.font="10px sans-serif",n.textAlign="center",n.fillText("MISSING",s/2,e/2),ve.Texture.from(i)}function In(s,e){Ts.set(s,e)}var ve,As,Ls,Ne,G,pe,Te,ye,kn,Ts,He,ni=be(()=>{"use strict";ve=require("pixi.js");ii();As=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Ls=mo(),Ne=typeof window!="undefined"?window.__BUILD_SETTINGS__:null,G=Ls?"publish":As,pe=Ne==null?void 0:Ne.assetsInlined;Ne!=null&&Ne.buildMode&&(G=Ne.buildMode,console.log(`[AssetLoader] Build mode overridden by inline settings: ${G}`));Te=yo();Te!=null&&Te.buildMode&&(G=Te.buildMode,console.log(`[AssetLoader] Build mode overridden by sync settings: ${G}`));(Te==null?void 0:Te.assetsInlined)!==void 0&&(pe=Te.assetsInlined);bo().then(s=>{s!=null&&s.buildMode&&s.buildMode!==G&&(G=s.buildMode,console.log(`[AssetLoader] Build mode overridden by settings: ${G}`)),(s==null?void 0:s.assetsInlined)!==void 0&&(pe=s.assetsInlined)}).catch(()=>{});console.log(`[AssetLoader] MODULE LOADED - Compile: ${As}, Runtime: ${Ls?"publish":"dev"}, Effective: ${G}`);ye={},kn=null;Ts=new Map;He=class{static async load(e,t,i,n){let a=`${e}:${t.path}`,r=ne.get(a);if(r!==void 0)return r;console.log(`[AssetLoader] Loading asset: ${e}, type: ${t.type}, Effective mode: ${G}`),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 vo(),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 p=t.path.split("/");if(p.length>=2){let u=p[p.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"),G==="publish"&&pe!==!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 d=Ts.get(t.type);if(d)try{let p=await d(t.path,l,e,i);return ne.set(a,p),p}catch(p){return this.handleFailure(e,t.type,p)}try{let p;switch(t.type){case"image":p=await this.loadImage(t.path,l);break;case"json":p=await this.loadJSON(t.path,l),p=Pn(p);break;default:throw new Error(`Unknown asset type: ${t.type}`)}return ne.set(a,p),p}catch(p){return this.handleFailure(e,t.type,p)}}static async loadImage(e,t){let i=G==="publish",n=i&&pe!==!1;if(console.log(`[AssetLoader] loadImage - Effective mode: ${G}, 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 ve.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 ve.Assets.load(t)}catch(a){return console.error("[AssetLoader] Failed to load texture from data URI, falling back to path:",a),await ve.Assets.load(e)}return await ve.Assets.load(e)}static async loadJSON(e,t){let i=G==="publish",n=i&&pe!==!1;if(console.log(`[AssetLoader] loadJSON - Effective mode: ${G}, 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 r=atob(t.split(",")[1]);return JSON.parse(r)}return JSON.parse(t)}if(t){if(typeof t=="object"&&t!==null)return t;if(typeof t=="string"&&t.startsWith("data:")){let r=atob(t.split(",")[1]);return JSON.parse(r)}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(G==="dev"){let a=t==="image"?wo():Pn({__placeholder:!0,type:t});return ne.set(e+":"+((i==null?void 0:i.path)||"missing"),a),a}throw i}};In("image",async(s,e)=>{let t=G==="publish",i=t&&pe!==!1,n=G==="brand",a=t&&pe===!1;if(console.log(`[AssetLoader] registerType('image') - Effective mode: ${G}, 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: ${s}`);if(typeof e!="string"||!e.startsWith("data:"))throw new Error(`[AssetLoader] Publish mode: inline asset must be data URI string, got: ${typeof e}`);return ve.Assets.load(e)}let r=s;return(n||a)&&s&&!s.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(r=s,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${s}" as-is`)):(r=`assets/${s}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${s}" -> "${r}"`))),ve.Assets.load(e||r)});In("json",async(s,e)=>{let t=G==="publish",i=t&&pe!==!1,n=G==="brand",a=t&&pe===!1;if(console.log(`[AssetLoader] registerType('json') - Effective mode: ${G}, 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: ${s}`);return typeof e=="object"&&e!==null?e:typeof e=="string"&&e.startsWith("data:")?JSON.parse(atob(e.split(",")[1])):JSON.parse(e)}let r=s;if((n||a)&&s&&!s.startsWith("assets/")&&(typeof window!="undefined"&&!document.querySelector('link[href*="assets/"], script[src*="assets/"]')&&!document.querySelector('link[href*="configs/"], script[src*="configs/"]')?(r=s,console.log(`[AssetLoader] BRAND MODE: flattened build, using path "${s}" as-is`)):(r=`assets/${s}`,console.log(`[AssetLoader] BRAND MODE: transformed path "${s}" -> "${r}"`))),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(r);if(!o.ok)throw new Error(`JSON fetch failed: ${s}`);return o.json()})});var Ps={};St(Ps,{AssetTextures:()=>ge,initAssetTextures:()=>_n});function _n(s,e){ks.init(s,e),typeof window!="undefined"&&(window.__AssetTextures=ge)}var jn,ks,ge,it=be(()=>{"use strict";ni();jn=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 r;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=(r=l.render)==null?void 0:r.asset;if(!c)continue;let d=async()=>{var p;try{let u=(p=l.identity)==null?void 0:p.id;console.log(`[AssetTextures] Loading ${c.type}: ${o} (${u})`);let g=await He.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(d()):a.push(d())}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,d,p;try{let u=(d=(c=(l=this.config)==null?void 0:l.objects)==null?void 0:c.get)==null?void 0:d.call(c,o);return!!((p=u==null?void 0:u.render)!=null&&p.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 r=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(),r>0&&setTimeout(()=>{l||(l=!0,this.waiters.delete(c),console.warn("[AssetTextures] waitFor timed out; continuing",{ids:n}),o())},r)})}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())}},ks=new jn,ge=new Proxy(ks,{get(s,e){return e in s&&typeof s[e]=="function"?s[e].bind(s):s.get(e)},set(s,e,t){return s.set(e,t),!0}})});var Ie={};St(Ie,{applyConfigOverride:()=>ee,applyConfigOverrides:()=>ke,applyConfigsToDisk:()=>fi,clearConfigOverrides:()=>se,clearConfigOverridesForObject:()=>zs,configOverrideManager:()=>$s,deepClone:()=>Y,exportConfigsAsJSON:()=>Be,getConfigOverrides:()=>Z,getConfigStateSummary:()=>Pe,getOverrideMode:()=>It,redoLastConfigChange:()=>hi,removeConfigOverride:()=>Mt,resetToApplied:()=>jt,resetToOriginal:()=>mi,setOverrideMode:()=>Fn,trackObjectCreation:()=>Ds,trackObjectDeletion:()=>Ns,undoLastConfigChange:()=>gi});function di(){return typeof window=="undefined"?null:window.__editableConfig||null}function Dn(){return typeof window=="undefined"?null:window.__editableConfigBaseline||null}function $n(s,e){var t,i;if(!s)return null;try{if(s instanceof Map)return(t=s.get(e))!=null?t:null;if(typeof s=="object")return(i=s[e])!=null?i:null}catch{}return null}function Vo(s,e,t){if(s){if(s instanceof Map){s.set(e,t);return}typeof s=="object"&&(s[e]=t)}}function _s(s,e){for(let t of e)Pt(s,t.path,t.value)}function pi(s){var o;if(typeof window=="undefined")return;let e=di();if(!e)return;let t=Dn(),i=(o=t?$n(t.objects,s):null)!=null?o:$n(e.objects,s);if(!i)return;let n=Y(i),a=Z().filter(l=>l.objectId===s);try{_s(n,a)}catch(l){console.error("[CONFIG] Failed to reapply overrides for object",s,l);return}Vo(e.objects,s,n);let r=window.applyEditableObjectConfig;if(typeof r=="function")try{r(s,n)}catch{}}function Nn(){var n;if(typeof window=="undefined")return;let s=di();if(!(s!=null&&s.engine))return;let e=Dn(),t=Y(((n=e==null?void 0:e.engine)!=null?n:s.engine)||{}),i=Z().filter(a=>!a.objectId&&!a.sceneId);try{_s(t,i)}catch(a){console.error("[CONFIG] Failed to reapply engine overrides",a);return}try{let a=s.engine;for(let r of Object.keys(a))r in t||delete a[r];for(let[r,o]of Object.entries(t))a[r]=o}catch{s.engine=t}}function Wo(){if(typeof window=="undefined")return"unknown";let s=window;return typeof s.__HANDLER_PROJECT_ID=="string"?s.__HANDLER_PROJECT_ID:"handler-default"}function Os(){return`handler_preview_config_overrides::${Wo()}`}function Yo(){if(typeof window=="undefined")return[];try{let s=window.localStorage.getItem(Os());if(!s)return[];let e=JSON.parse(s);return Array.isArray(e)?e:[]}catch{return[]}}function ui(s){if(typeof window!="undefined")try{window.localStorage.setItem(Os(),JSON.stringify(s))}catch{}}function It(){return typeof window=="undefined"?!1:window.__enableConfigOverrides===!0}function Fn(s){if(typeof window!="undefined"){window.__enableConfigOverrides=s;try{window.localStorage.setItem(Rs,s?"true":"false")}catch{}}}function ee(s,e={}){var u,g;let{objectId:t,path:i,value:n}=s,{silent:a=!1,persist:r=!0,emitEvent:o=!0}=e,l=di();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 d;try{d=Hs(c,i),Pt(c,i,n)}catch(h){console.error("[CONFIG] applyConfigOverride failed:",{objectId:t,path:i,value:n},h);return}if(e.trackHistory!==!1){window.__configChanges=window.__configChanges||[];let h=window.__configChanges;h.push({objectId:t,path:i,oldValue:d,newValue:n,ts:Date.now()}),h.length>Hn&&h.shift(),window.__configChangeRedo=[]}if(r){let h=Z(),f=h.findIndex(m=>m.objectId===t&&m.sceneId===s.sceneId&&m.path===i);f>=0?h[f].value=n:h.push(s),window.__configOverrides=h,ui(h),It()||Fn(!0)}a||console.log("[CONFIG] Applied override:",s),o&&typeof window!="undefined"&&window.dispatchEvent(new CustomEvent("config:changed",{detail:s}))}function ke(s,e={}){let t=e.emitEvent!==!1,i=[];for(let n of s)n!=null&&n.objectId&&typeof n.objectId=="string"&&i.push(n.objectId),ee(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:s.length}}))}}function se(){window.__configOverrides=[],window.__configChanges=[],window.__configChangeRedo=[],ui([]),console.log("[CONFIG] Cleared all overrides")}function zs(s){let e=Z().filter(i=>i.objectId!==s);window.__configOverrides=e,ui(e);let t=window.__configChanges||[];window.__configChanges=t.filter(i=>i.objectId!==s),pi(s),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"clear_object",objectId:s}}))}function Mt(s,e){let t=Z().filter(n=>n.objectId!==s||n.path!==e);window.__configOverrides=t,ui(t);let i=window.__configChanges||[];window.__configChanges=i.filter(n=>n.objectId!==s||n.path!==e),s?pi(s):Nn(),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"remove",objectId:s,path:e}}))}function Z(){return typeof window=="undefined"?[]:(window.__configOverrides||(window.__configOverrides=Yo()),window.__configOverrides||[])}function gi(){var a;if(typeof window=="undefined")return!1;let s=window.__configChanges||[];if(s.length===0)return!1;let e=s.pop();window.__configChangeRedo=window.__configChangeRedo||[];let t=window.__configChangeRedo;if(e.changeType==="object_create"){let{screenId:r}=e.metadata||{};return e.objectId&&r&&fetch("/api/objects/delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e.objectId,screenId:r})}).catch(o=>console.error("[CONFIG] Failed to delete object on undo:",o)),t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Undo: Deleted object",e.objectId),!0}if(e.changeType==="object_delete"){let{screenId:r,objectConfigId:o}=e.metadata||{},l=e.oldValue;return e.objectId&&r&&l&&fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:r,instanceId:e.objectId,objectConfigId:o||((a=l==null?void 0:l.identity)==null?void 0:a.id),config:l})}).catch(c=>console.error("[CONFIG] Failed to recreate object on undo:",c)),t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Undo: Recreated object",e.objectId),!0}t.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType});let i=Dn(),n=!1;if(i){let r=e.objectId?$n(i.objects,e.objectId):i.engine;if(r){let o=Hs(r,e.path);JSON.stringify(o)===JSON.stringify(e.oldValue)&&(n=!0)}}return n?Mt(e.objectId,e.path):(ee({objectId:e.objectId,path:e.path,value:e.oldValue},{trackHistory:!1,persist:!0,emitEvent:!0}),e.objectId?pi(e.objectId):Nn()),console.log("[CONFIG] Undo:",e.path),!0}function hi(){var i;if(typeof window=="undefined")return!1;let s=window.__configChangeRedo||[];if(s.length===0)return!1;let e=s.pop();if(e.changeType==="object_create"){let{screenId:n,objectConfigId:a}=e.metadata||{},r=e.newValue;return e.objectId&&n&&r&&fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:n,instanceId:e.objectId,objectConfigId:a||((i=r==null?void 0:r.identity)==null?void 0:i.id),config:r})}).catch(l=>console.error("[CONFIG] Failed to recreate object on redo:",l)),window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Redo: Recreated object",e.objectId),!0}if(e.changeType==="object_delete"){let{screenId:n}=e.metadata||{};return e.objectId&&n&&fetch("/api/objects/delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({objectId:e.objectId,screenId:n})}).catch(r=>console.error("[CONFIG] Failed to delete object on redo:",r)),window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType,metadata:e.metadata}),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),console.log("[CONFIG] Redo: Deleted object",e.objectId),!0}return window.__configChanges=window.__configChanges||[],window.__configChanges.push({objectId:e.objectId,path:e.path,oldValue:e.newValue,newValue:e.oldValue,ts:Date.now(),changeType:e.changeType}),ee({objectId:e.objectId,path:e.path,value:e.oldValue},{trackHistory:!1,persist:!0,emitEvent:!0}),e.objectId?pi(e.objectId):Nn(),console.log("[CONFIG] Redo:",e.path),!0}function Ds(s,e,t){var n;if(typeof window=="undefined")return;window.__configChanges=window.__configChanges||[];let i=window.__configChanges;i.push({objectId:s,path:"__object_create__",oldValue:null,newValue:t,ts:Date.now(),changeType:"object_create",metadata:{screenId:e,objectConfigId:(n=t==null?void 0:t.identity)==null?void 0:n.id}}),window.__configChangeRedo=[],i.length>Hn&&i.shift(),console.log("[CONFIG] Tracked object creation:",s)}function Ns(s,e,t){if(typeof window=="undefined")return;window.__configChanges=window.__configChanges||[];let i=window.__configChanges;i.push({objectId:s,path:"__object_delete__",oldValue:t,newValue:null,ts:Date.now(),changeType:"object_delete",metadata:{screenId:e}}),window.__configChangeRedo=[],i.length>Hn&&i.shift(),console.log("[CONFIG] Tracked object deletion:",s)}function Pt(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;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]=(r=a[o])!=null?r:{},a=a[o]}a[n]=t}function Hs(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function Y(s){if(s===null||typeof s!="object")return s;if(s instanceof Date)return new Date(s.getTime());if(s instanceof Set)return new Set([...s].map(t=>Y(t)));if(ArrayBuffer.isView(s))return s.slice();if(s instanceof Array)return s.map(t=>Y(t));if(s instanceof Map){let t=new Map;return s.forEach((i,n)=>t.set(n,Y(i))),t}let e={};for(let t in s)Object.prototype.hasOwnProperty.call(s,t)&&(e[t]=Y(s[t]));return e}function Be(){let s=window.__editableConfigBaseline;if(!s){let e=window.__editableConfig;if(!e)throw new Error("Cannot export: no config loaded");return js(e)}return js(s)}function js(s){let e={objects:{},scenes:{},engine:Y(s.engine||{})},t=s.objects;if(t instanceof Map)t.forEach((a,r)=>{e.objects[r]=Y(a)});else if(t&&typeof t=="object")for(let a in t)e.objects[a]=Y(t[a]);let i=s.scenes;if(i instanceof Map)i.forEach((a,r)=>{e.scenes[r]=Y(a)});else if(i&&typeof i=="object")for(let a in i)e.scenes[a]=Y(i[a]);let n=Z();for(let a of n)a.objectId?(e.objects[a.objectId]||(e.objects[a.objectId]={}),Pt(e.objects[a.objectId],a.path,a.value)):a.sceneId?(e.scenes[a.sceneId]||(e.scenes[a.sceneId]={}),Pt(e.scenes[a.sceneId],a.path,a.value)):Pt(e.engine,a.path,a.value);return e}function Pe(){let s=Z(),e=new Set;for(let t of s)t.objectId?e.add(t.objectId):e.add("__engine__");return{modifiedObjects:Array.from(e),overrideCount:s.length,hasChanges:s.length>0,overrides:s}}async function fi(s){let e=Be(),t={};for(let[n,a]of Object.entries(e.objects)){let r=a,o=n;/^(json\.|ui\.|effects\.|engine\.)/.test(o)||(o=`json.${n}`),r&&typeof r=="object"&&(r.identity||(r.identity={}),r.identity.id=o),t[`objects/${o}.json`]=r}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 r=n.startsWith("scene.")?n:`scene.${n}`;t[`scenes/${r}.json`]=a}let i=await fetch("/api/apply",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t,assets:{},hadCacheAtApply:Z().length>0,versionName:s})});if(!i.ok){let n=await i.json();throw new Error(`Apply failed: ${n.error||"Unknown error"}`)}se();try{let n=di();n&&(window.__editableConfigBaseline=Y(n))}catch{}localStorage.setItem("handler_last_applied",Date.now().toString()),console.log("[Config Persistence] \u2705 Applied to disk successfully")}function jt(){se(),window.location.reload()}async function mi(){if(!confirm("This will restore all configs to their original state. All uncommitted changes in cache AND applied changes will be lost. Continue?"))return;let e=await fetch("/api/reset-to-original",{method:"POST"});if(!e.ok){let t=await e.json();throw new Error(`Reset failed: ${t.error||"Unknown error"}`)}se(),window.location.reload()}var Rs,Hn,$s,K=be(()=>{"use strict";Rs="handler_preview_override_mode";if(typeof window!="undefined"){let s=window.localStorage.getItem(Rs);window.__enableConfigOverrides=s===null?!0:s==="true"}Hn=500;$s={getCurrentConfig(){return window.__editableConfig||null},getChanges(){return window.__configChanges||[]},clearChanges(){window.__configChanges=[],window.__configChangeRedo=[]}}});function Ko(s,e){try{if(typeof s=="object"&&s!==null)return s;if(typeof s!="string")return null;if(s.startsWith("data:")){let i=s.indexOf(",");if(i===-1)return null;let n=s.slice(0,i);if(!n.includes("application/json")&&!n.includes("text/plain"))return null;let a=s.slice(i+1),r=n.includes("base64")?typeof atob=="function"?atob(a):a:decodeURIComponent(a);return JSON.parse(r)}let t=s.trim();return t.startsWith("{")||t.startsWith("[")?JSON.parse(s):null}catch{return null}}function Xo(s){if(typeof window=="undefined"||!window.INLINE_ASSETS)return null;let e=window.INLINE_ASSETS,t=s.replace(/^\.\/+/,""),i=t.split("/").pop()||t,n=[t,i,t.replace(/\.json$/,""),i.replace(/\.json$/,"")];for(let a of n){let r=e[a];if(r){let o=Ko(r,a);if(o!==null)return o}}return null}async function _t(s){if(Bn.has(s)&&!Gn)return console.log(`[CONFIG] Using cached config for: "${s}"`),Bn.get(s);if(console.log(`[CONFIG] loadConfigFile called with: "${s}", MODE: ${B.toUpperCase()}, CACHE: ${Gn?"DISABLED":"ENABLED"}`),B==="publish"){let i=Xo(s);return i?(console.log(`[CONFIG] \u2713 Loaded ${s} via INLINE_ASSETS`),i):(console.log(`[CONFIG] \u2139\uFE0F Optional config ${s} not in INLINE_ASSETS, skipping fetch in publish mode`),{})}B==="brand"||console.log(`[CONFIG] DEV MODE: Trying nested paths first, then flattened for "${s}"`);let e;B==="brand"?e=[`./${s.split("/").pop()||s}`,`./${s}`,`./${s.replace(/^configs\//,"")}`,`./${s.replace(/^configs\//,"").replace(/\//g,".")}`]:e=[`./${s}`,`./${s.replace(/^configs\//,"")}`,`./${s.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=Gn?"no-store":"force-cache";for(let n of e)try{let a=await fetch(n,{cache:i});if(!a.ok)continue;let r=await a.json();return console.log(`[CONFIG] \u2713 Loaded ${s} via ${n}`,r),r}catch(a){console.warn(`[CONFIG] \u2717 Failed to load ${n} (mode: ${B}):`,a)}return console.warn(`[CONFIG] \u2717 All attempts failed for ${s}; using defaults`),{}})();return Bn.set(s,t),t}async function bi(){console.log("[CONFIG] Loading component schemas...");let s=["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 s)try{let i=B==="publish"||B==="brand"?t.split("/").pop()||t:`configs/${t}`,n=await _t(i);n.component&&(e.set(n.component,n),console.log(`[CONFIG] \u2713 Schema loaded: ${n.component} ${B==="publish"||B==="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 Me(s){console.log(`[CONFIG] Loading object config: ${s}`);let e=B==="publish"||B==="brand"?`${s}.json`:`configs/objects/${s}.json`;return await _t(e)}async function yi(s){let e=new Map;if(s.objects&&Array.isArray(s.objects)){for(let t of s.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 Me(i);(!n||Object.keys(n).length===0)&&i!==t.instance_id&&(n=await Me(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 Me(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 vi(){console.log("[CONFIG] Loading engine configs...");let s=["runtime","assets","splash","loading","start","tutorial","endgame"],e=await Promise.all(s.map(i=>{let n=`engine.${i}.json`,a=B==="publish"||B==="brand"?n:`configs/engine/${n}`;return _t(a)})),t=Object.fromEntries(s.map((i,n)=>[i,e[n]]));return console.log("[CONFIG] Engine configs loaded:",Object.fromEntries(s.map(i=>{var r;let n=(r=t[i])!=null?r:{},a=Object.keys(n);return[i,a.length>0?a:"empty"]}))),t}async function Un(){return await _t(B==="publish"||B==="brand"?"game.prompt.json":"configs/engine/game.prompt.json")}async function wi(s="scene.main"){console.log(`[CONFIG] Loading scene config: ${s}`);let e=B==="publish"||B==="brand"?`${s}.json`:`configs/scenes/${s}.json`;return await _t(e)}function st(s,e){let t=[];if(!s.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||[])s.identity[n]||t.push(`Missing required identity field: ${n}`);for(let[n,a]of Object.entries(s)){if(n==="identity")continue;let r=e.get(n);if(r&&a&&typeof a=="object"){let o=a;for(let l of r.required||[])o[l]===void 0&&t.push(`Missing required field in ${n}: ${l}`);if(r.constraints&&typeof r.constraints=="object")for(let[l,c]of Object.entries(r.constraints)){let d=o[l];if(d!==void 0&&c&&typeof c=="object"){let p=c;typeof d=="number"&&(p.min!==void 0&&d<p.min&&t.push(`${n}.${l} value ${d} is below minimum ${p.min}`),p.max!==void 0&&d>p.max&&t.push(`${n}.${l} value ${d} is above maximum ${p.max}`))}}}}return{valid:t.length===0,errors:t}}function Ge(s,e){let t={...s},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 re(s,e,t,i){return typeof s!="number"||!Number.isFinite(s)?e:Math.min(Math.max(s,t),i)}function Bs(s,e){if(Array.isArray(s))return{x:re(s[0],e.x,-2e3,2e3),y:re(s[1],e.y,-2e3,2e3)};if(!s||typeof s!="object")return e;let{x:t,y:i}=s;return{x:re(t,e.x,-2e3,2e3),y:re(i,e.y,-2e3,2e3)}}function Jo(s,e){if(Array.isArray(s))return{x:re(s[0],e.x,0,1),y:re(s[1],e.y,0,1)};if(!s||typeof s!="object")return e;let{x:t,y:i}=s;return{x:re(t,e.x,0,1),y:re(i,e.y,0,1)}}function Zo(s){if(Array.isArray(s))return{x:re(s[0],.5,-10,10),y:re(s[1],.5,-10,10)};if(s&&typeof s=="object"){let{x:e,y:t}=s;return{x:re(e,.5,-10,10),y:re(t,.5,-10,10)}}return typeof s=="string"?s:null}async function Se(s="scene.main",e){var l,c,d,p,u,g,h,f,m,b,y,v,x,L;console.log("[CONFIG] ===== Starting Object-Centric Config Load =====");let t=await bi(),i=Z();i.length>0&&console.log(`[CONFIG] Applying ${i.length} active overrides`);let n=await wi(s);console.log(`[CONFIG] Scene config loaded: ${((l=n.objects)==null?void 0:l.length)||0} objects`);let a=await vi();console.log("[CONFIG] Loading object configs...");let r=await yi(n);console.log(`[CONFIG] Loaded ${r.size} object configs:`,Array.from(r.keys()));for(let[P,O]of r.entries()){let w=Ge(O,t),k=st(w,t);k.valid||console.warn(`Object ${P} validation errors:`,k.errors),(c=w.transform)!=null&&c.position&&(w.transform.position=Bs(w.transform.position,{x:0,y:0})),(d=w.transform)!=null&&d.offset&&(w.transform.offset=Bs(w.transform.offset,{x:0,y:0})),((p=w.transform)==null?void 0:p.anchor)!==void 0&&(w.transform.anchor=Zo(w.transform.anchor)),((u=w.transform)==null?void 0:u.position_ratio)!==void 0&&w.transform.position_ratio!==null&&(w.transform.position_ratio=Jo(w.transform.position_ratio,{x:.5,y:.5})),r.set(P,w)}if(e){if(e.objects)for(let[P,O]of e.objects.entries())r.set(P,O);e.engine&&(a.runtime={...a.runtime,...e.engine.runtime},a.assets={...a.assets,...e.engine.assets},a.splash={...(g=a.splash)!=null?g:{},...(h=e.engine.splash)!=null?h:{}})}let o={objects:r,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=Ge(o,t))),i.length>0&&It()&&ke(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(r.keys()),engine:{runtime:Object.keys((f=a.runtime)!=null?f:{}),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((x=a.tutorial)!=null?x:{}),endgame:Object.keys((L=a.endgame)!=null?L:{})},scene:n.scene_id||"unknown"}),o}function qn(s){var t,i,n,a,r,o,l,c,d,p,u,g,h,f,m,b,y,v,x,L,P,O,w,k,j,C,A,M,T,E,S,_,I;let e={gameplay:{},ui:{},theme:{},assets:{}};for(let[R,z]of s.objects.entries()){let N=((t=z.identity)==null?void 0:t.id)||R;N.includes("character")&&(e.gameplay.character_pos=((i=z.transform)==null?void 0:i.position)||{x:0,y:0},e.gameplay.character_scale=((n=z.transform)==null?void 0:n.scale)||1,e.gameplay.character_anim_speed=((r=(a=z.gameplay)==null?void 0:a.tuning)==null?void 0:r.anim_speed)||.003,e.gameplay.character_relief_scale=((l=(o=z.gameplay)==null?void 0:o.tuning)==null?void 0:l.relief_scale)||1.22,e.gameplay.character_relief_speed=((d=(c=z.gameplay)==null?void 0:c.tuning)==null?void 0:d.relief_speed)||.22),(N.includes("gun")||N.includes("flame"))&&(e.gameplay.gun=z.gun||{},e.gameplay.gunmuzzle=((p=z.effects)==null?void 0:p.gunmuzzle)||{},e.gameplay.muzzle_levels=((u=z.effects)==null?void 0:u.muzzle_levels)||{},e.gameplay.flame=((g=z.effects)==null?void 0:g.flame)||{}),N.includes("diamond")&&(e.gameplay.diamond=z),N.includes("ice")&&(e.gameplay.melt=z.melt||{},e.gameplay.melt_anchor=((h=z.transform)==null?void 0:h.melt_anchor)||{x:0,y:0},e.gameplay.melt_pos=((f=z.transform)==null?void 0:f.position)||{x:0,y:0},e.gameplay.hybrid_melting=((m=z.effects)==null?void 0:m.hybrid_melting)||{},e.gameplay.physics_chunks=((b=z.effects)==null?void 0:b.physics_chunks)||{},e.gameplay.melting_particles=((y=z.effects)==null?void 0:y.melting_particles)||{},e.gameplay.hard_ice=z.hard_ice||{}),N.includes("water")&&(e.gameplay.water_drops=z),N.includes("crack")&&(e.gameplay.crack=z),N.includes("hand")&&(e.gameplay.hand=((v=z.gameplay)==null?void 0:v.tuning)||{},e.gameplay.brush_start_pos=((x=z.transform)==null?void 0:x.brush_start_pos)||{x:0,y:-120},e.gameplay.hand_scale=((L=z.transform)==null?void 0:L.scale)||1.5),N.includes("hazard")&&(e.gameplay.hazard=((P=z.gameplay)==null?void 0:P.tuning)||{},e.gameplay.danger_pos=((O=z.transform)==null?void 0:O.danger_pos)||{x:0,y:235},e.gameplay.danger_pulse=((k=(w=z.gameplay)==null?void 0:w.tuning)==null?void 0:k.danger_pulse)||{},e.gameplay.hazard_height=((C=(j=z.gameplay)==null?void 0:j.tuning)==null?void 0:C.hazard_height)||140)}return e.gameplay.timeline=((A=s.engine.runtime)==null?void 0:A.timeline)||{},e.gameplay.drag_surface=((M=s.engine.runtime)==null?void 0:M.drag_surface)||{},e.gameplay.background=((T=s.engine.runtime)==null?void 0:T.background)||{},e.gameplay.ui_styles=((E=s.engine.runtime)==null?void 0:E.ui_styles)||{},e.gameplay.label_pulse=((S=s.engine.runtime)==null?void 0:S.label_pulse)||{},e.ui=((_=s.engine.runtime)==null?void 0:_.ui)||{},e.theme=((I=s.engine.runtime)==null?void 0:I.theme)||{},e.assets=s.engine.assets||{},e}var Fs,B,Bn,Gn,Vn=be(()=>{"use strict";K();Fs=null,B="dev";if(typeof window!="undefined"){let s=window.__BUILD_SETTINGS__;if(s!=null&&s.buildMode)Fs=s,B=s.buildMode,console.log("[CONFIG] Loaded inline build settings:",s,"buildMode:",B);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);Fs=t,B=t.buildMode||"dev",console.log("[CONFIG] Loaded build settings:",t,"buildMode:",B)}else console.log("[CONFIG] No build-settings.json found, using default buildMode:",B)}catch(e){console.log("[CONFIG] Failed to load build-settings.json:",e instanceof Error?e.message:String(e))}}console.log("[CONFIG] Final buildMode:",B);Bn=new Map,Gn=B==="dev"||typeof window!="undefined"&&window.location.search.includes("hot-reload")});function Wn(s,e){let t=[];function i(n,a,r=""){if(n!==a){if(typeof n!=typeof a){t.push(`${r}: 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=r?`${r}.${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(`${r}: changed`)}}return i(s,e),t}function Yn(s,e,t,i){let n={...t};for(let[a,r]of i.entries())n[a]&&r.defaults&&(n[a]={...r.defaults,...n[a]});return n}var Ot,Ue,Kn=be(()=>{"use strict";Ot=class{shouldFullReload(e){return e.type==="component"||e.type==="scene"}getAffectedObjects(e){return e.type==="object"&&e.objectId?[e.objectId]:[]}},Ue=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(),r=this.hashString(a),o=this.fileHashes.get(e);if(o&&o!==r&&console.log(`[HOT-RELOAD] File changed: ${e}`),o&&o!==r){console.log(`[HOT-RELOAD] File changed: ${e}`);let l=this.determineEventType(e);t(l),this.fileHashes.set(e,r)}else o||this.fileHashes.set(e,r)}}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(s){if(typeof window=="undefined")return;let e=typeof Xn!="undefined"&&!!Xn.hot,t=window.location.search.includes("hot-reload");if(!(e||t))return;let n=null,a=!1,r=null;if(t){r=new Ue;let h=window.__configWatcher;h!=null&&h.stop&&h.stop(),window.__configWatcher=r}let o=new Set,l=h=>{var b,y;if(!r)return;let f=new Set;f.add("configs/engine/engine.runtime.json"),f.add("configs/engine/engine.assets.json"),f.add("configs/engine/engine.splash.json"),f.add("configs/scenes/scene.main.json");let m=(y=(b=h.scene)==null?void 0:b.objects)!=null?y:[];for(let v of m)v!=null&&v.object_config&&f.add(`configs/objects/${v.object_config}.json`);for(let v of o)f.has(v)||r.unwatch(v);for(let v of f)o.has(v)||r.watch(v,x=>g(x));o=f},c=new Set,d=!1,p=async h=>{let f=await Me(h),m=Ge(f,s.activeConfig.schemas),b=st(m,s.activeConfig.schemas);b.valid||console.warn(`[HOT-RELOAD] ${h} validation errors:`,b.errors),await s.liveEditBridge.applyObjectConfig(h,m)};async function u(h){if(!a){a=!0;try{if(d||c.size===0){s.audioSystem.destroy();let f=await Se("scene.main");s.setActiveConfig(f),s.gameObjectManager.updateConfig(f),s.CustomAssets.updateConfig(f),await s.CustomAssets.ready();let m=s.createAudioSystem(f);s.setAudioSystem(m),window.__audioSystem=m,await m.start(),s.liveEditBridge.rebuildIndexes(),l(f),console.log(`[GAME] Hot-reload complete (${h})`)}else{let f=Array.from(c);c.clear();for(let m of f)await p(m);console.log(`[GAME] Hot-reload updated objects: ${f.join(", ")}`)}}catch(f){console.warn("[GAME] Hot-reload failed:",f)}finally{a=!1,d=!1,c.clear()}}}function g(h){h.type==="object"&&h.objectId?c.add(h.objectId):d=!0,n&&window.clearTimeout(n),n=window.setTimeout(()=>{u(h.type)},120)}e&&Xn.hot.on("config-change",()=>{g({type:"hmr"})}),t&&(l(s.activeConfig),console.log(`[GAME] Hot-reload watcher enabled (${o.size} files)`))}var Xn,Gs=be(()=>{"use strict";Kn();Vn();Xn={}});var Us={};St(Us,{ConfigWatcher:()=>Ue,DefaultReloadStrategy:()=>Ot,applyDefaults:()=>Ge,diffConfigs:()=>Wn,loadAllObjectConfigs:()=>yi,loadComponentSchemas:()=>bi,loadEngineConfig:()=>vi,loadGamePromptConfig:()=>Un,loadObjectCentricConfig:()=>Se,loadObjectConfig:()=>Me,loadSceneConfig:()=>wi,rehydrateObject:()=>Yn,setupHotReload:()=>Jn,toLegacyFormat:()=>qn,validateObjectConfig:()=>st});var xi=be(()=>{"use strict";Vn();Kn();Gs()});var Mr={};St(Mr,{AssetEditorModal:()=>Ia});var Ia,Ma=be(()=>{"use strict";Ia=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(r=>{r.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(r=>{r.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",r=>{r.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 zl={};St(zl,{COLORS:()=>me,ConfigWatcher:()=>Ue,DebugPanel:()=>Ft,DefaultReloadStrategy:()=>Ot,Handler:()=>ce,PlayableLoadingScreen:()=>dn,PreviewShell:()=>on,STROKE_WIDTH:()=>Nr,THEME:()=>Hr,applyConfigOverride:()=>Q,applyConfigOverrides:()=>ke,applyConfigsToDisk:()=>mi,applyDefaults:()=>Ge,baseLottie:()=>An,bootstrap:()=>Al,clearConfigOverrides:()=>ae,clearConfigOverridesForObject:()=>zs,configOverrideManager:()=>$s,createPreviewShell:()=>Oa,deepClone:()=>Y,default:()=>De,defaultPreset:()=>Si,deviceGroups:()=>ea,devicePresets:()=>Qn,diffConfigs:()=>Wn,exportConfigsAsJSON:()=>Be,getConfigOverrides:()=>Z,getConfigStateSummary:()=>Pe,getOverrideMode:()=>It,getPresetById:()=>qe,getPresetsByCategory:()=>Qo,loadAllObjectConfigs:()=>yi,loadComponentSchemas:()=>bi,loadEngineConfig:()=>vi,loadGamePromptConfig:()=>Un,loadObjectCentricConfig:()=>Se,loadObjectConfig:()=>Me,loadSceneConfig:()=>wi,redoLastConfigChange:()=>hi,rehydrateObject:()=>Yn,removeConfigOverride:()=>Mt,resetToApplied:()=>jt,resetToOriginal:()=>fi,setBootstrapDependencies:()=>El,setOverrideMode:()=>Fn,setupHotReload:()=>Jn,setupLiveEditBridge:()=>ln,toLegacyFormat:()=>qn,trackObjectCreation:()=>Ds,trackObjectDeletion:()=>Ns,undoLastConfigChange:()=>gi,validateObjectConfig:()=>st});module.exports=oo(zl);var Le={};function Qt(s,e,t=!1){Le[s]||(Le[s]=[]),Le[s].push({fn:e,once:t})}function xn(s,e){if(Le[s]){if(!e){delete Le[s];return}Le[s]=Le[s].filter(t=>t.fn!==e)}}function ei(s,...e){let t=Le[s];if(t)for(let i of[...t])i.fn(...e),i.once&&xn(s,i.fn)}function ee(s,e){Qt(s,e,!0)}var V=null,re=[],Qe=null;function Ja(s){V=s,re=[],Qe!==null&&(clearTimeout(Qe),Qe=null)}function Za(){var s,e,t;return{endpoint:(V==null?void 0:V.endpoint)||"",transport:(V==null?void 0:V.transport)||"beacon",batchSize:(s=V==null?void 0:V.batchSize)!=null?s:10,flushIntervalMs:(e=V==null?void 0:V.flushIntervalMs)!=null?e:300,maxQueue:(t=V==null?void 0:V.maxQueue)!=null?t:200,debug:!!(V!=null&&V.debug)}}async function Ka(s,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(s,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function Sn(s,e){let t=Za();if(e&&t.endpoint){if(re.push(s),re.length>t.maxQueue&&(re=re.slice(re.length-t.maxQueue)),re.length>=t.batchSize){Xa();return}Qe===null&&(Qe=window.setTimeout(()=>{Qe=null,Xa()},t.flushIntervalMs))}}async function Xa(){let s=Za();if(!s.endpoint||re.length===0)return;let e=re.splice(0,s.batchSize);await Ka(s.endpoint,{events:e},s.transport,s.debug),re.length>0&&await Ka(s.endpoint,{events:re.splice(0,s.batchSize)},s.transport,s.debug)}function Qa(s){return Math.max(0,Math.min(1,s))}function lo(s){let e=String(s!=null?s:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function Et(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function co(s,e){let t=s==null?void 0:s[e];return typeof t=="number"?t:0}function es(s,e,t){try{s[e]=t}catch{}}function po(s){let e=s==null?void 0:s.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function ts(s,e){let t=s==null?void 0:s.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function is(s,e){let t=po(s);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function ns(){let s=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),s.size>0&&i()})},n=d=>{var u;s.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{s.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},r=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var p,u;let d=Et();for(let g of Array.from(s)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let m=g.durationMs>0?h/g.durationMs:1,f=Qa(m),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(m),b-1):0;if(g.repeat>0&&m>=1){let C=m-y;f=Qa(C)}let v=g.ease(f);g.yoyo&&y%2===1&&(v=1-v);for(let C of g.props)es(g.target,C.key,C.from+(C.to-C.from)*v);g.scaleFrom&&g.scaleTo&&ts(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{(p=g.onUpdate)==null||p.call(g)}catch{}if(m>=b){r(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var C;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((C=u==null?void 0:u.delayMsOverride)!=null?C:0)),m=lo(p.ease),f=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let I of Object.keys(p)){if(y.has(I))continue;let O=p[I];typeof O=="number"&&v.push({key:I,from:co(d,I),to:O})}let S=is(d,p);return{target:d,startMs:Et(),delayMs:h,durationMs:g,ease:m,props:v,scaleFrom:S.from,scaleTo:S.to,repeat:f,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>r(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=Et())},resume:()=>{var m;if(!u.paused)return;let g=(m=u.pauseAtMs)!=null?m:Et(),h=Et()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&es(d,g,h)}let u=is(d,p);u.to&&ts(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))r(u)},timeline(d={}){let p=[],u=0,g=!1,h=[],m=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},f=y=>{p.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 f({kind:"to",target:y,vars:v,atMs:m(S)}),b},fromTo(y,v,S,C){return f({kind:"fromTo",target:y,vars:S,from:v,atMs:m(C)}),b},play(){var y,v;if(g)return b;g=!0,h=[];for(let S of p)S.kind==="fromTo"&&c.set(S.target,(y=S.from)!=null?y:{}),h.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 h)y.pause();return b},kill(){for(let y of h)y.kill();h=[],g=!1}};return d.paused||b.play(),b}};return c}function as(){if(typeof window=="undefined")return;let s=window;if(!s.gsap)try{s.gsap=ns()}catch{}}var ss={name:"handler-playable-sdk",version:"1.0.18",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 --external jszip && 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/ && mkdir -p dist/cli/student-helper && cp src/cli/student-helper/*.mjs dist/cli/student-helper/ && chmod +x dist/cli/*.mjs dist/cli/student-helper/*.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 --external jszip && 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 dist/cli/student-helper/*.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 te=0,go=te++,rs=te++,os=te++,ls=te++,cs=te++,ds=te++,ps=te++,us=te++,gs=te++,hs=te++,ms=te++,fs=te++,U=go;function bs(){return U===rs}function ys(){return U===os}function vs(){return U===ls}function ws(){return U===cs}function et(){return U===ds}function tt(){return U===ps}function xs(){return U===us}function Ss(){return U===gs}function Es(){return U===hs}function En(){return U===ms}function Cn(){return U===fs}function Cs(){let s=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(s==="mraid")try{mraid.getState(),U=rs;return}catch{}else if(s==="dapi")try{dapi.isReady(),U=os;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(U=ls)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(U=cs)}catch{}else if(e==="mintegral")window.gameReady&&(U=ds);else if(e==="tapjoy")window.TJ_API&&(U=ps);else if(e==="tiktok")window.openAppStore&&(U=us);else if(e==="smadex")try{window.smxTracking&&(U=gs)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(U=hs)}catch{}else e==="vungle"?U=ms:(s==="nucleo"||e==="nucleo")&&(U=fs)}var ti=Ze(require("lottie-web"),1),An=ti.default;typeof window!="undefined"&&(window.lottie=ti.default,window.__baseLottie=ti.default);var ho=require("pixi.js");var Ln=require("pixi.js");var mo=null;function Tn(s){mo=s}ni();ii();var Ct=require("pixi.js");ni();var xo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Mn=xo;if(typeof window!="undefined")try{let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);e!=null&&e.buildMode&&(Mn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${Mn}`))}}catch{}function So(s){var t,i,n,a,r;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(s);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(s))return{x:(t=s[0])!=null?t:.5,y:(i=s[1])!=null?i:.5};if(s&&typeof s=="object"&&"x"in s&&"y"in s)return{x:(n=s.x)!=null?n:.5,y:(a=s.y)!=null?a:.5};if(typeof s=="string"){let o=s.trim().toLowerCase();return(r=e[o])!=null?r:{x:.5,y:.5}}return null}var pe=class{static async create(e,t,i){var l,c,d,p,u,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${Mn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let m=new Ct.Container;return this.applyTransform(m,t==null?void 0:t.transform,t),m}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let r=await He.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=r==null?void 0:r.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",r,"for object:",e),o=new Ct.Sprite(r),console.log("[ObjectFactory] Created object:",o,"type:",(p=o==null?void 0:o.constructor)==null?void 0:p.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=r==null?void 0:r.constructor)==null?void 0:u.name,r),r&&(((g=r.constructor)==null?void 0:g.name)==="Container"||r instanceof Ct.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let m=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],f=!1;for(let b of m)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=o==null?void 0:o.constructor)==null?void 0:h.name),f=!0;break}}catch{continue}f||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=r)}else o=r;else o=r,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,a,r,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((r=t.position.x)!=null?r:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=So(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 At=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 Ao=Ze(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=Ao);it();var ai=require("pixi.js");it();var On=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new At}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var o;let r=this.registry.get(a);if(!r){console.warn("[Assets] No config found for object:",a);return}try{let l=await pe.create(a,r,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await pe.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},Lo=new On,To=new Proxy(Lo,{get(s,e){if(e in s&&typeof s[e]=="function")return s[e].bind(s);if(s.get(e))return s.get(e)}});it();var Is=require("pixi.js"),oe={width:400,height:600,designWidth:400,scaleFactor:1},nt={scale:1,position:1},zn=[];function Po(s,e,t,i,n,a,r){zn.push({element:s,originalScale:a,positionHelper:e,heightPercent:n}),e(s,t,i,n,a,r,!1)}function Io(){zn.forEach(({element:s,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*oe.scaleFactor;t(s,oe.width,oe.height,i,n,!0,!1)})}function Rn(s,e){console.log(`[SCREEN] updateScreenState called: ${s}x${e}`),oe.width=s,oe.height=e,oe.scaleFactor=Math.min(s/oe.designWidth,1.15),nt.scale=oe.scaleFactor,nt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${nt.scale.toFixed(3)}`),Io()}var ge={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 Mo(s,e,t){let i=ge[s];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${s}.${e} = ${t}`))}function jo(){return ge}var _o={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 si(s,e){return typeof s=="number"&&Number.isFinite(s)?s:e}function at(s,e={x:.5,y:.5}){var t;if(Array.isArray(s))return{x:si(s[0],e.x),y:si(s[1],e.y)};if(s&&typeof s=="object"){let i=s;return{x:si(i.x,e.x),y:si(i.y,e.y)}}if(typeof s=="string"){let i=s.trim().toLowerCase();return(t=_o[i])!=null?t:e}return e}function Tt(s,e,t,i={}){var g,h,m,f,b,y;let n=at(t),a=(g=i.inset)!=null?g:{},r=(h=i.padding)!=null?h:{x:0,y:0},o=((m=a.left)!=null?m:0)+r.x,l=((f=a.right)!=null?f:0)+r.x,c=((b=a.top)!=null?b:0)+r.y,d=((y=a.bottom)!=null?y:0)+r.y,p=Math.max(0,s-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function kt(s,e,t,i={}){var m,f,b,y,v,S;let n=(m=i.inset)!=null?m:{},a=(f=i.padding)!=null?f:{x:0,y:0},r=((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,d=Math.max(0,s-r-o),p=Math.max(0,e-l-c),u=at(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:r+d*g,y:l+p*h}}if(typeof window!="undefined"){let s=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==s||n!==e)&&(s=i,e=n,Rn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),Rn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Mo,window.getDebugConfig=jo,window.copyConfig=Uo,window.applyConfig=Lt,window.applyConfigForRatio=qo,window.positionAtBottom=Ms,window.positionAtTop=zo,window.positionAtCenter=$o,window.positionAtLeft=Do,window.positionAtRight=No,window.positionAtBottomLeft=Ho,window.positionAtBottomRight=Fo,window.positionAtTopLeft=Bo,window.positionAtTopRight=Go,window.applyPositionContract=Ro,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 ri(s,e,t=0){return s*e+t}function oi(s,e,t=0){return s*(1-e)+t}function li(s,e,t=0){return s*e+t}function ci(s,e,t=0){return s*(1-e)+t}function ne(s,e=0){return s/2+e}function Oo(s,e){return s*e}function Ro(s,e,t,i){var r,o,l,c,d,p,u,g,h,m,f,b,y,v,S,C,I,O,w,T;let n=0,a=0;switch(i.type){case"top":n=ne(e,(o=(r=i.offset)==null?void 0:r.x)!=null?o:0),a=ri(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ne(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=oi(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=li(e,i.percent,(m=(h=i.offset)==null?void 0:h.x)!=null?m:0),a=ne(t,(b=(f=i.offset)==null?void 0:f.y)!=null?b:0);break;case"right":n=ci(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),a=ne(t,(C=(S=i.offset)==null?void 0:S.y)!=null?C:0);break;case"center":n=ne(e,(O=(I=i.offset)==null?void 0:I.x)!=null?O:0),a=ne(t,(T=(w=i.offset)==null?void 0:w.y)!=null?T:0);break}s.position?s.position.set(n,a):(s.x=n,s.y=a),i.scale!==void 0&&i.scale!==1&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(i.scale,i.scale):(s.scale.x=i.scale,s.scale.y=i.scale))}function Ms(s,e,t,i=.2,n=1,a=!0,r=!1){let o=Oo(t,i),l=oi(t,i/2);we(s,ne(e),l);let c=a?n*oe.scaleFactor:n;xe(s,c),r&&!zn.find(d=>d.element===s)&&Po(s,Ms,e,t,i,n,a)}function zo(s,e,t,i=.1,n=1){we(s,ne(e),ri(t,i)),xe(s,n)}function $o(s,e,t,i=0,n=0,a=1){we(s,ne(e,i),ne(t,n)),xe(s,a)}function Do(s,e,t,i=.1,n=1){we(s,li(e,i),ne(t)),xe(s,n)}function No(s,e,t,i=.1,n=1){we(s,ci(e,i),ne(t)),xe(s,n)}function Ho(s,e,t,i=.05,n=.05,a=1){we(s,li(e,n),oi(t,i)),xe(s,a)}function Fo(s,e,t,i=.05,n=.05,a=1){we(s,ci(e,n),oi(t,i)),xe(s,a)}function Bo(s,e,t,i=.05,n=.05,a=1){we(s,li(e,n),ri(t,i)),xe(s,a)}function Go(s,e,t,i=.05,n=.05,a=1){we(s,ci(e,n),ri(t,i)),xe(s,a)}function we(s,e,t){s&&s.position?typeof s.position.set=="function"?s.position.set(e,t):(s.position.x=e,s.position.y=t):s&&(s.x=e,s.y=t)}function xe(s,e){e!==1&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(e,e):s.scale.x!==void 0&&s.scale.y!==void 0&&(s.scale.x=e,s.scale.y=e))}var Fe={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 Uo(s){return s&&Fe[s]?JSON.parse(JSON.stringify(Fe[s])):JSON.parse(JSON.stringify(ge))}function Lt(s){Object.keys(s).forEach(e=>{let t=e;ge[t]&&s[t]&&Object.assign(ge[t],s[t])}),console.log("Config applied:",s)}function qo(s,e){let t=s/e;t>1.6?(Lt(Fe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Lt(Fe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Lt(Fe.square),console.log("Applied SQUARE config for ratio:",t)):(Lt(Fe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let s=window;s.configPresets=Fe,s.resolveAnchorVec2=s.resolveAnchorVec2||at,s.resolveScreenAnchorPoint=s.resolveScreenAnchorPoint||Tt,s.resolveScreenRatioPoint=s.resolveScreenRatioPoint||kt}xi();function W(s,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(s,e);return`${s/i}:${e/i}`}var dd=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:W(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:W(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:W(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:W(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:W(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:W(360,780)}],pd=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:W(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:W(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:W(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:W(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:W(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:W(412,915)}],ud=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:W(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:W(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:W(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:W(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:W(800,1280)}],Zn=[{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:W(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:W(768,1024),mraidScale:.7}];var Qn=[...Zn],ea=[{category:"playable",label:"Playable Ad",devices:Zn}],Si=Zn[0];function qe(s){return Qn.find(e=>e.id===s)||Si}function Qo(s){return Qn.filter(e=>e.category===s)}K();var je=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let r=a(e);if(!r){console.error("[PropertyUpdateManager] Config not found for:",e);return}Q({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let p=window.__editableConfig,u=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:r;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function ta(s){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let r=n.result,o=s.category||"misc",c=`${(s.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:r,overwrite:!0})})).json();if(!(p!=null&&p.success)){alert(`Upload failed: ${(p==null?void 0:p.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await s.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Ei=class{constructor(){this.updateManager=new je}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let r=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,r);break;case"ai-edit":this.openAIEditor(t,i,r);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,r);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let r=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",r),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",r)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===a||d.slotId===a)){let d=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:d,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:d,assetType:"image"}),n.categories&&!n.categories.includes(d)&&n.categories.push(d),n.libraryAssets&&!n.libraryAssets[d]&&(n.libraryAssets[d]=[]);let p=window.reRenderAssetLibrary;typeof p=="function"&&p()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let r=window.__updateWorkbenchTabs;typeof r=="function"&&r()}if(n.libraryPanel){let r=window.getEditableObjectConfig,o=r==null?void 0:r(e),l=(a=o==null?void 0:o.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var r;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((r=n==null?void 0:n.identity)==null?void 0:r.category)||(t.split(".")[0]==="render"?"environment":"ui");ta({objectId:e,category:a,onApply:async o=>{var g,h;let l=window.applyAssetToSlot,c=this.getFilenameFromPath(o),d=/render\.asset\.path/i.test(t)||/\.(png|jpg|jpeg|gif|webp)$/i.test(o);typeof l=="function"&&c&&d&&await l(e,c,a),await this.updateManager.updateProperty(e,t,o);let p=window.__debugContext;(h=(g=p==null?void 0:p.options)==null?void 0:g.onPropertyChange)==null||h.call(g,e,t,o);let u=window.__highlightLibrarySlot;typeof u=="function"&&setTimeout(()=>{u(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}getFilenameFromPath(e){if(!e)return"";let t=e.split("?")[0].replace(/\\/g,"/");return t.split("/").pop()||t}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),r=window.__editableConfig;if(!(r!=null&&r.schemas))return;let o=null;if(r.schemas instanceof Map?o=r.schemas.get(n):typeof r.schemas=="object"&&(o=r.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,r,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var el=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],tl=["environment","ui","character","system","backgrounds"],il=["bg","world","ui"],qs={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}}},Ci=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(r=>{r.addEventListener("click",()=>this.close())}),this.modal.querySelectorAll("[data-tab]").forEach(r=>{r.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",r=>{r.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 zl={};St(zl,{COLORS:()=>me,ConfigWatcher:()=>Ue,DebugPanel:()=>Ft,DefaultReloadStrategy:()=>Ot,Handler:()=>de,PlayableLoadingScreen:()=>dn,PreviewShell:()=>on,STROKE_WIDTH:()=>Nr,THEME:()=>Hr,applyConfigOverride:()=>ee,applyConfigOverrides:()=>ke,applyConfigsToDisk:()=>fi,applyDefaults:()=>Ge,baseLottie:()=>An,bootstrap:()=>Al,clearConfigOverrides:()=>se,clearConfigOverridesForObject:()=>zs,configOverrideManager:()=>$s,createPreviewShell:()=>Oa,deepClone:()=>Y,default:()=>De,defaultPreset:()=>Si,deviceGroups:()=>ea,devicePresets:()=>Qn,diffConfigs:()=>Wn,exportConfigsAsJSON:()=>Be,getConfigOverrides:()=>Z,getConfigStateSummary:()=>Pe,getOverrideMode:()=>It,getPresetById:()=>qe,getPresetsByCategory:()=>Qo,loadAllObjectConfigs:()=>yi,loadComponentSchemas:()=>bi,loadEngineConfig:()=>vi,loadGamePromptConfig:()=>Un,loadObjectCentricConfig:()=>Se,loadObjectConfig:()=>Me,loadSceneConfig:()=>wi,redoLastConfigChange:()=>hi,rehydrateObject:()=>Yn,removeConfigOverride:()=>Mt,resetToApplied:()=>jt,resetToOriginal:()=>mi,setBootstrapDependencies:()=>El,setOverrideMode:()=>Fn,setupHotReload:()=>Jn,setupLiveEditBridge:()=>ln,toLegacyFormat:()=>qn,trackObjectCreation:()=>Ds,trackObjectDeletion:()=>Ns,undoLastConfigChange:()=>gi,validateObjectConfig:()=>st});module.exports=oo(zl);var Le={};function Qt(s,e,t=!1){Le[s]||(Le[s]=[]),Le[s].push({fn:e,once:t})}function xn(s,e){if(Le[s]){if(!e){delete Le[s];return}Le[s]=Le[s].filter(t=>t.fn!==e)}}function ei(s,...e){let t=Le[s];if(t)for(let i of[...t])i.fn(...e),i.once&&xn(s,i.fn)}function te(s,e){Qt(s,e,!0)}var V=null,oe=[],Qe=null;function Ja(s){V=s,oe=[],Qe!==null&&(clearTimeout(Qe),Qe=null)}function Za(){var s,e,t;return{endpoint:(V==null?void 0:V.endpoint)||"",transport:(V==null?void 0:V.transport)||"beacon",batchSize:(s=V==null?void 0:V.batchSize)!=null?s:10,flushIntervalMs:(e=V==null?void 0:V.flushIntervalMs)!=null?e:300,maxQueue:(t=V==null?void 0:V.maxQueue)!=null?t:200,debug:!!(V!=null&&V.debug)}}async function Ka(s,e,t,i){let n=JSON.stringify(e);if(t==="beacon"&&typeof navigator!="undefined"&&typeof navigator.sendBeacon=="function")try{let a=navigator.sendBeacon(s,new Blob([n],{type:"application/json"}));i&&console.log("[handler.telemetry] beacon",a,e);return}catch(a){i&&console.warn("[handler.telemetry] beacon failed, fallback to fetch",a)}try{await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:n,keepalive:!0}),i&&console.log("[handler.telemetry] fetch",e)}catch(a){i&&console.warn("[handler.telemetry] fetch failed",a)}}function Sn(s,e){let t=Za();if(e&&t.endpoint){if(oe.push(s),oe.length>t.maxQueue&&(oe=oe.slice(oe.length-t.maxQueue)),oe.length>=t.batchSize){Xa();return}Qe===null&&(Qe=window.setTimeout(()=>{Qe=null,Xa()},t.flushIntervalMs))}}async function Xa(){let s=Za();if(!s.endpoint||oe.length===0)return;let e=oe.splice(0,s.batchSize);await Ka(s.endpoint,{events:e},s.transport,s.debug),oe.length>0&&await Ka(s.endpoint,{events:oe.splice(0,s.batchSize)},s.transport,s.debug)}function Qa(s){return Math.max(0,Math.min(1,s))}function lo(s){let e=String(s!=null?s:"power2.out");if(e==="linear")return t=>t;if(e==="sine.inOut")return t=>.5-Math.cos(Math.PI*t)/2;if(e==="power2.out"||e==="easeOutQuad")return t=>1-(1-t)*(1-t);if(e.startsWith("back.out")){let t=e.match(/back\.out\(([\d.]+)\)/),i=t?Number(t[1]):1.8;return n=>1+(i+1)*Math.pow(n-1,3)+i*Math.pow(n-1,2)}return t=>1-(1-t)*(1-t)}function Et(){return typeof performance!="undefined"&&performance.now?performance.now():Date.now()}function co(s,e){let t=s==null?void 0:s[e];return typeof t=="number"?t:0}function es(s,e,t){try{s[e]=t}catch{}}function po(s){let e=s==null?void 0:s.scale;if(!e)return null;let t=typeof e.x=="number"?e.x:1,i=typeof e.y=="number"?e.y:1;return{x:t,y:i}}function ts(s,e){let t=s==null?void 0:s.scale;if(t)try{typeof t.set=="function"?t.set(e.x,e.y):(typeof t.x=="number"&&(t.x=e.x),typeof t.y=="number"&&(t.y=e.y))}catch{}}function is(s,e){let t=po(s);if(!t)return{from:null,to:null};let i=null,n=null;return typeof e.scale=="number"?(i=e.scale,n=e.scale):e.scale&&typeof e.scale=="object"&&(typeof e.scale.x=="number"&&(i=e.scale.x),typeof e.scale.y=="number"&&(n=e.scale.y)),typeof e.scaleX=="number"&&(i=e.scaleX),typeof e.scaleY=="number"&&(n=e.scaleY),i===null&&n===null?{from:null,to:null}:{from:{x:t.x,y:t.y},to:{x:i!=null?i:t.x,y:n!=null?n:t.y}}}function ns(){let s=new Set,e=new WeakMap,t=null,i=()=>{if(t!=null)return;t=requestAnimationFrame(()=>{t=null,o(),s.size>0&&i()})},n=d=>{var u;s.add(d);let p=(u=e.get(d.target))!=null?u:new Set;p.add(d),e.set(d.target,p),i()},a=d=>{s.delete(d);let p=e.get(d.target);p&&(p.delete(d),p.size===0&&e.delete(d.target))},r=d=>{d.killed||(d.killed=!0,a(d))},o=()=>{var p,u;let d=Et();for(let g of Array.from(s)){if(g.killed||g.paused)continue;let h=d-g.startMs-g.delayMs;if(h<0)continue;let f=g.durationMs>0?h/g.durationMs:1,m=Qa(f),b=g.repeat>=0?g.repeat+1:1,y=g.repeat>0?Math.min(Math.floor(f),b-1):0;if(g.repeat>0&&f>=1){let L=f-y;m=Qa(L)}let v=g.ease(m);g.yoyo&&y%2===1&&(v=1-v);for(let L of g.props)es(g.target,L.key,L.from+(L.to-L.from)*v);g.scaleFrom&&g.scaleTo&&ts(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{(p=g.onUpdate)==null||p.call(g)}catch{}if(f>=b){r(g);try{(u=g.onComplete)==null||u.call(g)}catch{}}}},l=(d,p,u)=>{var L;let g=Math.max(0,(typeof p.duration=="number"?p.duration:.5)*1e3),h=Math.max(0,(typeof p.delay=="number"?p.delay:0)*1e3+((L=u==null?void 0:u.delayMsOverride)!=null?L:0)),f=lo(p.ease),m=typeof p.repeat=="number"?Math.max(0,p.repeat|0):0,b=p.yoyo===!0,y=new Set(["duration","delay","ease","repeat","yoyo","onUpdate","onComplete","scale","scaleX","scaleY"]),v=[];for(let P of Object.keys(p)){if(y.has(P))continue;let O=p[P];typeof O=="number"&&v.push({key:P,from:co(d,P),to:O})}let x=is(d,p);return{target:d,startMs:Et(),delayMs:h,durationMs:g,ease:f,props:v,scaleFrom:x.from,scaleTo:x.to,repeat:m,yoyo:b,onUpdate:typeof p.onUpdate=="function"?p.onUpdate:void 0,onComplete:typeof p.onComplete=="function"?p.onComplete:void 0,killed:!1,paused:!1,pauseAtMs:null}},c={to(d,p){let u=l(d,p);return n(u),{kill:()=>r(u),pause:()=>{u.paused||(u.paused=!0,u.pauseAtMs=Et())},resume:()=>{var f;if(!u.paused)return;let g=(f=u.pauseAtMs)!=null?f:Et(),h=Et()-g;u.startMs+=h,u.paused=!1,u.pauseAtMs=null},isActive:()=>!u.killed&&!u.paused}},fromTo(d,p,u){return c.set(d,p),c.to(d,u)},set(d,p){if(!d||!p)return;for(let g of Object.keys(p)){let h=p[g];g==="scale"||g==="scaleX"||g==="scaleY"||typeof h=="number"&&es(d,g,h)}let u=is(d,p);u.to&&ts(d,u.to)},killTweensOf(d){let p=e.get(d);if(p)for(let u of Array.from(p))r(u)},timeline(d={}){let p=[],u=0,g=!1,h=[],f=y=>{if(typeof y=="number")return Math.max(0,y*1e3);let v=typeof y=="string"?y.trim():"";return v.startsWith("+=")?u+Math.max(0,Number(v.slice(2))*1e3||0):v?Math.max(0,Number(v)*1e3||0):u},m=y=>{p.push(y);let v=Math.max(0,(typeof y.vars.duration=="number"?y.vars.duration:.5)*1e3);u=Math.max(u,y.atMs+v)},b={to(y,v,x){return m({kind:"to",target:y,vars:v,atMs:f(x)}),b},fromTo(y,v,x,L){return m({kind:"fromTo",target:y,vars:x,from:v,atMs:f(L)}),b},play(){var y,v;if(g)return b;g=!0,h=[];for(let x of p)x.kind==="fromTo"&&c.set(x.target,(y=x.from)!=null?y:{}),h.push(c.to(x.target,{...x.vars,delay:x.atMs/1e3+((v=x.vars.delay)!=null?v:0)}));return b},pause(){for(let y of h)y.pause();return b},kill(){for(let y of h)y.kill();h=[],g=!1}};return d.paused||b.play(),b}};return c}function as(){if(typeof window=="undefined")return;let s=window;if(!s.gsap)try{s.gsap=ns()}catch{}}var ss={name:"handler-playable-sdk",version:"1.0.21",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 --external jszip && 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/ && mkdir -p dist/cli/student-helper && cp src/cli/student-helper/*.mjs dist/cli/student-helper/ && chmod +x dist/cli/*.mjs dist/cli/student-helper/*.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 --external jszip && 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 dist/cli/student-helper/*.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 ie=0,go=ie++,rs=ie++,os=ie++,ls=ie++,cs=ie++,ds=ie++,ps=ie++,us=ie++,gs=ie++,hs=ie++,fs=ie++,ms=ie++,U=go;function bs(){return U===rs}function ys(){return U===os}function vs(){return U===ls}function ws(){return U===cs}function et(){return U===ds}function tt(){return U===ps}function xs(){return U===us}function Ss(){return U===gs}function Es(){return U===hs}function En(){return U===fs}function Cn(){return U===ms}function Cs(){let s=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none",e=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed";if(s==="mraid")try{mraid.getState(),U=rs;return}catch{}else if(s==="dapi")try{dapi.isReady(),U=os;return}catch{}if(e==="facebook")try{typeof FbPlayableAd!="undefined"&&(U=ls)}catch{}else if(e==="google")try{typeof ExitApi!="undefined"&&(U=cs)}catch{}else if(e==="mintegral")window.gameReady&&(U=ds);else if(e==="tapjoy")window.TJ_API&&(U=ps);else if(e==="tiktok")window.openAppStore&&(U=us);else if(e==="smadex")try{window.smxTracking&&(U=gs)}catch{}else if(e==="snapchat")try{window.ScPlayableAd&&(U=hs)}catch{}else e==="vungle"?U=fs:(s==="nucleo"||e==="nucleo")&&(U=ms)}var ti=Ze(require("lottie-web"),1),An=ti.default;typeof window!="undefined"&&(window.lottie=ti.default,window.__baseLottie=ti.default);var ho=require("pixi.js");var Ln=require("pixi.js");var fo=null;function Tn(s){fo=s}ni();ii();var Ct=require("pixi.js");ni();var xo=typeof __BUILD_MODE__!="undefined"?__BUILD_MODE__:"undefined",Mn=xo;if(typeof window!="undefined")try{let s=new XMLHttpRequest;if(s.open("GET","./build-settings.json",!1),s.send(),s.status===200&&s.responseText){let e=JSON.parse(s.responseText);e!=null&&e.buildMode&&(Mn=e.buildMode,console.log(`[ObjectFactory] Build mode overridden by settings: ${Mn}`))}}catch{}function So(s){var t,i,n,a,r;if(typeof window!="undefined"&&window.resolveAnchorVec2)return window.resolveAnchorVec2(s);let e={center:{x:.5,y:.5},"top-left":{x:0,y:0},"top-center":{x:.5,y:0},"top-right":{x:1,y:0},"center-left":{x:0,y:.5},"center-right":{x:1,y:.5},"bottom-left":{x:0,y:1},"bottom-center":{x:.5,y:1},"bottom-right":{x:1,y:1},left:{x:0,y:.5},right:{x:1,y:.5},top:{x:.5,y:0},bottom:{x:.5,y:1}};if(Array.isArray(s))return{x:(t=s[0])!=null?t:.5,y:(i=s[1])!=null?i:.5};if(s&&typeof s=="object"&&"x"in s&&"y"in s)return{x:(n=s.x)!=null?n:.5,y:(a=s.y)!=null?a:.5};if(typeof s=="string"){let o=s.trim().toLowerCase();return(r=e[o])!=null?r:{x:.5,y:.5}}return null}var ue=class{static async create(e,t,i){var l,c,d,p,u,g,h;console.log(`[ObjectFactory] create() called for: ${e}, __BUILD_MODE__: ${Mn}`);let n=(l=t==null?void 0:t.render)==null?void 0:l.asset;if(!n){console.log(`[ObjectFactory] No asset definition for: ${e}, returning empty container`);let f=new Ct.Container;return this.applyTransform(f,t==null?void 0:t.transform,t),f}let a=(c=t==null?void 0:t.identity)==null?void 0:c.id;console.log(`[ObjectFactory] Calling AssetLoader.load() for: ${e}, configId: ${a}, type: ${n.type}, path: ${n.path}`);let r=await He.load(e,n,i,a);console.log(`[ObjectFactory] AssetLoader.load() completed for: ${e}, rawAsset type: ${(d=r==null?void 0:r.constructor)==null?void 0:d.name}`);let o;if(n.type==="image")console.log("[ObjectFactory] Creating Sprite from texture:",r,"for object:",e),o=new Ct.Sprite(r),console.log("[ObjectFactory] Created object:",o,"type:",(p=o==null?void 0:o.constructor)==null?void 0:p.name),this.applyTransform(o,t==null?void 0:t.transform,t);else if(n.type==="json")if(console.log("[ObjectFactory] JSON asset for",e,"rawAsset type:",(u=r==null?void 0:r.constructor)==null?void 0:u.name,r),r&&(((g=r.constructor)==null?void 0:g.name)==="Container"||r instanceof Ct.Container)){console.warn("[ObjectFactory] JSON asset is Container (from cache), reloading JSON directly");let f=[n.path,`/assets/${n.path}`,`assets/${n.path}`,`../assets/${n.path}`],m=!1;for(let b of f)try{let y=await fetch(b);if(y.ok){o=await y.json(),console.log("[ObjectFactory] Reloaded JSON directly from:",b,"type:",(h=o==null?void 0:o.constructor)==null?void 0:h.name),m=!0;break}}catch{continue}m||(console.error("[ObjectFactory] Failed to reload JSON from any path"),o=r)}else o=r;else o=r,o&&typeof o=="object"&&("x"in o||"position"in o)&&this.applyTransform(o,t==null?void 0:t.transform,t);return o}static applyTransform(e,t,i){var n,a,r,o;if(!(!t||!e)&&(t.position&&("x"in e&&"y"in e?(e.x=(n=t.position.x)!=null?n:0,e.y=(a=t.position.y)!=null?a:0):"position"in e&&e.position&&e.position.set((r=t.position.x)!=null?r:0,(o=t.position.y)!=null?o:0)),t.scale!==void 0&&"scale"in e&&e.scale&&(typeof e.scale=="object"&&"set"in e.scale?e.scale.set(t.scale):e.scale=t.scale),t.rotation!==void 0&&"rotation"in e&&(e.rotation=t.rotation),t.anchor&&"anchor"in e&&e.anchor)){let l=So(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 At=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 Ao=Ze(require("pixi.js"),1);typeof window!="undefined"&&(window.__basePixi=Ao);it();var ai=require("pixi.js");it();var On=class{constructor(){this.instanceCache=new Map;this.readyPromise=null;this.app=null;this.registry=new At}init(e,t){this.registry.init(e),this.app=t}updateConfig(e){this.registry.init(e),this.instanceCache.clear(),this.readyPromise=null}async ready(){this.readyPromise&&await this.readyPromise;let t=this.registry.getAllIds().filter(n=>!this.instanceCache.has(n));if(t.length===0)return;let i=async n=>{n.length&&(console.log("[Assets] Loading objects:",n),await Promise.all(n.map(async a=>{var o;let r=this.registry.get(a);if(!r){console.warn("[Assets] No config found for object:",a);return}try{let l=await ue.create(a,r,this.app);this.instanceCache.set(a,l),console.log("[Assets] Loaded object:",a,(o=l==null?void 0:l.constructor)==null?void 0:o.name)}catch(l){console.error("[Assets] Failed to load object:",a,l)}})))};return this.readyPromise=(async()=>{await i(t);let n=this.registry.getAllIds().filter(a=>!this.instanceCache.has(a));n.length>0&&(console.warn("[Assets] Retrying missing assets:",n),await i(n)),console.log("[Assets] Ready. Cached objects:",Array.from(this.instanceCache.keys()))})(),this.readyPromise}resetScene(){this.instanceCache.clear(),this.readyPromise=null}async reloadObject(e){let t=this.registry.get(e);if(t){let i=await ue.create(e,t,this.app);this.instanceCache.set(e,i)}}get(e){return this.instanceCache.get(e)}},Lo=new On,To=new Proxy(Lo,{get(s,e){if(e in s&&typeof s[e]=="function")return s[e].bind(s);if(s.get(e))return s.get(e)}});it();var Is=require("pixi.js"),le={width:400,height:600,designWidth:400,scaleFactor:1},nt={scale:1,position:1},zn=[];function Po(s,e,t,i,n,a,r){zn.push({element:s,originalScale:a,positionHelper:e,heightPercent:n}),e(s,t,i,n,a,r,!1)}function Io(){zn.forEach(({element:s,originalScale:e,positionHelper:t,heightPercent:i})=>{let n=e*le.scaleFactor;t(s,le.width,le.height,i,n,!0,!1)})}function Rn(s,e){console.log(`[SCREEN] updateScreenState called: ${s}x${e}`),le.width=s,le.height=e,le.scaleFactor=Math.min(s/le.designWidth,1.15),nt.scale=le.scaleFactor,nt.position=1,console.log(`[SCREEN] Global multipliers - scale: ${nt.scale.toFixed(3)}`),Io()}var he={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 Mo(s,e,t){let i=he[s];i&&i[e]!==void 0&&(i[e]=t,console.log(`Updated ${s}.${e} = ${t}`))}function jo(){return he}var _o={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 si(s,e){return typeof s=="number"&&Number.isFinite(s)?s:e}function at(s,e={x:.5,y:.5}){var t;if(Array.isArray(s))return{x:si(s[0],e.x),y:si(s[1],e.y)};if(s&&typeof s=="object"){let i=s;return{x:si(i.x,e.x),y:si(i.y,e.y)}}if(typeof s=="string"){let i=s.trim().toLowerCase();return(t=_o[i])!=null?t:e}return e}function Tt(s,e,t,i={}){var g,h,f,m,b,y;let n=at(t),a=(g=i.inset)!=null?g:{},r=(h=i.padding)!=null?h:{x:0,y:0},o=((f=a.left)!=null?f:0)+r.x,l=((m=a.right)!=null?m:0)+r.x,c=((b=a.top)!=null?b:0)+r.y,d=((y=a.bottom)!=null?y:0)+r.y,p=Math.max(0,s-o-l),u=Math.max(0,e-c-d);return{x:o+p*n.x,y:c+u*n.y}}function kt(s,e,t,i={}){var f,m,b,y,v,x;let n=(f=i.inset)!=null?f:{},a=(m=i.padding)!=null?m:{x:0,y:0},r=((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=((x=n.bottom)!=null?x:0)+a.y,d=Math.max(0,s-r-o),p=Math.max(0,e-l-c),u=at(t,{x:.5,y:.5}),g=Math.min(Math.max(u.x,0),1),h=Math.min(Math.max(u.y,0),1);return{x:r+d*g,y:l+p*h}}if(typeof window!="undefined"){let s=window.innerWidth,e=window.innerHeight,t=()=>{let i=window.innerWidth,n=window.innerHeight;(i!==s||n!==e)&&(s=i,e=n,Rn(i,n))};window.addEventListener("resize",t),window.addEventListener("orientationchange",()=>{setTimeout(t,100)}),window.mraid&&(window.mraid.addEventListener("viewableChange",t),window.mraid.addEventListener("sizeChange",t)),Rn(window.innerWidth,window.innerHeight),window.updateDebugConfig=Mo,window.getDebugConfig=jo,window.copyConfig=Uo,window.applyConfig=Lt,window.applyConfigForRatio=qo,window.positionAtBottom=Ms,window.positionAtTop=zo,window.positionAtCenter=$o,window.positionAtLeft=Do,window.positionAtRight=No,window.positionAtBottomLeft=Ho,window.positionAtBottomRight=Fo,window.positionAtTopLeft=Bo,window.positionAtTopRight=Go,window.applyPositionContract=Ro,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 ri(s,e,t=0){return s*e+t}function oi(s,e,t=0){return s*(1-e)+t}function li(s,e,t=0){return s*e+t}function ci(s,e,t=0){return s*(1-e)+t}function ae(s,e=0){return s/2+e}function Oo(s,e){return s*e}function Ro(s,e,t,i){var r,o,l,c,d,p,u,g,h,f,m,b,y,v,x,L,P,O,w,k;let n=0,a=0;switch(i.type){case"top":n=ae(e,(o=(r=i.offset)==null?void 0:r.x)!=null?o:0),a=ri(t,i.percent,(c=(l=i.offset)==null?void 0:l.y)!=null?c:0);break;case"bottom":n=ae(e,(p=(d=i.offset)==null?void 0:d.x)!=null?p:0),a=oi(t,i.percent,(g=(u=i.offset)==null?void 0:u.y)!=null?g:0);break;case"left":n=li(e,i.percent,(f=(h=i.offset)==null?void 0:h.x)!=null?f:0),a=ae(t,(b=(m=i.offset)==null?void 0:m.y)!=null?b:0);break;case"right":n=ci(e,i.percent,(v=(y=i.offset)==null?void 0:y.x)!=null?v:0),a=ae(t,(L=(x=i.offset)==null?void 0:x.y)!=null?L:0);break;case"center":n=ae(e,(O=(P=i.offset)==null?void 0:P.x)!=null?O:0),a=ae(t,(k=(w=i.offset)==null?void 0:w.y)!=null?k:0);break}s.position?s.position.set(n,a):(s.x=n,s.y=a),i.scale!==void 0&&i.scale!==1&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(i.scale,i.scale):(s.scale.x=i.scale,s.scale.y=i.scale))}function Ms(s,e,t,i=.2,n=1,a=!0,r=!1){let o=Oo(t,i),l=oi(t,i/2);we(s,ae(e),l);let c=a?n*le.scaleFactor:n;xe(s,c),r&&!zn.find(d=>d.element===s)&&Po(s,Ms,e,t,i,n,a)}function zo(s,e,t,i=.1,n=1){we(s,ae(e),ri(t,i)),xe(s,n)}function $o(s,e,t,i=0,n=0,a=1){we(s,ae(e,i),ae(t,n)),xe(s,a)}function Do(s,e,t,i=.1,n=1){we(s,li(e,i),ae(t)),xe(s,n)}function No(s,e,t,i=.1,n=1){we(s,ci(e,i),ae(t)),xe(s,n)}function Ho(s,e,t,i=.05,n=.05,a=1){we(s,li(e,n),oi(t,i)),xe(s,a)}function Fo(s,e,t,i=.05,n=.05,a=1){we(s,ci(e,n),oi(t,i)),xe(s,a)}function Bo(s,e,t,i=.05,n=.05,a=1){we(s,li(e,n),ri(t,i)),xe(s,a)}function Go(s,e,t,i=.05,n=.05,a=1){we(s,ci(e,n),ri(t,i)),xe(s,a)}function we(s,e,t){s&&s.position?typeof s.position.set=="function"?s.position.set(e,t):(s.position.x=e,s.position.y=t):s&&(s.x=e,s.y=t)}function xe(s,e){e!==1&&s&&s.scale&&(typeof s.scale.set=="function"?s.scale.set(e,e):s.scale.x!==void 0&&s.scale.y!==void 0&&(s.scale.x=e,s.scale.y=e))}var Fe={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 Uo(s){return s&&Fe[s]?JSON.parse(JSON.stringify(Fe[s])):JSON.parse(JSON.stringify(he))}function Lt(s){Object.keys(s).forEach(e=>{let t=e;he[t]&&s[t]&&Object.assign(he[t],s[t])}),console.log("Config applied:",s)}function qo(s,e){let t=s/e;t>1.6?(Lt(Fe.wide),console.log("Applied WIDE config for ratio:",t)):t<.7?(Lt(Fe.tall),console.log("Applied TALL config for ratio:",t)):t>.8&&t<1.2?(Lt(Fe.square),console.log("Applied SQUARE config for ratio:",t)):(Lt(Fe.default),console.log("Applied DEFAULT config for ratio:",t))}if(typeof window!="undefined"){let s=window;s.configPresets=Fe,s.resolveAnchorVec2=s.resolveAnchorVec2||at,s.resolveScreenAnchorPoint=s.resolveScreenAnchorPoint||Tt,s.resolveScreenRatioPoint=s.resolveScreenRatioPoint||kt}xi();function W(s,e){let t=(n,a)=>a===0?n:t(a,n%a),i=t(s,e);return`${s/i}:${e/i}`}var dd=[{id:"iphone-15-pro-max",label:"iPhone 15 Pro Max",width:430,height:932,category:"iphone",ratio:W(430,932)},{id:"iphone-15-pro",label:"iPhone 15 Pro",width:393,height:852,category:"iphone",ratio:W(393,852)},{id:"iphone-15",label:"iPhone 15",width:393,height:852,category:"iphone",ratio:W(393,852)},{id:"iphone-14",label:"iPhone 14",width:390,height:844,category:"iphone",ratio:W(390,844)},{id:"iphone-se",label:"iPhone SE",width:375,height:667,category:"iphone",ratio:W(375,667)},{id:"iphone-12-mini",label:"iPhone 12 Mini",width:360,height:780,category:"iphone",ratio:W(360,780)}],pd=[{id:"pixel-8-pro",label:"Pixel 8 Pro",width:448,height:998,category:"android",ratio:W(448,998)},{id:"pixel-8",label:"Pixel 8",width:412,height:915,category:"android",ratio:W(412,915)},{id:"samsung-s24-ultra",label:"Samsung S24 Ultra",width:412,height:915,category:"android",ratio:W(412,915)},{id:"samsung-s24",label:"Samsung S24",width:360,height:780,category:"android",ratio:W(360,780)},{id:"samsung-a54",label:"Samsung A54",width:412,height:915,category:"android",ratio:W(412,915)},{id:"oneplus-12",label:"OnePlus 12",width:412,height:915,category:"android",ratio:W(412,915)}],ud=[{id:"ipad-pro-12",label:'iPad Pro 12.9"',width:1024,height:1366,category:"tablet",ratio:W(1024,1366)},{id:"ipad-pro-11",label:'iPad Pro 11"',width:834,height:1194,category:"tablet",ratio:W(834,1194)},{id:"ipad-air",label:"iPad Air",width:820,height:1180,category:"tablet",ratio:W(820,1180)},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"tablet",ratio:W(768,1024)},{id:"samsung-tab-s9",label:"Samsung Tab S9",width:800,height:1280,category:"tablet",ratio:W(800,1280)}],Zn=[{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:W(390,844),mraidScale:.7},{id:"ipad-mini",label:"iPad Mini",width:768,height:1024,category:"playable",ratio:W(768,1024),mraidScale:.7}];var Qn=[...Zn],ea=[{category:"playable",label:"Playable Ad",devices:Zn}],Si=Zn[0];function qe(s){return Qn.find(e=>e.id===s)||Si}function Qo(s){return Qn.filter(e=>e.category===s)}K();var je=class{async updateProperty(e,t,i,n={}){var l,c,d;console.log("[PropertyUpdateManager] Updating:",e,t,i);let a=window.getEditableObjectConfig;if(typeof a!="function"){console.error("[PropertyUpdateManager] getEditableObjectConfig not available");return}let r=a(e);if(!r){console.error("[PropertyUpdateManager] Config not found for:",e);return}ee({objectId:e,path:t,value:i},{persist:!0});let o=window.applyEditableObjectConfig;if(typeof o=="function"){let p=window.__editableConfig,u=(d=(c=(l=p==null?void 0:p.objects)==null?void 0:l.get)==null?void 0:c.call(l,e))!=null?d:r;await o(e,u),console.log("[PropertyUpdateManager] Applied config successfully")}else console.warn("[PropertyUpdateManager] applyEditableObjectConfig not available");this.triggerRefresh(e),n.refreshInspector&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}getNestedProperty(e,t){let i=t.split("."),n=e;for(let a of i)if(n&&typeof n=="object"&&a in n)n=n[a];else return;return n}triggerRefresh(e){let t=window.__refreshHierarchy;typeof t=="function"&&t(),window.dispatchEvent(new CustomEvent("inspector:property-updated",{detail:{objectId:e}}))}};function ta(s){let e=document.createElement("input");e.type="file",e.accept="image/*",e.onchange=async t=>{var a;let i=(a=t.target.files)==null?void 0:a[0];if(!i)return;let n=new FileReader;n.onload=async()=>{let r=n.result,o=s.category||"misc",c=`${(s.objectId||"new_asset").replace(/^json\./,"").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")||"new_asset"}_uploaded`;try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:o,filename:`${c}.png`,data:r,overwrite:!0})})).json();if(!(p!=null&&p.success)){alert(`Upload failed: ${(p==null?void 0:p.error)||"Unknown error"}`);return}let u=window.addAssetToRegistry;typeof u=="function"&&u(o,`${c}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch{}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),await s.onApply(p.path)}catch(d){console.error("[QuickActionsBar] Upload error:",d),alert("Upload failed. Check console.")}},n.readAsDataURL(i)},e.click()}var Ei=class{constructor(){this.updateManager=new je}async handleAction(e,t,i){console.log("[QuickActionsBar] Action:",e,t,i);let n=window.getEditableObjectConfig;if(typeof n!="function")return;let a=n(t);if(!a)return;let r=this.updateManager.getNestedProperty(a,i);if(e==="ai-convert"||e==="upload"||e==="library"){let o=i==="ui.text"||i==="render.asset.path",l=i==="render.asset.path";o&&(await this.prepareForImageConversion(t,a),e==="ai-convert"&&i!=="render.asset.path"&&(i="render.asset.path"))}switch(e){case"library":this.openLibrary(t,i,r);break;case"ai-edit":this.openAIEditor(t,i,r);break;case"upload":this.openUpload(t,i);break;case"reset":await this.resetToDefault(t,i);break;case"ai-convert":this.handleAiConvert(t,i,r);break;default:console.warn("[QuickActionsBar] Unknown action:",e)}}async prepareForImageConversion(e,t){var i,n;if(console.log("[QuickActionsBar] Preparing for image conversion:",e),t.render||(t.render={alpha:1,visible:!0}),(t.render.alpha===0||t.render.alpha===void 0)&&(t.render.alpha=1,await this.updateManager.updateProperty(e,"render.alpha",1)),(t.render.visible===!1||t.render.visible===void 0)&&(t.render.visible=!0,await this.updateManager.updateProperty(e,"render.visible",!0)),t.render.asset||(t.render.asset={type:"image",path:""}),t.render.asset.type!=="image"&&(t.render.asset.type="image",await this.updateManager.updateProperty(e,"render.asset",{type:"image",path:t.render.asset.path||""})),t.ui&&t.ui.renderMode!=="png"){await this.updateManager.updateProperty(e,"ui.renderMode","png",{refreshInspector:!0}),await this.updateManager.updateProperty(e,"render.tint","#ffffff");let r=((n=(i=t.transform)==null?void 0:i.scale)!=null?n:1)*.3;await this.updateManager.updateProperty(e,"transform.scale",r),console.log("[QuickActionsBar] Text to PNG conversion: set tint white, scale",r)}this.ensureSlotInRegistry(e,t)}ensureSlotInRegistry(e,t){var o,l,c;let i=window.getEditableAssets;if(typeof i!="function")return;let n=i();if(!n||!n.slots)return;let a=e.startsWith("json.")?e.replace("json.",""):e;if(!n.slots.some(d=>d.objectId===a||d.slotId===a)){let d=((o=t.identity)==null?void 0:o.category)||"ui";console.log("[QuickActionsBar] Adding new slot to registry for converted object:",a),n.slots.push({slotId:a,displayName:a.replace(/_/g," "),objectId:a,category:d,currentAsset:((c=(l=t.render)==null?void 0:l.asset)==null?void 0:c.path)||"",defaultAsset:"",libraryFolder:d,assetType:"image"}),n.categories&&!n.categories.includes(d)&&n.categories.push(d),n.libraryAssets&&!n.libraryAssets[d]&&(n.libraryAssets[d]=[]);let p=window.reRenderAssetLibrary;typeof p=="function"&&p()}}openLibrary(e,t,i){var a;let n=window.__debugContext;if(n){if(n.activeTab!=="library"){n.activeTab="library";let r=window.__updateWorkbenchTabs;typeof r=="function"&&r()}if(n.libraryPanel){let r=window.getEditableObjectConfig,o=r==null?void 0:r(e),l=(a=o==null?void 0:o.identity)==null?void 0:a.category;l||(l=t.split(".")[0]==="render"?"environment":"ui"),console.log("[QuickActionsBar] Highlighting library slot:",e,"category:",l),n.libraryPanel.highlightSlot(e,l)}}}openAIEditor(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let a=t.split(".").pop()||t;n(a,`Edit ${a} for ${e}`,i,{objectId:e,path:t})}else console.warn("[QuickActionsBar] AI Editor not available")}openUpload(e,t){var r;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e),a=((r=n==null?void 0:n.identity)==null?void 0:r.category)||(t.split(".")[0]==="render"?"environment":"ui");ta({objectId:e,category:a,onApply:async o=>{var g,h;let l=window.applyAssetToSlot,c=this.getFilenameFromPath(o),d=/render\.asset\.path/i.test(t)||/\.(png|jpg|jpeg|gif|webp)$/i.test(o);typeof l=="function"&&c&&d&&await l(e,c,a),await this.updateManager.updateProperty(e,t,o);let p=window.__debugContext;(h=(g=p==null?void 0:p.options)==null?void 0:g.onPropertyChange)==null||h.call(g,e,t,o);let u=window.__highlightLibrarySlot;typeof u=="function"&&setTimeout(()=>{u(e,a)},500),window.dispatchEvent(new CustomEvent("inspector:refresh"))}})}getFilenameFromPath(e){if(!e)return"";let t=e.split("?")[0].replace(/\\/g,"/");return t.split("/").pop()||t}async resetToDefault(e,t){console.log("[QuickActionsBar] Reset to default:",e,t);try{let i=await this.getDefaultValue(e,t);i!==void 0?(await this.updateManager.updateProperty(e,t,i),console.log("[QuickActionsBar] Reset to default value:",i)):alert("No default value found for this property.")}catch(i){console.error("[QuickActionsBar] Failed to reset to default:",i),alert("Failed to reset property. Check console for details.")}}async getDefaultValue(e,t){let i=t.split(".");if(i.length<2)return;let n=i[0],a=i.slice(1),r=window.__editableConfig;if(!(r!=null&&r.schemas))return;let o=null;if(r.schemas instanceof Map?o=r.schemas.get(n):typeof r.schemas=="object"&&(o=r.schemas[n]),!(o!=null&&o.defaults))return;let l=o.defaults;for(let c of a)if(l&&typeof l=="object")l=l[c];else return;return l}handleAiConvert(e,t,i){let n=window.__openAiEditor;if(typeof n=="function"){let r=`A single, high-quality, high-detail game UI icon/asset representing "${String(i||e.replace(/_/g," ").replace("json.",""))}". Modern stylized 3D rendered style, vibrant colors, soft lighting, isolated on solid magenta background, highly polished professional game art.`,o="render.asset.path";console.log("[QuickActionsBar] AI Convert for:",e,"from:",t,"to:",o),n(e,r,"",{objectId:e,path:o});let l=window.__debugContext;if(l){l.activeTab="ai";let c=window.__updateWorkbenchTabs;typeof c=="function"&&c()}}else console.warn("[QuickActionsBar] AI Editor not available")}};var el=[{value:"loading",label:"Loading"},{value:"start",label:"Start"},{value:"gameplay",label:"Gameplay"},{value:"tutorial",label:"Tutorial"},{value:"endgame",label:"Endgame"}],tl=["environment","ui","character","system","backgrounds"],il=["bg","world","ui"],qs={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}}},Ci=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">
@@ -402,7 +402,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
402
402
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Confirm</button>
403
403
  </div>
404
404
  </div>
405
- `;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{let h=n.querySelector("#name-input").value.trim(),m=this.sanitizeInstanceId(h);if(!m){alert("Invalid name. Use letters, numbers, dots, dashes, or underscores.");return}a(),i(m)},o=()=>{a(),i(null)};n.querySelector(".add-menu-modal").addEventListener("click",g=>{g.stopPropagation()}),(d=n.querySelector('[data-action="confirm"]'))==null||d.addEventListener("click",r),(p=n.querySelector('[data-action="cancel"]'))==null||p.addEventListener("click",o),(u=n.querySelector(".add-menu-modal-close"))==null||u.addEventListener("click",o),n.addEventListener("click",g=>{g.target===n&&o()});let c=n.querySelector("#name-input");c.addEventListener("keydown",g=>{g.key==="Enter"?(g.preventDefault(),r()):g.key==="Escape"&&(g.preventDefault(),o())}),c.select(),document.body.appendChild(n),c.focus()})}async promptSpawnerConfig(){return new Promise(e=>{var f,b,y;let t=document.createElement("div");t.className="add-menu-modal-overlay";let i="template_id",n=`${i}_spawner_1`,a="",r=JSON.stringify([{x:-120,y:-120},{x:0,y:-120},{x:120,y:-120}],null,2),o=JSON.stringify({x:[-240,240],y:[-170,-170]},null,2),l="";t.innerHTML=`
405
+ `;let a=()=>{n.parentNode&&n.parentNode.removeChild(n)},r=()=>{let h=n.querySelector("#name-input").value.trim(),f=this.sanitizeInstanceId(h);if(!f){alert("Invalid name. Use letters, numbers, dots, dashes, or underscores.");return}a(),i(f)},o=()=>{a(),i(null)};n.querySelector(".add-menu-modal").addEventListener("click",g=>{g.stopPropagation()}),(d=n.querySelector('[data-action="confirm"]'))==null||d.addEventListener("click",r),(p=n.querySelector('[data-action="cancel"]'))==null||p.addEventListener("click",o),(u=n.querySelector(".add-menu-modal-close"))==null||u.addEventListener("click",o),n.addEventListener("click",g=>{g.target===n&&o()});let c=n.querySelector("#name-input");c.addEventListener("keydown",g=>{g.key==="Enter"?(g.preventDefault(),r()):g.key==="Escape"&&(g.preventDefault(),o())}),c.select(),document.body.appendChild(n),c.focus()})}async promptSpawnerConfig(){return new Promise(e=>{var m,b,y;let t=document.createElement("div");t.className="add-menu-modal-overlay";let i="template_id",n=`${i}_spawner_1`,a="",r=JSON.stringify([{x:-120,y:-120},{x:0,y:-120},{x:120,y:-120}],null,2),o=JSON.stringify({x:[-240,240],y:[-170,-170]},null,2),l="";t.innerHTML=`
406
406
  <div class="add-menu-modal add-menu-modal-wide">
407
407
  <div class="add-menu-modal-header">
408
408
  <div class="add-menu-modal-title">
@@ -532,18 +532,18 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
532
532
  <button class="add-menu-modal-btn add-menu-modal-btn-primary" type="button" data-action="confirm">Create Spawner</button>
533
533
  </div>
534
534
  </div>
535
- `;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=t.querySelectorAll(".add-menu-modal-tab"),p=t.querySelectorAll(".add-menu-modal-tab-content");d.forEach(v=>{v.addEventListener("click",()=>{var C;let S=v.dataset.tab;d.forEach(I=>I.classList.remove("active")),p.forEach(I=>I.classList.remove("active")),v.classList.add("active"),(C=t.querySelector(`[data-tab-content="${S}"]`))==null||C.classList.add("active")})});let u=v=>{let S=v.trim();if(!S)return null;try{return JSON.parse(S)}catch{return null}},g=()=>{var q;let v=t.querySelector("#spawner-instance-id").value.trim(),S=t.querySelector("#spawner-template-id").value.trim(),C=t.querySelector("#spawner-spawn-templates").value,I=t.querySelector("#spawner-position-source").value.trim(),O=t.querySelector("#spawner-point-mode").value.trim(),w=t.querySelector("#spawner-spawn-points").value,T=t.querySelector("#spawner-pattern").value.trim(),j=Number(t.querySelector("#spawner-rate").value.trim()),A=Number(t.querySelector("#spawner-pool").value.trim()),k=Number(t.querySelector("#spawner-lifetime").value.trim()),M=t.querySelector("#spawner-return-on-invisible").checked,L=t.querySelector("#spawner-movement").value.trim(),E=Number(t.querySelector("#spawner-vel-x").value.trim()),x=Number(t.querySelector("#spawner-vel-y").value.trim()),_=t.querySelector("#spawner-velocity-range").value,P=u(C),R=Array.isArray(P)&&P.length?P:null,z=typeof((q=R==null?void 0:R[0])==null?void 0:q.templateId)=="string"?String(R[0].templateId):S;if(!v){alert("Instance ID is required.");return}if(!z){alert("Template ID is required.");return}let N={templateId:z,spawnPattern:T,spawnRate:Number.isFinite(j)?j:650,poolSize:Number.isFinite(A)?A:18,returnOnInvisible:M,positionSource:I,spawnPointMode:O,movementMode:L,lifetime:Number.isFinite(k)?k:5e3};R&&(N.spawnTemplates=R);let J=u(w);Array.isArray(J)&&(N.spawnPoints=J),Number.isFinite(E)&&Number.isFinite(x)&&(N.velocity={x:E,y:x});let H=u(_);H&&typeof H=="object"&&(N.velocityRange=H),c(),e({templateId:z,instanceId:v,spawnerProps:N})},h=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",v=>v.stopPropagation()),(f=t.querySelector('[data-action="confirm"]'))==null||f.addEventListener("click",g),(b=t.querySelector('[data-action="cancel"]'))==null||b.addEventListener("click",h),(y=t.querySelector(".add-menu-modal-close"))==null||y.addEventListener("click",h),t.addEventListener("click",v=>{v.target===t&&h()}),document.body.appendChild(t),t.querySelector("#spawner-instance-id").focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let r=a,o=this.buildDefaultConfig(e,r,a);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:r,objectConfigId:o.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:o,forceSync:!0})}),u=await p.json().catch(()=>({}));if(!p.ok||(u==null?void 0:u.success)===!1){let h=((l=u==null?void 0:u.errors)==null?void 0:l.join(`
535
+ `;let c=()=>{t.parentNode&&t.parentNode.removeChild(t)},d=t.querySelectorAll(".add-menu-modal-tab"),p=t.querySelectorAll(".add-menu-modal-tab-content");d.forEach(v=>{v.addEventListener("click",()=>{var L;let x=v.dataset.tab;d.forEach(P=>P.classList.remove("active")),p.forEach(P=>P.classList.remove("active")),v.classList.add("active"),(L=t.querySelector(`[data-tab-content="${x}"]`))==null||L.classList.add("active")})});let u=v=>{let x=v.trim();if(!x)return null;try{return JSON.parse(x)}catch{return null}},g=()=>{var q;let v=t.querySelector("#spawner-instance-id").value.trim(),x=t.querySelector("#spawner-template-id").value.trim(),L=t.querySelector("#spawner-spawn-templates").value,P=t.querySelector("#spawner-position-source").value.trim(),O=t.querySelector("#spawner-point-mode").value.trim(),w=t.querySelector("#spawner-spawn-points").value,k=t.querySelector("#spawner-pattern").value.trim(),j=Number(t.querySelector("#spawner-rate").value.trim()),C=Number(t.querySelector("#spawner-pool").value.trim()),A=Number(t.querySelector("#spawner-lifetime").value.trim()),M=t.querySelector("#spawner-return-on-invisible").checked,T=t.querySelector("#spawner-movement").value.trim(),E=Number(t.querySelector("#spawner-vel-x").value.trim()),S=Number(t.querySelector("#spawner-vel-y").value.trim()),_=t.querySelector("#spawner-velocity-range").value,I=u(L),R=Array.isArray(I)&&I.length?I:null,z=typeof((q=R==null?void 0:R[0])==null?void 0:q.templateId)=="string"?String(R[0].templateId):x;if(!v){alert("Instance ID is required.");return}if(!z){alert("Template ID is required.");return}let N={templateId:z,spawnPattern:k,spawnRate:Number.isFinite(j)?j:650,poolSize:Number.isFinite(C)?C:18,returnOnInvisible:M,positionSource:P,spawnPointMode:O,movementMode:T,lifetime:Number.isFinite(A)?A:5e3};R&&(N.spawnTemplates=R);let X=u(w);Array.isArray(X)&&(N.spawnPoints=X),Number.isFinite(E)&&Number.isFinite(S)&&(N.velocity={x:E,y:S});let F=u(_);F&&typeof F=="object"&&(N.velocityRange=F),c(),e({templateId:z,instanceId:v,spawnerProps:N})},h=()=>{c(),e(null)};t.querySelector(".add-menu-modal").addEventListener("click",v=>v.stopPropagation()),(m=t.querySelector('[data-action="confirm"]'))==null||m.addEventListener("click",g),(b=t.querySelector('[data-action="cancel"]'))==null||b.addEventListener("click",h),(y=t.querySelector(".add-menu-modal-close"))==null||y.addEventListener("click",h),t.addEventListener("click",v=>{v.target===t&&h()}),document.body.appendChild(t),t.querySelector("#spawner-instance-id").focus()})}sanitizeInstanceId(e){let t=e.trim();return!t||!/^[a-zA-Z0-9._-]+$/.test(t)?null:t}buildDefaultConfig(e,t,i){let n=`json.${t}`,a={identity:{id:n,category:e==="ui-image"||e==="ui-text"?"ui":"environment"},transform:{position:{x:0,y:0},offset:{x:0,y:0},scale:e==="sprite"||e==="ui-image"?.2:1,rotation:0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0},instance_id:t,object_config:n};return(e==="sprite"||e==="ui-image")&&(a.render.asset={type:"image",path:`raw/${i}.png`}),e==="ui-text"&&(a.ui={kind:"text",renderMode:"text",text:i,font:"brand.primary",fontSize:18,letterSpacing:0,align:"center",color:"#FFFFFF"}),e==="graphics"&&(a.effects={width:200,height:200,fill_color:"#FFFFFF",fill_alpha:1}),a}async handleCreateObject(e,t){var l,c,d;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e==="ui-text"?"text_1":e==="graphics"?"graphics_1":"sprite_1",a=await this.promptName(n);if(!a)return;let r=a,o=this.buildDefaultConfig(e,r,a);try{let p=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,instanceId:r,objectConfigId:o.identity.id,layer:e==="ui-image"||e==="ui-text"?"ui":"world",config:o,forceSync:!0})}),u=await p.json().catch(()=>({}));if(!p.ok||(u==null?void 0:u.success)===!1){let h=((l=u==null?void 0:u.errors)==null?void 0:l.join(`
536
536
  `))||(u==null?void 0:u.error)||"Failed to create object.";alert(h);return}let{trackObjectCreation:g}=await Promise.resolve().then(()=>(K(),Ie));g(r,i,o),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),(d=(c=this.options).onRefresh)==null||d.call(c)}catch(p){alert(`Failed to create object: ${p instanceof Error?p.message:String(p)}`)}}async handleCreateFromTemplate(e,t){var r,o,l;this.close();let i=t!=null?t:await this.promptScreen();if(!i)return;let n=e.replace(/\.template$/,"").replace(/^json\./,"").replace(/[._]/g,"_")+"_1",a=await this.promptName(n);if(a)try{let c=await fetch("/api/objects/create-from-template",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:e,instanceId:a,screenId:i,forceSync:!0})}),d=await c.json().catch(()=>({}));if(!c.ok||(d==null?void 0:d.success)===!1){let p=((r=d==null?void 0:d.errors)==null?void 0:r.join(`
537
- `))||(d==null?void 0:d.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,r,o,l,c,d,p,u,g,h,m,f,b,y,v,S,C,I,O,w,T,j,A,k,M,L;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let E=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await E.json().catch(()=>({}));if(!E.ok||(x==null?void 0:x.success)===!1){let _=((n=x==null?void 0:x.errors)==null?void 0:n.join(`
538
- `))||(x==null?void 0:x.error)||"Failed to create collectable system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(r=(a=this.options).onRefresh)==null||r.call(a)}catch(E){alert(`Failed to create collectable system: ${E instanceof Error?E.message:String(E)}`)}if(e==="drag-snap-couples")try{let E=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await E.json().catch(()=>({}));if(!E.ok||(x==null?void 0:x.success)===!1){let _=((o=x==null?void 0:x.errors)==null?void 0:o.join(`
539
- `))||(x==null?void 0:x.error)||"Failed to create drag-snap system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(E){alert(`Failed to create drag-snap system: ${E instanceof Error?E.message:String(E)}`)}if(e==="swerve-collect")try{let E=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await E.json().catch(()=>({}));if(!E.ok||(x==null?void 0:x.success)===!1){let _=((d=x==null?void 0:x.errors)==null?void 0:d.join(`
540
- `))||(x==null?void 0:x.error)||"Failed to create swerve collect system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(u=(p=this.options).onRefresh)==null||u.call(p)}catch(E){alert(`Failed to create swerve collect system: ${E instanceof Error?E.message:String(E)}`)}if(e==="tap-destroy")try{let E=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await E.json().catch(()=>({}));if(!E.ok||(x==null?void 0:x.success)===!1){let _=((g=x==null?void 0:x.errors)==null?void 0:g.join(`
541
- `))||(x==null?void 0:x.error)||"Failed to create tap destroy system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(m=(h=this.options).onRefresh)==null||m.call(h)}catch(E){alert(`Failed to create tap destroy system: ${E instanceof Error?E.message:String(E)}`)}if(e==="scratch-card")try{let E=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await E.json().catch(()=>({}));if(!E.ok||(x==null?void 0:x.success)===!1){let _=((f=x==null?void 0:x.errors)==null?void 0:f.join(`
542
- `))||(x==null?void 0:x.error)||"Failed to create scratch card system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(y=(b=this.options).onRefresh)==null||y.call(b)}catch(E){alert(`Failed to create scratch card system: ${E instanceof Error?E.message:String(E)}`)}if(e==="start-screen"||e==="start-screen-no-hand")try{let x=await fetch("/api/systems/start-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="start-screen"})}),_=await x.json().catch(()=>({}));if(!x.ok||(_==null?void 0:_.success)===!1){let P=((v=_==null?void 0:_.errors)==null?void 0:v.join(`
543
- `))||(_==null?void 0:_.error)||"Failed to create start screen template.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(C=(S=this.options).onRefresh)==null||C.call(S)}catch(E){alert(`Failed to create start screen template: ${E instanceof Error?E.message:String(E)}`)}if(e==="endgame-screen"||e==="endgame-screen-no-hand")try{let x=await fetch("/api/systems/endgame-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="endgame-screen"})}),_=await x.json().catch(()=>({}));if(!x.ok||(_==null?void 0:_.success)===!1){let P=((I=_==null?void 0:_.errors)==null?void 0:I.join(`
544
- `))||(_==null?void 0:_.error)||"Failed to create endgame screen template.";alert(P);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(w=(O=this.options).onRefresh)==null||w.call(O)}catch(E){alert(`Failed to create endgame screen template: ${E instanceof Error?E.message:String(E)}`)}if(e==="bullet-system")try{let E=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),x=await E.json().catch(()=>({}));if(!E.ok||(x==null?void 0:x.success)===!1){let _=((T=x==null?void 0:x.errors)==null?void 0:T.join(`
545
- `))||(x==null?void 0:x.error)||"Failed to create bullet system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(A=(j=this.options).onRefresh)==null||A.call(j)}catch(E){alert(`Failed to create bullet system: ${E instanceof Error?E.message:String(E)}`)}if(e==="spawner"){let E=await this.promptSpawnerConfig();if(!E)return;let{templateId:x,instanceId:_,spawnerProps:P}=E;try{let R=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,templateId:x,instanceId:_,spawnerProps:P,forceSync:!0})}),z=await R.json().catch(()=>({}));if(!R.ok||(z==null?void 0:z.success)===!1){let N=((k=z==null?void 0:z.errors)==null?void 0:k.join(`
546
- `))||(z==null?void 0:z.error)||"Failed to create spawner.";alert(N);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(L=(M=this.options).onRefresh)==null||L.call(M)}catch(R){alert(`Failed to create spawner: ${R instanceof Error?R.message:String(R)}`)}}}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}async syncScreens(){try{let e=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})})}catch(e){console.warn("[AddObjectMenu] Failed to sync screens:",e)}}};var Ti=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.selectedIds=new Set;this.lastSelectedIndex=-1;this.objectEntries=[];this.options=null;this.retryTimer=null;this.screenFilter="all";this.isContextMenuOpen=!1;this.systemBundles=new Map;this.collapsedGroups=new Set}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getCollapseStorageKey(){return`handler_preview_scene_collapsed::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}loadCollapsedGroups(){try{let e=window.localStorage.getItem(this.getCollapseStorageKey());if(!e)return;let t=JSON.parse(e);Array.isArray(t)&&(this.collapsedGroups=new Set(t.filter(i=>typeof i=="string")))}catch{}}persistCollapsedGroups(){try{window.localStorage.setItem(this.getCollapseStorageKey(),JSON.stringify(Array.from(this.collapsedGroups)))}catch{}}isCollapsed(e){return this.collapsedGroups.has(e)}setCollapsed(e,t){t?this.collapsedGroups.add(e):this.collapsedGroups.delete(e),this.persistCollapsedGroups()}getCollapseKey(e){return encodeURIComponent(e)}getSystemBundleKey(e,t){return this.getCollapseKey(`bundle:${e}::${t}`)}render(){return`
537
+ `))||(d==null?void 0:d.error)||"Failed to create from template.";alert(p);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(l=(o=this.options).onRefresh)==null||l.call(o)}catch(c){alert(`Failed to create from template: ${c instanceof Error?c.message:String(c)}`)}}async handleCreateSystem(e,t){var n,a,r,o,l,c,d,p,u,g,h,f,m,b,y,v,x,L,P,O,w,k,j,C,A,M,T;this.close();let i=t!=null?t:await this.promptScreen();if(i){if(e==="collectable-system")try{let E=await fetch("/api/systems/collectable-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let _=((n=S==null?void 0:S.errors)==null?void 0:n.join(`
538
+ `))||(S==null?void 0:S.error)||"Failed to create collectable system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(r=(a=this.options).onRefresh)==null||r.call(a)}catch(E){alert(`Failed to create collectable system: ${E instanceof Error?E.message:String(E)}`)}if(e==="drag-snap-couples")try{let E=await fetch("/api/systems/drag-snap-couples",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let _=((o=S==null?void 0:S.errors)==null?void 0:o.join(`
539
+ `))||(S==null?void 0:S.error)||"Failed to create drag-snap system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(c=(l=this.options).onRefresh)==null||c.call(l)}catch(E){alert(`Failed to create drag-snap system: ${E instanceof Error?E.message:String(E)}`)}if(e==="swerve-collect")try{let E=await fetch("/api/systems/swerve-collect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let _=((d=S==null?void 0:S.errors)==null?void 0:d.join(`
540
+ `))||(S==null?void 0:S.error)||"Failed to create swerve collect system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(u=(p=this.options).onRefresh)==null||u.call(p)}catch(E){alert(`Failed to create swerve collect system: ${E instanceof Error?E.message:String(E)}`)}if(e==="tap-destroy")try{let E=await fetch("/api/systems/tap-destroy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let _=((g=S==null?void 0:S.errors)==null?void 0:g.join(`
541
+ `))||(S==null?void 0:S.error)||"Failed to create tap destroy system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(f=(h=this.options).onRefresh)==null||f.call(h)}catch(E){alert(`Failed to create tap destroy system: ${E instanceof Error?E.message:String(E)}`)}if(e==="scratch-card")try{let E=await fetch("/api/systems/scratch-card",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let _=((m=S==null?void 0:S.errors)==null?void 0:m.join(`
542
+ `))||(S==null?void 0:S.error)||"Failed to create scratch card system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(y=(b=this.options).onRefresh)==null||y.call(b)}catch(E){alert(`Failed to create scratch card system: ${E instanceof Error?E.message:String(E)}`)}if(e==="start-screen"||e==="start-screen-no-hand")try{let S=await fetch("/api/systems/start-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="start-screen"})}),_=await S.json().catch(()=>({}));if(!S.ok||(_==null?void 0:_.success)===!1){let I=((v=_==null?void 0:_.errors)==null?void 0:v.join(`
543
+ `))||(_==null?void 0:_.error)||"Failed to create start screen template.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(L=(x=this.options).onRefresh)==null||L.call(x)}catch(E){alert(`Failed to create start screen template: ${E instanceof Error?E.message:String(E)}`)}if(e==="endgame-screen"||e==="endgame-screen-no-hand")try{let S=await fetch("/api/systems/endgame-screen",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,withHand:e==="endgame-screen"})}),_=await S.json().catch(()=>({}));if(!S.ok||(_==null?void 0:_.success)===!1){let I=((P=_==null?void 0:_.errors)==null?void 0:P.join(`
544
+ `))||(_==null?void 0:_.error)||"Failed to create endgame screen template.";alert(I);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(w=(O=this.options).onRefresh)==null||w.call(O)}catch(E){alert(`Failed to create endgame screen template: ${E instanceof Error?E.message:String(E)}`)}if(e==="bullet-system")try{let E=await fetch("/api/systems/bullet-system",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i})}),S=await E.json().catch(()=>({}));if(!E.ok||(S==null?void 0:S.success)===!1){let _=((k=S==null?void 0:S.errors)==null?void 0:k.join(`
545
+ `))||(S==null?void 0:S.error)||"Failed to create bullet system.";alert(_);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(C=(j=this.options).onRefresh)==null||C.call(j)}catch(E){alert(`Failed to create bullet system: ${E instanceof Error?E.message:String(E)}`)}if(e==="spawner"){let E=await this.promptSpawnerConfig();if(!E)return;let{templateId:S,instanceId:_,spawnerProps:I}=E;try{let R=await fetch("/api/systems/spawner",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:i,templateId:S,instanceId:_,spawnerProps:I,forceSync:!0})}),z=await R.json().catch(()=>({}));if(!R.ok||(z==null?void 0:z.success)===!1){let N=((A=z==null?void 0:z.errors)==null?void 0:A.join(`
546
+ `))||(z==null?void 0:z.error)||"Failed to create spawner.";alert(N);return}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),(T=(M=this.options).onRefresh)==null||T.call(M)}catch(R){alert(`Failed to create spawner: ${R instanceof Error?R.message:String(R)}`)}}}}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}async syncScreens(){try{let e=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})})}catch(e){console.warn("[AddObjectMenu] Failed to sync screens:",e)}}};var Ti=class{constructor(){this.root=null;this.listContainer=null;this.searchInput=null;this.selectedId=null;this.selectedIds=new Set;this.lastSelectedIndex=-1;this.objectEntries=[];this.options=null;this.retryTimer=null;this.screenFilter="all";this.isContextMenuOpen=!1;this.systemBundles=new Map;this.collapsedGroups=new Set}getScreenFilterStorageKey(){return`handler_preview_screen_filter::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getCollapseStorageKey(){return`handler_preview_scene_collapsed::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}loadCollapsedGroups(){try{let e=window.localStorage.getItem(this.getCollapseStorageKey());if(!e)return;let t=JSON.parse(e);Array.isArray(t)&&(this.collapsedGroups=new Set(t.filter(i=>typeof i=="string")))}catch{}}persistCollapsedGroups(){try{window.localStorage.setItem(this.getCollapseStorageKey(),JSON.stringify(Array.from(this.collapsedGroups)))}catch{}}isCollapsed(e){return this.collapsedGroups.has(e)}setCollapsed(e,t){t?this.collapsedGroups.add(e):this.collapsedGroups.delete(e),this.persistCollapsedGroups()}getCollapseKey(e){return encodeURIComponent(e)}getSystemBundleKey(e,t){return this.getCollapseKey(`bundle:${e}::${t}`)}render(){return`
547
547
  <div class="scene-panel scene-objects panel-accent-teal" data-panel="scene-objects">
548
548
  <div class="scene-panel-header" data-panel-handle>
549
549
  <div class="panel-title">
@@ -578,7 +578,7 @@ OK = Share, Cancel = Snapshot`);try{let c=await fetch("/api/objects/duplicate",{
578
578
  </div>
579
579
  <div class="panel-resize-handle-v" data-panel-resize-v></div>
580
580
  </div>
581
- `}initialize(e,t){var a,r,o,l,c,d,p,u;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(r=this.root)==null?void 0:r.querySelector("#scene-object-search"),(o=this.searchInput)==null||o.addEventListener("input",()=>this.refreshObjects()),this.loadCollapsedGroups(),(l=this.listContainer)==null||l.addEventListener("click",g=>{var S;let h=g.target,m=h==null?void 0:h.closest("[data-collapse-key]");if(m){let C=m.dataset.collapseKey||"";if(!C)return;let I=(S=this.listContainer)==null?void 0:S.querySelector(`[data-collapse-content="${C}"]`),O=this.isCollapsed(C);I&&(I.style.display=O?"":"none"),m.textContent=O?"\u25BE":"\u25B8",this.setCollapsed(C,!O),g.preventDefault(),g.stopPropagation();return}let f=h==null?void 0:h.closest("[data-object-visibility-toggle][data-object-id]");if(f){let C=f.dataset.objectId;if(!C)return;g.preventDefault(),g.stopPropagation(),this.toggleObjectVisibility(C);return}let b=h==null?void 0:h.closest("[data-system-bundle-action][data-system-bundle-id]");if(!b)return;g.preventDefault(),g.stopPropagation();let y=b.dataset.systemBundleAction,v=b.dataset.systemBundleId;if(!(!y||!v)){if(y==="toggle-visibility"){this.toggleSystemBundleVisibility(v);return}y==="delete"&&this.deleteSystemBundle(v)}});let i=(c=this.root)==null?void 0:c.querySelector("[data-add-object]");i==null||i.addEventListener("click",g=>{g.stopPropagation();let h=i.getBoundingClientRect();this.openAddObjectMenu({x:h.left,y:h.bottom+4})});let n=(d=this.root)==null?void 0:d.querySelector("#scene-screen-filter");if(n){try{let g=window.localStorage.getItem(this.getScreenFilterStorageKey());g&&(this.screenFilter=g)}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 g=n.value||"all";this.screenFilter=g;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",g=>{let h=g.target;if(!h||h.closest("[data-context-menu]"))return;if(h.tagName==="INPUT"&&h.classList.contains("scene-object-checkbox")){let S=h.dataset.objectId;if(!S)return;g.stopPropagation(),this.toggleBatchSelect(S);return}let m=h.closest(".scene-object-item[data-object-id]");if(!m)return;let f=m.dataset.objectId;if(!f)return;let b=g.ctrlKey||g.metaKey;g.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,f):b?this.toggleBatchSelect(f):this.select(f)}),(u=this.listContainer)==null||u.addEventListener("contextmenu",g=>{var S;let h=g.target,m=h==null?void 0:h.closest("[data-object-id]");if(!m)return;let f=m.dataset.objectId;if(!f)return;g.preventDefault();let b=window.getEditableObjectConfig,y=typeof b=="function"?b(f):null;if(!y){let C=window.__editableObjectConfigs;C&&typeof C.get=="function"&&(y=(S=C.get(f))!=null?S:null)}let v=this.inferScreen(f,y);this.showContextMenu(f,v,g.clientX,g.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){e?(this.selectedIds.clear(),this.selectedIds.add(e),this.selectedId=e):(this.selectedIds.clear(),this.selectedId=null),this.updateSelectionUI()}getSelectedIds(){return Array.from(this.selectedIds)}updateSelectionUI(){var a,r,o,l,c;if(!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{let p=d.dataset.objectId,u=p?this.selectedIds.has(p):!1,g=p===this.selectedId;d.classList.toggle("selected",u),d.classList.toggle("active",g);let h=d.closest(".scene-object-item-wrapper"),m=h==null?void 0:h.querySelector(".scene-object-checkbox");m&&(m.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(r=this.root)==null?void 0:r.querySelector("[data-breadcrumb-screen]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-object]");if(t&&i&&n){let d=this.selectedIds.size===1?this.selectedId:null;if(d){let p=window.getEditableObjectConfig,u=typeof p=="function"?p(d):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(l=b.get(d))!=null?l:null)}let g=this.inferScreen(d,u),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},m=(((c=u==null?void 0:u.identity)==null?void 0:c.id)||d).toString(),f=this.formatDisplayName(m);i.textContent=h[g]||g,n.textContent=f,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var p;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.refreshEditableConfigIndex;if(typeof t=="function"&&t(),typeof e!="function"){this.scheduleRetry();return}let i=e();if(!Array.isArray(i)||i.length===0){let u=window.__editableObjectConfigs;u&&typeof u.keys=="function"&&(i=Array.from(u.keys()))}if(!Array.isArray(i)||i.length===0){this.scheduleRetry();return}let n=(((p=this.searchInput)==null?void 0:p.value)||"").trim().toLowerCase(),a=["loading","start","gameplay","tutorial","endgame"],r={loading:{templates:[],systems:[],objects:[],bundles:new Map},start:{templates:[],systems:[],objects:[],bundles:new Map},gameplay:{templates:[],systems:[],objects:[],bundles:new Map},tutorial:{templates:[],systems:[],objects:[],bundles:new Map},endgame:{templates:[],systems:[],objects:[],bundles:new Map}};this.systemBundles=new Map;let o=u=>{var m,f,b,y,v;let g=(y=(b=(f=(m=window.__editableConfig)==null?void 0:m.objects)==null?void 0:f.get)==null?void 0:b.call(f,u))!=null?y:null;if(g)return g;let h=window.__editableObjectConfigs;return h&&typeof h.get=="function"&&(v=h.get(u))!=null?v:null};i.forEach(u=>{var M,L,E,x,_,P,R;let g=o(u),h=(((M=g==null?void 0:g.identity)==null?void 0:M.category)||"scene").toString(),m=(((L=g==null?void 0:g.identity)==null?void 0:L.id)||u).toString(),f=h.toLowerCase(),b=m.toLowerCase(),y=f.includes("ui")||b.startsWith("ui")||b.includes("label"),v=f==="system",S=((E=g==null?void 0:g.identity)==null?void 0:E.is_template)===!0||b.includes(".template")||u.toLowerCase().includes(".template"),C=typeof((x=g==null?void 0:g.identity)==null?void 0:x.system_group)=="string"?g.identity.system_group:null,I=typeof((_=g==null?void 0:g.identity)==null?void 0:_.system_label)=="string"?g.identity.system_label:C?this.formatDisplayName(C):null,O=this.formatDisplayName(m||u),w=((P=g==null?void 0:g.render)==null?void 0:P.visible)===!1||(g==null?void 0:g.enabled)===!1,T=this.getObjectType(g),j={id:u,label:O,category:h,isUi:y,isTemplate:S,isUnused:w,objectType:T,systemGroupId:C,systemLabel:I},A=this.inferScreen(j.id,g);if(!(this.screenFilter!=="all"&&A!==this.screenFilter||!(!n||j.id.toLowerCase().includes(n)||j.label.toLowerCase().includes(n)))){if(C){let z=this.getSystemBundleKey(A,C),N=I!=null?I:C,J=r[A],H=J.bundles.get(z);H?(H.entries.push(j),H.objectIds.push(u)):J.bundles.set(z,{key:z,label:N,objectIds:[u],entries:[j]});let q=(R=this.systemBundles.get(z))!=null?R:{label:N,objectIds:[]};q.label=N,q.objectIds.push(u),this.systemBundles.set(z,q);return}if(S){r[A].templates.push(j);return}v?r[A].systems.push(j):r[A].objects.push(j)}});let l={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},c=this.screenFilter==="all"?a:[this.screenFilter],d=c.map(u=>this.renderScreenGroup(u,l[u],r[u])).join("");this.listContainer.innerHTML=d,this.objectEntries=[];for(let u of c){let g=r[u];this.objectEntries.push(...g.templates),g.bundles.forEach(h=>this.objectEntries.push(...h.entries)),this.objectEntries.push(...g.systems),this.objectEntries.push(...g.objects)}for(let u of c){let g=r[u];if(!g.systems.length)continue;let h=this.listContainer.querySelector(`[data-delete-system-group="${u}"]`);h==null||h.addEventListener("click",m=>{m.stopPropagation(),this.deleteSystemGroup(g.systems)})}this.updateSelectionUI()}renderSystemBundle(e,t,i,n){let a=this.isBundleAllHidden(i),r=a?"Show all objects in this system":"Hide all objects in this system",o=a?"is-hidden":"",l=n.map(g=>this.renderEntryItem(g)).join(""),c=this.escapeHtml(e),d=this.getCollapseKey(`system:${e}`),p=this.isCollapsed(d);return`
581
+ `}initialize(e,t){var a,r,o,l,c,d,p,u;this.options=t,this.root=e.querySelector('[data-panel="scene-objects"]'),this.listContainer=(a=this.root)==null?void 0:a.querySelector("[data-object-list]"),this.searchInput=(r=this.root)==null?void 0:r.querySelector("#scene-object-search"),(o=this.searchInput)==null||o.addEventListener("input",()=>this.refreshObjects()),this.loadCollapsedGroups(),(l=this.listContainer)==null||l.addEventListener("click",g=>{var x;let h=g.target,f=h==null?void 0:h.closest("[data-collapse-key]");if(f){let L=f.dataset.collapseKey||"";if(!L)return;let P=(x=this.listContainer)==null?void 0:x.querySelector(`[data-collapse-content="${L}"]`),O=this.isCollapsed(L);P&&(P.style.display=O?"":"none"),f.textContent=O?"\u25BE":"\u25B8",this.setCollapsed(L,!O),g.preventDefault(),g.stopPropagation();return}let m=h==null?void 0:h.closest("[data-object-visibility-toggle][data-object-id]");if(m){let L=m.dataset.objectId;if(!L)return;g.preventDefault(),g.stopPropagation(),this.toggleObjectVisibility(L);return}let b=h==null?void 0:h.closest("[data-system-bundle-action][data-system-bundle-id]");if(!b)return;g.preventDefault(),g.stopPropagation();let y=b.dataset.systemBundleAction,v=b.dataset.systemBundleId;if(!(!y||!v)){if(y==="toggle-visibility"){this.toggleSystemBundleVisibility(v);return}y==="delete"&&this.deleteSystemBundle(v)}});let i=(c=this.root)==null?void 0:c.querySelector("[data-add-object]");i==null||i.addEventListener("click",g=>{g.stopPropagation();let h=i.getBoundingClientRect();this.openAddObjectMenu({x:h.left,y:h.bottom+4})});let n=(d=this.root)==null?void 0:d.querySelector("#scene-screen-filter");if(n){try{let g=window.localStorage.getItem(this.getScreenFilterStorageKey());g&&(this.screenFilter=g)}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{}try{let g=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof g=="function"&&g().catch(()=>{})}catch{}n.addEventListener("change",()=>{let g=n.value||"all";this.screenFilter=g;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{}try{let h=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof h=="function"&&h().catch(()=>{})}catch{}this.refreshObjects()})}(p=this.root)==null||p.addEventListener("click",g=>{let h=g.target;if(!h||h.closest("[data-context-menu]"))return;if(h.tagName==="INPUT"&&h.classList.contains("scene-object-checkbox")){let x=h.dataset.objectId;if(!x)return;g.stopPropagation(),this.toggleBatchSelect(x);return}let f=h.closest(".scene-object-item[data-object-id]");if(!f)return;let m=f.dataset.objectId;if(!m)return;let b=g.ctrlKey||g.metaKey;g.shiftKey&&this.lastSelectedIndex>=0?this.selectRange(this.lastSelectedIndex,m):b?this.toggleBatchSelect(m):this.select(m)}),(u=this.listContainer)==null||u.addEventListener("contextmenu",g=>{var x;let h=g.target,f=h==null?void 0:h.closest("[data-object-id]");if(!f)return;let m=f.dataset.objectId;if(!m)return;g.preventDefault();let b=window.getEditableObjectConfig,y=typeof b=="function"?b(m):null;if(!y){let L=window.__editableObjectConfigs;L&&typeof L.get=="function"&&(y=(x=L.get(m))!=null?x:null)}let v=this.inferScreen(m,y);this.showContextMenu(m,v,g.clientX,g.clientY)}),window.addEventListener("handler:screen-index-loaded",()=>this.refreshObjects()),window.addEventListener("handler:scene-objects-refresh",()=>this.refreshObjects())}setSelected(e){e?(this.selectedIds.clear(),this.selectedIds.add(e),this.selectedId=e):(this.selectedIds.clear(),this.selectedId=null),this.updateSelectionUI()}getSelectedIds(){return Array.from(this.selectedIds)}updateSelectionUI(){var a,r,o,l,c;if(!this.listContainer)return;Array.from(this.listContainer.querySelectorAll("[data-object-id]")).forEach(d=>{let p=d.dataset.objectId,u=p?this.selectedIds.has(p):!1,g=p===this.selectedId;d.classList.toggle("selected",u),d.classList.toggle("active",g);let h=d.closest(".scene-object-item-wrapper"),f=h==null?void 0:h.querySelector(".scene-object-checkbox");f&&(f.checked=u)});let t=(a=this.root)==null?void 0:a.querySelector("[data-breadcrumbs]"),i=(r=this.root)==null?void 0:r.querySelector("[data-breadcrumb-screen]"),n=(o=this.root)==null?void 0:o.querySelector("[data-breadcrumb-object]");if(t&&i&&n){let d=this.selectedIds.size===1?this.selectedId:null;if(d){let p=window.getEditableObjectConfig,u=typeof p=="function"?p(d):null;if(!u){let b=window.__editableObjectConfigs;b&&typeof b.get=="function"&&(u=(l=b.get(d))!=null?l:null)}let g=this.inferScreen(d,u),h={loading:"Loading",start:"Start",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},f=(((c=u==null?void 0:u.identity)==null?void 0:c.id)||d).toString(),m=this.formatDisplayName(f);i.textContent=h[g]||g,n.textContent=m,t.style.display="flex"}else t.style.display="none"}}refreshObjects(){var u;if(!this.listContainer)return;let e=window.getEditableObjectList,t=window.getEditableObjectListAll,i=window.refreshEditableConfigIndex;if(typeof i=="function"&&i(),typeof e!="function"&&typeof t!="function"){this.scheduleRetry();return}let n=typeof t=="function"?t():e();if(!Array.isArray(n)||n.length===0){let g=window.__editableObjectConfigs;g&&typeof g.keys=="function"&&(n=Array.from(g.keys()))}if(!Array.isArray(n)||n.length===0){this.scheduleRetry();return}let a=(((u=this.searchInput)==null?void 0:u.value)||"").trim().toLowerCase(),r=["loading","start","gameplay","tutorial","endgame"],o={loading:{templates:[],systems:[],objects:[],bundles:new Map},start:{templates:[],systems:[],objects:[],bundles:new Map},gameplay:{templates:[],systems:[],objects:[],bundles:new Map},tutorial:{templates:[],systems:[],objects:[],bundles:new Map},endgame:{templates:[],systems:[],objects:[],bundles:new Map}};this.systemBundles=new Map;let l=g=>{var m,b,y,v,x;let h=(v=(y=(b=(m=window.__editableConfig)==null?void 0:m.objects)==null?void 0:b.get)==null?void 0:y.call(b,g))!=null?v:null;if(h)return h;let f=window.__editableObjectConfigs;return f&&typeof f.get=="function"&&(x=f.get(g))!=null?x:null};n.forEach(g=>{var T,E,S,_,I,R,z;let h=l(g),f=(((T=h==null?void 0:h.identity)==null?void 0:T.category)||"scene").toString(),m=(((E=h==null?void 0:h.identity)==null?void 0:E.id)||g).toString(),b=f.toLowerCase(),y=m.toLowerCase(),v=b.includes("ui")||y.startsWith("ui")||y.includes("label"),x=b==="system",L=((S=h==null?void 0:h.identity)==null?void 0:S.is_template)===!0||y.includes(".template")||g.toLowerCase().includes(".template"),P=typeof((_=h==null?void 0:h.identity)==null?void 0:_.system_group)=="string"?h.identity.system_group:null,O=typeof((I=h==null?void 0:h.identity)==null?void 0:I.system_label)=="string"?h.identity.system_label:P?this.formatDisplayName(P):null,w=this.formatDisplayName(m||g),k=((R=h==null?void 0:h.render)==null?void 0:R.visible)===!1||(h==null?void 0:h.enabled)===!1,j=this.getObjectType(h),C={id:g,label:w,category:f,isUi:v,isTemplate:L,isUnused:k,objectType:j,systemGroupId:P,systemLabel:O},A=this.inferScreen(C.id,h);if(!(this.screenFilter!=="all"&&A!==this.screenFilter||!(!a||C.id.toLowerCase().includes(a)||C.label.toLowerCase().includes(a)))){if(P){let N=this.getSystemBundleKey(A,P),X=O!=null?O:P,F=o[A],q=F.bundles.get(N);q?(q.entries.push(C),q.objectIds.push(g)):F.bundles.set(N,{key:N,label:X,objectIds:[g],entries:[C]});let Q=(z=this.systemBundles.get(N))!=null?z:{label:X,objectIds:[]};Q.label=X,Q.objectIds.push(g),this.systemBundles.set(N,Q);return}if(L){o[A].templates.push(C);return}x?o[A].systems.push(C):o[A].objects.push(C)}});let c={loading:"Loading Screen",start:"Start Screen",gameplay:"Gameplay",tutorial:"Tutorial",endgame:"Endgame"},d=this.screenFilter==="all"?r:[this.screenFilter],p=d.map(g=>this.renderScreenGroup(g,c[g],o[g])).join("");this.listContainer.innerHTML=p,this.objectEntries=[];for(let g of d){let h=o[g];this.objectEntries.push(...h.templates),h.bundles.forEach(f=>this.objectEntries.push(...f.entries)),this.objectEntries.push(...h.systems),this.objectEntries.push(...h.objects)}for(let g of d){let h=o[g];if(!h.systems.length)continue;let f=this.listContainer.querySelector(`[data-delete-system-group="${g}"]`);f==null||f.addEventListener("click",m=>{m.stopPropagation(),this.deleteSystemGroup(h.systems)})}this.updateSelectionUI()}renderSystemBundle(e,t,i,n){let a=this.isBundleAllHidden(i),r=a?"Show all objects in this system":"Hide all objects in this system",o=a?"is-hidden":"",l=n.map(g=>this.renderEntryItem(g)).join(""),c=this.escapeHtml(e),d=this.getCollapseKey(`system:${e}`),p=this.isCollapsed(d);return`
582
582
  <div class="scene-object-group scene-object-group-bundle" data-system-bundle="${c}">
583
583
  <div class="scene-object-group-title">
584
584
  <button class="scene-object-group-toggle" type="button" data-collapse-key="${d}">${p?"\u25B8":"\u25BE"}</button>
@@ -702,7 +702,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
702
702
  </div>
703
703
  </div>
704
704
  </div>
705
- `}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 w;this.isCollapsed=!this.isCollapsed,(w=this.root)==null||w.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let a=(w,T)=>{var A;let j=(A=this.root)==null?void 0:A.querySelector(`[data-status="${w}"]`);j&&j.classList.toggle("active",T)},r=this.root.querySelector("#debug-highlight-object");r==null||r.addEventListener("change",()=>{var w;(w=this.options)==null||w.onHighlightObject(!!r.checked),a("bounds",r.checked)});let o=this.root.querySelector("#debug-highlight-anchor");o==null||o.addEventListener("change",()=>{var w;(w=this.options)==null||w.onHighlightAnchor(!!o.checked),a("anchor",o.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{a("nudge",l.checked)});let c=this.root.querySelector("#scene-grid-enabled"),d=this.root.querySelector("#scene-grid-gap"),p=this.root.querySelector("#scene-grid-alpha"),u=this.root.querySelector("#scene-grid-alpha-value"),g=this.root.querySelector("#scene-play-mode"),h=this.root.querySelector("[data-grid-toggle-btn]"),m=this.root.querySelector("[data-play-toggle-btn]"),f=()=>{if(!p)return .25;let w=Number(p.value),T=Number.isFinite(w)?Math.min(1,Math.max(0,w)):.25;return p.value=String(T),u&&(u.textContent=`${Math.round(T*100)}%`),T},b=(w,T,j)=>{var k,M;let A=j!==void 0?j:f();(M=(k=this.options)==null?void 0:k.onGridToggle)==null||M.call(k,w,T,A),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:w,gap:T,alpha:A}}))},y=w=>{var j,A;let T=f();(A=(j=this.options)==null?void 0:j.onGridGapChange)==null||A.call(j,w),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:w,alpha:T}}))},v=w=>{var T,j;(j=(T=this.options)==null?void 0:T.onGridAlphaChange)==null||j.call(T,w),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:C(),alpha:w}}))},S=w=>{var T,j;(j=(T=this.options)==null?void 0:T.onPlayModeChange)==null||j.call(T,w),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:w}}))},C=()=>{if(!d)return 50;let w=Number(d.value),T=Number.isFinite(w)?Math.min(200,Math.max(4,w)):50;return d.value=String(T),T},I=w=>{c&&(c.checked=w),d&&(d.disabled=!w),p&&(p.disabled=!w),h==null||h.classList.toggle("active",w)},O=w=>{g&&(g.checked=w),m==null||m.classList.toggle("active",w)};try{let w=localStorage.getItem(this.getSceneStorageKey("grid_enabled")),T=localStorage.getItem(this.getSceneStorageKey("grid_gap")),j=localStorage.getItem(this.getSceneStorageKey("grid_alpha")),A=localStorage.getItem(this.getSceneStorageKey("play_mode")),k=w?w==="true":!1;I(k),d&&(d.value=T||"50",d.disabled=!k),p&&(p.value=j||"0.25",p.disabled=!k,f()),O(A==="true"),b(k,C(),f()),S(A==="true")}catch{}c==null||c.addEventListener("change",()=>{let w=C(),T=f();d&&(d.disabled=!c.checked),p&&(p.disabled=!c.checked),h==null||h.classList.toggle("active",c.checked);try{localStorage.setItem(this.getSceneStorageKey("grid_enabled"),c.checked?"true":"false"),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(w)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(T))}catch{}b(c.checked,w,T)}),d==null||d.addEventListener("input",()=>{let w=C(),T=f();try{localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(w)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(T))}catch{}y(w)}),p==null||p.addEventListener("input",()=>{let w=f(),T=C();try{localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(w)),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(T))}catch{}v(w)}),g==null||g.addEventListener("change",()=>{try{localStorage.setItem(this.getSceneStorageKey("play_mode"),g.checked?"true":"false")}catch{}m==null||m.classList.toggle("active",g.checked),S(g.checked)}),h==null||h.addEventListener("click",()=>{c&&(c.checked=!c.checked,c.dispatchEvent(new Event("change")))}),m==null||m.addEventListener("click",()=>{g&&(g.checked=!g.checked,g.dispatchEvent(new Event("change")))})}updateInfo(e){}};var Pi=class{constructor(){this.root=null;this.options=null}render(){return`
705
+ `}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 w;this.isCollapsed=!this.isCollapsed,(w=this.root)==null||w.classList.toggle("collapsed",this.isCollapsed),localStorage.setItem("scene-tools-collapsed",String(this.isCollapsed))});let a=(w,k)=>{var C;let j=(C=this.root)==null?void 0:C.querySelector(`[data-status="${w}"]`);j&&j.classList.toggle("active",k)},r=this.root.querySelector("#debug-highlight-object");r==null||r.addEventListener("change",()=>{var w;(w=this.options)==null||w.onHighlightObject(!!r.checked),a("bounds",r.checked)});let o=this.root.querySelector("#debug-highlight-anchor");o==null||o.addEventListener("change",()=>{var w;(w=this.options)==null||w.onHighlightAnchor(!!o.checked),a("anchor",o.checked)});let l=this.root.querySelector("#debug-nudge-enabled");l==null||l.addEventListener("change",()=>{a("nudge",l.checked)});let c=this.root.querySelector("#scene-grid-enabled"),d=this.root.querySelector("#scene-grid-gap"),p=this.root.querySelector("#scene-grid-alpha"),u=this.root.querySelector("#scene-grid-alpha-value"),g=this.root.querySelector("#scene-play-mode"),h=this.root.querySelector("[data-grid-toggle-btn]"),f=this.root.querySelector("[data-play-toggle-btn]"),m=()=>{if(!p)return .25;let w=Number(p.value),k=Number.isFinite(w)?Math.min(1,Math.max(0,w)):.25;return p.value=String(k),u&&(u.textContent=`${Math.round(k*100)}%`),k},b=(w,k,j)=>{var A,M;let C=j!==void 0?j:m();(M=(A=this.options)==null?void 0:A.onGridToggle)==null||M.call(A,w,k,C),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:w,gap:k,alpha:C}}))},y=w=>{var j,C;let k=m();(C=(j=this.options)==null?void 0:j.onGridGapChange)==null||C.call(j,w),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:w,alpha:k}}))},v=w=>{var k,j;(j=(k=this.options)==null?void 0:k.onGridAlphaChange)==null||j.call(k,w),window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:!!(c!=null&&c.checked),gap:L(),alpha:w}}))},x=w=>{var k,j;(j=(k=this.options)==null?void 0:k.onPlayModeChange)==null||j.call(k,w),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:w}}))},L=()=>{if(!d)return 50;let w=Number(d.value),k=Number.isFinite(w)?Math.min(200,Math.max(4,w)):50;return d.value=String(k),k},P=w=>{c&&(c.checked=w),d&&(d.disabled=!w),p&&(p.disabled=!w),h==null||h.classList.toggle("active",w)},O=w=>{g&&(g.checked=w),f==null||f.classList.toggle("active",w)};try{let w=localStorage.getItem(this.getSceneStorageKey("grid_enabled")),k=localStorage.getItem(this.getSceneStorageKey("grid_gap")),j=localStorage.getItem(this.getSceneStorageKey("grid_alpha")),C=localStorage.getItem(this.getSceneStorageKey("play_mode")),A=w?w==="true":!1;P(A),d&&(d.value=k||"50",d.disabled=!A),p&&(p.value=j||"0.25",p.disabled=!A,m()),O(C==="true"),b(A,L(),m()),x(C==="true")}catch{}c==null||c.addEventListener("change",()=>{let w=L(),k=m();d&&(d.disabled=!c.checked),p&&(p.disabled=!c.checked),h==null||h.classList.toggle("active",c.checked);try{localStorage.setItem(this.getSceneStorageKey("grid_enabled"),c.checked?"true":"false"),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(w)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(k))}catch{}b(c.checked,w,k)}),d==null||d.addEventListener("input",()=>{let w=L(),k=m();try{localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(w)),localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(k))}catch{}y(w)}),p==null||p.addEventListener("input",()=>{let w=m(),k=L();try{localStorage.setItem(this.getSceneStorageKey("grid_alpha"),String(w)),localStorage.setItem(this.getSceneStorageKey("grid_gap"),String(k))}catch{}v(w)}),g==null||g.addEventListener("change",()=>{try{localStorage.setItem(this.getSceneStorageKey("play_mode"),g.checked?"true":"false")}catch{}f==null||f.classList.toggle("active",g.checked),x(g.checked)}),h==null||h.addEventListener("click",()=>{c&&(c.checked=!c.checked,c.dispatchEvent(new Event("change")))}),f==null||f.addEventListener("click",()=>{g&&(g.checked=!g.checked,g.dispatchEvent(new Event("change")))})}updateInfo(e){}};var Pi=class{constructor(){this.root=null;this.options=null}render(){return`
706
706
  <div class="nudge-panel hidden" data-panel="nudge-panel">
707
707
  <div class="nudge-panel-header" data-panel-handle>
708
708
  <span class="nudge-panel-title">Nudge Controls</span>
@@ -759,7 +759,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
759
759
  </div>
760
760
  </div>
761
761
  </div>
762
- `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(a=>{a.addEventListener("click",()=>{var l,c,d,p;let r=a.dataset.nudge,o=this.getNudgeStep();switch(r){case"up":(l=this.options)==null||l.onNudge(0,-o);break;case"down":(c=this.options)==null||c.onNudge(0,o);break;case"left":(d=this.options)==null||d.onNudge(-o,0);break;case"right":(p=this.options)==null||p.onNudge(o,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(a=>{a.addEventListener("click",()=>{var l;let o=a.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(o)})})}show(){var e;(e=this.root)==null||e.classList.remove("hidden")}hide(){var e;(e=this.root)==null||e.classList.add("hidden")}getNudgeStep(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector("#nudge-step-input"),t=Number((n=e==null?void 0:e.value)!=null?n:10);return Number.isFinite(t)&&t>0?t:10}};var zt=class{constructor(){this.root=null;this.slotsContainer=null;this.assetsContainer=null;this.assetSearchInput=null;this.slotSearchInput=null;this.options=null;this.registry=null;this.selectedSlotId=null;this.cachedAssets={};this.pendingAssetFetches={};this.cacheBust=0}mergeRegistries(e,t){let i=e||{},n=t||{},a={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},r=Array.isArray(i.slots)?i.slots:[];if(r.length>0&&a.slots.length>0)for(let c of a.slots){let d=r.find(p=>(p==null?void 0:p.slotId)&&p.slotId===(c==null?void 0:c.slotId));d!=null&&d.currentAsset&&d.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=d.currentAsset)}let o=i.libraryAssets||{};for(let[c,d]of Object.entries(o)){if(!Array.isArray(d))continue;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let p=new Set((a.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of d){let g=u==null?void 0:u.filename;!g||p.has(g)||(a.libraryAssets[c].unshift(u),p.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
762
+ `}initialize(e,t){if(this.options=t,this.root=e.querySelector('[data-panel="nudge-panel"]'),!this.root)return;Array.from(this.root.querySelectorAll(".nudge-arrow-btn")).forEach(a=>{a.addEventListener("click",()=>{var l,c,d,p;let r=a.dataset.nudge,o=this.getNudgeStep();switch(r){case"up":(l=this.options)==null||l.onNudge(0,-o);break;case"down":(c=this.options)==null||c.onNudge(0,o);break;case"left":(d=this.options)==null||d.onNudge(-o,0);break;case"right":(p=this.options)==null||p.onNudge(o,0);break}})}),Array.from(this.root.querySelectorAll(".nudge-scale-btn")).forEach(a=>{a.addEventListener("click",()=>{var l;let o=a.dataset.scale==="up"?.1:-.1;(l=this.options)==null||l.onScale(o)})})}show(){var e;(e=this.root)==null||e.classList.remove("hidden")}hide(){var e;(e=this.root)==null||e.classList.add("hidden")}getNudgeStep(){var i,n;let e=(i=this.root)==null?void 0:i.querySelector("#nudge-step-input"),t=Number((n=e==null?void 0:e.value)!=null?n:10);return Number.isFinite(t)&&t>0?t:10}};var zt=class{constructor(){this.root=null;this.slotsContainer=null;this.assetsContainer=null;this.assetSearchInput=null;this.slotSearchInput=null;this.options=null;this.registry=null;this.selectedSlotId=null;this.cachedAssets={};this.pendingAssetFetches={};this.cacheBust=0;this.missingPreviewPaths=new Set;this.slotSearchDebounce=null;this.assetSearchDebounce=null}mergeRegistries(e,t){let i=e||{},n=t||{},a={slots:Array.isArray(n.slots)?[...n.slots]:[],libraryAssets:typeof n.libraryAssets=="object"&&n.libraryAssets?{...n.libraryAssets}:{},categories:Array.isArray(n.categories)?[...n.categories]:[]},r=Array.isArray(i.slots)?i.slots:[];if(r.length>0&&a.slots.length>0)for(let c of a.slots){let d=r.find(p=>(p==null?void 0:p.slotId)&&p.slotId===(c==null?void 0:c.slotId));d!=null&&d.currentAsset&&d.currentAsset!==(c==null?void 0:c.currentAsset)&&(c.currentAsset=d.currentAsset)}let o=i.libraryAssets||{};for(let[c,d]of Object.entries(o)){if(!Array.isArray(d))continue;a.libraryAssets[c]||(a.libraryAssets[c]=[]);let p=new Set((a.libraryAssets[c]||[]).map(u=>u==null?void 0:u.filename));for(let u of d){let g=u==null?void 0:u.filename;!g||p.has(g)||(a.libraryAssets[c].unshift(u),p.add(g))}}let l=new Set(a.categories||[]);for(let c of i.categories||[])typeof c=="string"&&l.add(c);return a.categories=Array.from(l),a}render(){return`
763
763
  <div class="scene-panel library-panel panel-accent-purple" data-panel="library">
764
764
  <div class="scene-panel-header" data-panel-handle>
765
765
  <div class="panel-title">
@@ -776,18 +776,18 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
776
776
  <div class="library-subtitle">Select a slot on the left, then pick any asset from the full library</div>
777
777
  <div style="display:flex; gap:12px; align-items:stretch; min-height:240px;">
778
778
  <div style="flex:0 0 260px; min-width:220px; display:flex; flex-direction:column; gap:8px;">
779
- <input class="inspector-input" type="search" placeholder="Search slots..." data-library-slot-search />
779
+ <input class="inspector-input" type="search" placeholder="Search slots..." data-library-slot-search style="height:28px; min-height:28px; max-height:32px;" />
780
780
  <div class="library-slots" data-library-slots style="overflow:auto; flex:1; min-height:200px;"></div>
781
781
  </div>
782
782
  <div style="flex:1; display:flex; flex-direction:column; gap:8px; min-width:240px;">
783
- <input class="inspector-input" type="search" placeholder="Search assets..." data-library-asset-search />
783
+ <input class="inspector-input" type="search" placeholder="Search assets..." data-library-asset-search style="height:28px; min-height:28px; max-height:32px;" />
784
784
  <div class="library-slots" data-library-assets style="overflow:auto; flex:1; min-height:200px;"></div>
785
785
  </div>
786
786
  </div>
787
787
  </div>
788
788
  <div class="panel-resize-handle" data-panel-resize></div>
789
789
  </div>
790
- `}initialize(e,t){var a,r,o,l,c,d,p,u;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]"),this.assetsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-assets]"),this.assetSearchInput=(o=this.root)==null?void 0:o.querySelector("[data-library-asset-search]"),this.slotSearchInput=(l=this.root)==null?void 0:l.querySelector("[data-library-slot-search]");let i=(c=this.root)==null?void 0:c.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(d=this.root)==null?void 0:d.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),(p=this.assetSearchInput)==null||p.addEventListener("input",()=>this.renderAssets()),(u=this.slotSearchInput)==null||u.addEventListener("input",()=>this.renderSlots()),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){var i,n;let t=window.getEditableAssets;if(typeof t=="function"){let a=t();if(a!=null&&a.slots&&Array.isArray(a.slots)&&a.slots.length>0){this.registry=a,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.cacheBust=Date.now(),this.cachedAssets={},this.pendingAssetFetches={},this.selectedSlotId&&this.registry.slots.some(o=>o.slotId===this.selectedSlotId)||(this.selectedSlotId=(n=(i=this.registry.slots[0])==null?void 0:i.slotId)!=null?n:null),this.renderSlots(),this.renderAssets();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(){var n;if(!this.slotsContainer||!this.registry)return;let e={};for(let a of this.registry.slots)e[a.category]||(e[a.category]=[]),e[a.category].push(a);let t=this.cacheBust||Date.now(),i=(((n=this.slotSearchInput)==null?void 0:n.value)||"").trim().toLowerCase();this.slotsContainer.innerHTML="";for(let a of this.getCategories()){let r=(e[a]||[]).filter(d=>i?`${d.displayName} ${d.slotId} ${d.objectId} ${d.currentAsset}`.toLowerCase().includes(i):!0);if(r.length===0)continue;let o=document.createElement("div");o.className="library-category";let l=document.createElement("div");l.className="library-category-header",l.textContent=this.formatCategoryName(a),o.appendChild(l);let c=document.createElement("div");c.className="library-category-slots";for(let d of r){let p=this.createSlotElement(d,t);c.appendChild(p)}o.appendChild(c),this.slotsContainer.appendChild(o)}if(!this.slotsContainer.hasChildNodes()){let a=document.createElement("div");a.className="library-info",a.textContent=i?"No slots match your search":"No editable slots available",this.slotsContainer.appendChild(a)}}createSlotElement(e,t){var m;let i=this.selectedSlotId===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let a=document.createElement("div");a.className="slot-header";let r=document.createElement("div");if(r.className="slot-current",(m=e.currentAsset)==null?void 0:m.toLowerCase().endsWith(".json")){let f=document.createElement("div");f.className="slot-thumbnail slot-thumbnail-json",f.textContent="\u{1F3AC}",f.title="Lottie/JSON Animation",r.appendChild(f)}else{let f=document.createElement("img"),y=e.libraryFolder&&e.currentAsset&&e.currentAsset!==e.defaultAsset?`raw/library/${e.libraryFolder}/${e.currentAsset}`:`raw/${e.currentAsset}`;f.src=`/${y}?t=${t}`,f.alt=e.displayName,f.className="slot-thumbnail",f.onerror=()=>{e.libraryFolder&&e.currentAsset?f.src=`/raw/${e.currentAsset}?t=${t}`:f.style.display="none"},r.appendChild(f)}a.appendChild(r);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let d=document.createElement("div");d.className="slot-asset",d.textContent=e.currentAsset,l.appendChild(c),l.appendChild(d),a.appendChild(l);let p=document.createElement("div");p.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async f=>{f.stopPropagation(),await this.handleAIEdit(e)}),p.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async f=>{f.stopPropagation(),await this.handleUpload(e)}),p.appendChild(g);let h=document.createElement("button");return h.className="slot-reset",h.title="Reset to default",h.textContent="\u21BA",h.addEventListener("click",async f=>{f.stopPropagation(),await this.handleReset(e)}),p.appendChild(h),a.appendChild(p),a.addEventListener("click",()=>{this.selectedSlotId=e.slotId,this.renderSlots(),this.renderAssets()}),n.appendChild(a),n}renderAssets(){var l;if(!this.assetsContainer||!this.registry)return;let e=this.cacheBust||Date.now(),t=(((l=this.assetSearchInput)==null?void 0:l.value)||"").trim().toLowerCase(),i=this.getSelectedSlot();this.assetsContainer.innerHTML="";let n=document.createElement("div");n.className="library-selected",n.textContent=i?`Selected slot: ${i.displayName} (${i.currentAsset||"no asset"})`:"Select a slot to apply assets",n.style.gridColumn="1 / -1",this.assetsContainer.appendChild(n);let a=this.getCategories(),r=!1,o=!1;for(let c of a){let d=this.getCategoryAssets(c,e);if(!d){let m=document.createElement("div");m.className="library-empty",m.textContent=`Loading ${this.formatCategoryName(c)} assets...`,this.assetsContainer.appendChild(m),o=!0;continue}let p=d.filter(m=>t?`${m.displayName} ${m.filename} ${c}`.toLowerCase().includes(t):!0);if(p.length===0)continue;let u=document.createElement("div");u.className="library-category";let g=document.createElement("div");g.className="library-category-header",g.textContent=this.formatCategoryName(c),u.appendChild(g);let h=document.createElement("div");h.className="slot-library",h.style.borderTop="none",h.style.padding="10px";for(let m of p){let f=document.createElement("div");f.className="library-item",i&&i.currentAsset===m.filename&&i.libraryFolder===c&&f.classList.add("selected");let b=document.createElement("img");b.src=`/raw/library/${c}/${m.filename}?t=${e}`,b.alt=m.displayName,b.className="library-thumbnail",b.onerror=()=>{b.style.opacity="0.3"},f.appendChild(b);let y=document.createElement("div");y.className="library-label",y.textContent=m.displayName,f.appendChild(y),f.addEventListener("click",async()=>{if(!i){alert("Select a slot first to apply an asset.");return}await this.handleApply(i,m.filename,c)}),h.appendChild(f),r=!0}u.appendChild(h),this.assetsContainer.appendChild(u)}if(!r&&!o){let c=document.createElement("div");c.className="library-empty",c.textContent=t?"No assets match your search":"No assets available",this.assetsContainer.appendChild(c)}}getCategoryAssets(e,t){var i;if(this.cachedAssets[e])return this.cachedAssets[e];if(!this.pendingAssetFetches[e]){let n=((i=this.registry)==null?void 0:i.libraryAssets[e])||[];this.pendingAssetFetches[e]=this.fetchFolderAssets(e,t).then(a=>{let r=new Map;for(let o of n)r.set(o.filename,o);for(let o of a)r.has(o.filename)||r.set(o.filename,o);return this.cachedAssets[e]=Array.from(r.values()),delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]}).catch(()=>(this.cachedAssets[e]=n,delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]))}return null}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],r=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=r.exec(n))!==null;){let l=o[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t,i){var n;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let a=window.__wizardAssetPicker;if(a!=null&&a.onPick){let l=`raw/library/${i||e.libraryFolder||e.category}/${t}`;a.onPick(l),window.__wizardAssetPicker=null;return}let r=i||e.libraryFolder||e.category;await((n=this.options)==null?void 0:n.onApply(e.objectId,t,r)),e.currentAsset=t,e.libraryFolder=r,this.renderSlots(),this.renderAssets()}catch(a){console.error("[LIBRARY] Failed to apply asset:",a)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots(),this.renderAssets()}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(" ")}getCategories(){if(!this.registry)return[];let e=new Set;if(Array.isArray(this.registry.categories))for(let t of this.registry.categories)t&&e.add(t);for(let t of Object.keys(this.registry.libraryAssets||{}))t&&e.add(t);for(let t of this.registry.slots||[])t!=null&&t.category&&e.add(t.category);return Array.from(e)}getSelectedSlot(){return!this.registry||!this.selectedSlotId?null:this.registry.slots.find(e=>e.slotId===this.selectedSlotId)||null}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let a=await this.fileToDataUrl(i);if(!a){alert("Failed to read file");return}let o=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",o,"to category:",l);let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${o}.png`,data:a,overwrite:!0})})).json();if(d.success){console.log("[Library] \u2705 Upload saved:",d.path);let p=window.addAssetToRegistry;typeof p=="function"&&p(l,`${o}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(u){console.warn("[Library] Setup-library not available:",u)}await this.handleApply(e,`${o}.png`,e.category),e.currentAsset=`${o}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",d.error),alert(`Upload failed: ${d.error}`)}catch(a){console.error("[Library] \u274C Upload error:",a),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.selectedSlotId=n.slotId,this.renderSlots(),this.renderAssets(),setTimeout(()=>{var r;let a=(r=this.slotsContainer)==null?void 0:r.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Ii=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 Mi=class{render(e,t,i,n){let a=this.formatLabel(t),r=i?this.getThumbnailUrl(i):"";return`
790
+ `}initialize(e,t){var a,r,o,l,c,d,p,u;this.options=t,this.root=e.querySelector('[data-panel="library"]'),this.slotsContainer=(a=this.root)==null?void 0:a.querySelector("[data-library-slots]"),this.assetsContainer=(r=this.root)==null?void 0:r.querySelector("[data-library-assets]"),this.assetSearchInput=(o=this.root)==null?void 0:o.querySelector("[data-library-asset-search]"),this.slotSearchInput=(l=this.root)==null?void 0:l.querySelector("[data-library-slot-search]");let i=(c=this.root)==null?void 0:c.querySelector("[data-create-ai]");i==null||i.addEventListener("click",()=>{this.handleCreateWithAI()});let n=(d=this.root)==null?void 0:d.querySelector("[data-refresh-library]");n==null||n.addEventListener("click",()=>{n.classList.add("pulse-anim"),this.refresh(),setTimeout(()=>n.classList.remove("pulse-anim"),500)}),(p=this.assetSearchInput)==null||p.addEventListener("input",()=>this.scheduleRenderAssets()),(u=this.slotSearchInput)==null||u.addEventListener("input",()=>this.scheduleRenderSlots()),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){var i,n;let t=window.getEditableAssets;if(typeof t=="function"){let a=t();if(a!=null&&a.slots&&Array.isArray(a.slots)&&a.slots.length>0){this.registry=a,console.log("[LIBRARY] Loaded slot-based registry:",this.registry.slots.length,"slots"),this.cacheBust=Date.now(),this.cachedAssets={},this.pendingAssetFetches={},this.missingPreviewPaths.clear(),this.selectedSlotId&&this.registry.slots.some(o=>o.slotId===this.selectedSlotId)||(this.selectedSlotId=(n=(i=this.registry.slots[0])==null?void 0:i.slotId)!=null?n:null),this.renderSlots(),this.renderAssets();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(){var n;if(!this.slotsContainer||!this.registry)return;let e={};for(let a of this.registry.slots)e[a.category]||(e[a.category]=[]),e[a.category].push(a);let t=this.cacheBust||Date.now(),i=(((n=this.slotSearchInput)==null?void 0:n.value)||"").trim().toLowerCase();this.slotsContainer.innerHTML="";for(let a of this.getCategories()){let r=(e[a]||[]).filter(d=>i?`${d.displayName} ${d.slotId} ${d.objectId} ${d.currentAsset}`.toLowerCase().includes(i):!0);if(r.length===0)continue;let o=document.createElement("div");o.className="library-category";let l=document.createElement("div");l.className="library-category-header",l.textContent=this.formatCategoryName(a),o.appendChild(l);let c=document.createElement("div");c.className="library-category-slots";for(let d of r){let p=this.createSlotElement(d,t);c.appendChild(p)}o.appendChild(c),this.slotsContainer.appendChild(o)}if(!this.slotsContainer.hasChildNodes()){let a=document.createElement("div");a.className="library-info",a.textContent=i?"No slots match your search":"No editable slots available",this.slotsContainer.appendChild(a)}}createSlotElement(e,t){var f,m;let i=this.selectedSlotId===e.slotId,n=document.createElement("div");n.className=`library-slot ${i?"expanded":""}`,n.dataset.slotId=e.slotId;let a=document.createElement("div");a.className="slot-header";let r=document.createElement("div");if(r.className="slot-current",(f=e.currentAsset)==null?void 0:f.toLowerCase().endsWith(".json")){let b=document.createElement("div");b.className="slot-thumbnail slot-thumbnail-json",b.textContent="\u{1F3AC}",b.title="Lottie/JSON Animation",r.appendChild(b)}else{let b=document.createElement("img"),y=this.resolveSlotPreviewPaths(e),v=y.primary,x=(m=y.fallback)!=null?m:null;if(!v)b.style.display="none";else if(this.missingPreviewPaths.has(v.key)&&(!x||this.missingPreviewPaths.has(x.key)))b.style.display="none";else{b.src=v.src(t),b.alt=e.displayName,b.className="slot-thumbnail",b.loading="lazy";let L=!1;b.onerror=()=>{if(L){b.onerror=null,b.style.display="none";return}if(this.missingPreviewPaths.add(v.key),x&&!this.missingPreviewPaths.has(x.key)){L=!0,b.src=x.src(t);return}x&&this.missingPreviewPaths.add(x.key),b.style.display="none"}}r.appendChild(b)}a.appendChild(r);let l=document.createElement("div");l.className="slot-info";let c=document.createElement("div");c.className="slot-name",c.textContent=e.displayName;let d=document.createElement("div");d.className="slot-asset",d.textContent=e.currentAsset,l.appendChild(c),l.appendChild(d),a.appendChild(l);let p=document.createElement("div");p.className="slot-actions";let u=document.createElement("button");u.className="slot-ai-edit",u.title="Edit with AI",u.textContent="\u2728 AI",u.addEventListener("click",async b=>{b.stopPropagation(),await this.handleAIEdit(e)}),p.appendChild(u);let g=document.createElement("button");g.className="slot-upload",g.title="Upload new asset",g.textContent="\u{1F4E4}",g.addEventListener("click",async b=>{b.stopPropagation(),await this.handleUpload(e)}),p.appendChild(g);let h=document.createElement("button");return h.className="slot-reset",h.title="Reset to default",h.textContent="\u21BA",h.addEventListener("click",async b=>{b.stopPropagation(),await this.handleReset(e)}),p.appendChild(h),a.appendChild(p),a.addEventListener("click",()=>{this.selectedSlotId=e.slotId,this.renderSlots(),this.renderAssets()}),n.appendChild(a),n}renderAssets(){var l;if(!this.assetsContainer||!this.registry)return;let e=this.cacheBust||Date.now(),t=(((l=this.assetSearchInput)==null?void 0:l.value)||"").trim().toLowerCase(),i=this.getSelectedSlot();this.assetsContainer.innerHTML="";let n=document.createElement("div");n.className="library-selected",n.textContent=i?`Selected slot: ${i.displayName} (${i.currentAsset||"no asset"})`:"Select a slot to apply assets",n.style.gridColumn="1 / -1",this.assetsContainer.appendChild(n);let a=this.getCategories(),r=!1,o=!1;for(let c of a){let d=this.getCategoryAssets(c,e);if(!d){let f=document.createElement("div");f.className="library-empty",f.textContent=`Loading ${this.formatCategoryName(c)} assets...`,this.assetsContainer.appendChild(f),o=!0;continue}let p=d.filter(f=>t?`${f.displayName} ${f.filename} ${c}`.toLowerCase().includes(t):!0);if(p.length===0)continue;let u=document.createElement("div");u.className="library-category";let g=document.createElement("div");g.className="library-category-header",g.textContent=this.formatCategoryName(c),u.appendChild(g);let h=document.createElement("div");h.className="slot-library",h.style.borderTop="none",h.style.padding="10px";for(let f of p){let m=document.createElement("div");m.className="library-item",i&&i.currentAsset===f.filename&&i.libraryFolder===c&&m.classList.add("selected");let b=document.createElement("img"),y=this.resolveLibraryAssetPath(c,f.filename);this.missingPreviewPaths.has(y.key)?b.style.display="none":b.src=y.src(e),b.alt=f.displayName,b.className="library-thumbnail",b.loading="lazy",b.onerror=()=>{this.missingPreviewPaths.add(y.key),b.style.opacity="0.3"},m.appendChild(b);let v=document.createElement("div");v.className="library-label",v.textContent=f.displayName,m.appendChild(v),m.addEventListener("click",async()=>{if(!i){alert("Select a slot first to apply an asset.");return}await this.handleApply(i,f.filename,c)}),h.appendChild(m),r=!0}u.appendChild(h),this.assetsContainer.appendChild(u)}if(!r&&!o){let c=document.createElement("div");c.className="library-empty",c.textContent=t?"No assets match your search":"No assets available",this.assetsContainer.appendChild(c)}}getCategoryAssets(e,t){var i;if(this.cachedAssets[e])return this.cachedAssets[e];if(!this.pendingAssetFetches[e]){let n=((i=this.registry)==null?void 0:i.libraryAssets[e])||[];this.pendingAssetFetches[e]=this.fetchFolderAssets(e,t).then(a=>{let r=new Map;for(let o of n)r.set(o.filename,o);for(let o of a)r.has(o.filename)||r.set(o.filename,o);return this.cachedAssets[e]=Array.from(r.values()),delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]}).catch(()=>(this.cachedAssets[e]=n,delete this.pendingAssetFetches[e],this.renderAssets(),this.cachedAssets[e]))}return null}async fetchFolderAssets(e,t){try{let i=await fetch(`/raw/library/${e}/?t=${t}`);if(!i.ok)return[];let n=await i.text(),a=[],r=/href="([^"]+\.(png|jpg|jpeg))"/gi,o;for(;(o=r.exec(n))!==null;){let l=o[1];if(!l.startsWith("/")&&!l.startsWith("..")){let c=l.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");a.push({filename:l,displayName:c})}}return a}catch{return console.log("[LIBRARY] Could not fetch folder listing, using registry only"),[]}}async handleApply(e,t,i){var n;console.log("[LIBRARY] Applying asset:",t,"to slot:",e.slotId);try{let a=window.__wizardAssetPicker;if(a!=null&&a.onPick){let l=`raw/library/${i||e.libraryFolder||e.category}/${t}`;a.onPick(l),window.__wizardAssetPicker=null;return}let r=i||e.libraryFolder||e.category;await((n=this.options)==null?void 0:n.onApply(e.objectId,t,r)),e.currentAsset=t,e.libraryFolder=r,this.renderSlots(),this.renderAssets()}catch(a){console.error("[LIBRARY] Failed to apply asset:",a)}}async handleReset(e){var t;console.log("[LIBRARY] Resetting slot:",e.slotId,"to default:",e.defaultAsset);try{await((t=this.options)==null?void 0:t.onReset(e.objectId,e.defaultAsset,e.category)),e.currentAsset=e.defaultAsset,this.renderSlots(),this.renderAssets()}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(" ")}getCategories(){if(!this.registry)return[];let e=new Set;if(Array.isArray(this.registry.categories))for(let t of this.registry.categories)t&&e.add(t);for(let t of Object.keys(this.registry.libraryAssets||{}))t&&e.add(t);for(let t of this.registry.slots||[])t!=null&&t.category&&e.add(t.category);return Array.from(e)}getSelectedSlot(){return!this.registry||!this.selectedSlotId?null:this.registry.slots.find(e=>e.slotId===this.selectedSlotId)||null}scheduleRenderSlots(){this.slotSearchDebounce&&window.clearTimeout(this.slotSearchDebounce),this.slotSearchDebounce=window.setTimeout(()=>{this.slotSearchDebounce=null,this.renderSlots()},150)}scheduleRenderAssets(){this.assetSearchDebounce&&window.clearTimeout(this.assetSearchDebounce),this.assetSearchDebounce=window.setTimeout(()=>{this.assetSearchDebounce=null,this.renderAssets()},150)}resolveSlotPreviewPaths(e){let t=(e.currentAsset||"").trim();if(!t)return{primary:null,fallback:null};let i=t.replace(/^\/+/,""),n=null,a=null;return i.startsWith("raw/")?n=i:i.startsWith("library/")?n=`raw/${i}`:i.includes("/")?n=i:e.libraryFolder?(n=`raw/library/${e.libraryFolder}/${i}`,a=`raw/${i}`):n=`raw/${i}`,{primary:n?{key:n,src:l=>`/${n}?t=${l}`}:null,fallback:a?{key:a,src:l=>`/${a}?t=${l}`}:null}}resolveLibraryAssetPath(e,t){let i=t.replace(/^\/+/,""),n="";return i.startsWith("raw/")?n=i:i.startsWith("library/")?n=`raw/${i}`:i.includes("/")?n=i:n=`raw/library/${e}/${i}`,{key:n,src:a=>`/${n}?t=${a}`}}async handleAIEdit(e){console.log("[Library] Opening AI Edit for slot:",e);let t=window.__openAiEditor;if(typeof t=="function"){let i=e.slotId||e.objectId,n="render.texture";e.category==="ui"&&(n="ui.image"),e.category==="audio"&&(n="audio.src"),t(i,`Edit ${e.displayName} with AI`,e.currentAsset,{objectId:e.objectId,path:n})}else console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded.")}async handleUpload(e){console.log("[Library] Opening file upload for slot:",e);let t=document.createElement("input");t.type="file",t.accept="image/*",t.style.display="none",t.addEventListener("change",async()=>{var n;let i=(n=t.files)==null?void 0:n[0];if(i){console.log("[Library] File selected:",i.name);try{let a=await this.fileToDataUrl(i);if(!a){alert("Failed to read file");return}let o=`${e.displayName.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,l=e.category;console.log("[Library] Saving uploaded file:",o,"to category:",l);let d=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:l,filename:`${o}.png`,data:a,overwrite:!0})})).json();if(d.success){console.log("[Library] \u2705 Upload saved:",d.path);let p=window.addAssetToRegistry;typeof p=="function"&&p(l,`${o}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(u){console.warn("[Library] Setup-library not available:",u)}await this.handleApply(e,`${o}.png`,e.category),e.currentAsset=`${o}.png`,await this.refresh(),setTimeout(()=>{this.highlightSlot(e.objectId,l)},500),console.log("[Library] \u2705 Upload complete and applied")}else console.error("[Library] \u274C Upload failed:",d.error),alert(`Upload failed: ${d.error}`)}catch(a){console.error("[Library] \u274C Upload error:",a),alert("Upload failed. Check console for details.")}finally{t.remove()}}}),document.body.appendChild(t),t.click()}fileToDataUrl(e){return new Promise(t=>{let i=new FileReader;i.onload=()=>t(i.result),i.onerror=()=>t(null),i.readAsDataURL(e)})}handleCreateWithAI(){console.log("[Library] Opening AI Create modal");let e=window.__openAiEditor;typeof e=="function"?e("new_asset","Create new asset with AI"):(console.warn("[Library] AI Editor not available"),alert("AI Editor is not available. Please ensure the Settings panel is loaded."))}highlightSlot(e,t){if(!this.registry||!this.slotsContainer)return;let i=e.startsWith("json.")?e.replace("json.",""):e,n=this.registry.slots.find(a=>(a.objectId===i||a.slotId===i)&&(!t||a.category===t));n?(console.log("[LIBRARY] Highlighting slot:",n.slotId),this.selectedSlotId=n.slotId,this.renderSlots(),this.renderAssets(),setTimeout(()=>{var r;let a=(r=this.slotsContainer)==null?void 0:r.querySelector(`[data-slot-id="${n.slotId}"]`);a&&(a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.add("highlight-pulse"),setTimeout(()=>a.classList.remove("highlight-pulse"),3e3))},100)):console.warn("[LIBRARY] No slot found for highlight:",e,t)}};var Ii=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 Mi=class{render(e,t,i,n){let a=this.formatLabel(t),r=i?this.getThumbnailUrl(i):"";return`
791
791
  <div class="inspector-property" data-property-type="image">
792
792
  <div class="inspector-property-header">
793
793
  <label class="inspector-label">${a}</label>
@@ -865,14 +865,14 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
865
865
  data-index="${p}">
866
866
  Remove
867
867
  </button>
868
- `;if(d&&typeof d=="object"&&!Array.isArray(d)){let m=r.renderProperty(e,"logic",d,u);return`
868
+ `;if(d&&typeof d=="object"&&!Array.isArray(d)){let f=r.renderProperty(e,"logic",d,u);return`
869
869
  <div class="inspector-array-item inspector-logic-item">
870
870
  <div class="inspector-array-item-header">
871
871
  <span>Logic ${p+1}</span>
872
872
  ${g}
873
873
  </div>
874
874
  <div class="inspector-array-item-body">
875
- ${m}
875
+ ${f}
876
876
  </div>
877
877
  </div>
878
878
  `}let h=typeof d=="string"?d:JSON.stringify(d);return`
@@ -935,7 +935,7 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
935
935
  ${a.join("")}
936
936
  </div>
937
937
  </div>
938
- `}renderLogic(e,t,i,n){let a=[],r=typeof(i==null?void 0:i.id)=="string"?i.id:"",o={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let u=window,g=Array.isArray(u==null?void 0:u.__HANDLER_LOGIC_OPTIONS)?u.__HANDLER_LOGIC_OPTIONS:[],m=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(f=>String(f)).filter(f=>f.trim().length>0);return Array.from(new Set(m)).sort((f,b)=>f.localeCompare(b))})(),c=r&&!l.includes(r)?[r,...l]:l;a.push(`
938
+ `}renderLogic(e,t,i,n){let a=[],r=typeof(i==null?void 0:i.id)=="string"?i.id:"",o={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},l=(()=>{let u=window,g=Array.isArray(u==null?void 0:u.__HANDLER_LOGIC_OPTIONS)?u.__HANDLER_LOGIC_OPTIONS:[],f=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...g].map(m=>String(m)).filter(m=>m.trim().length>0);return Array.from(new Set(f)).sort((m,b)=>m.localeCompare(b))})(),c=r&&!l.includes(r)?[r,...l]:l;a.push(`
939
939
  <div class="inspector-property inspector-property-text">
940
940
  <label class="inspector-property-label">Id</label>
941
941
  <div class="inspector-input-group">
@@ -948,37 +948,37 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
948
948
  </select>
949
949
  </div>
950
950
  </div>
951
- `);for(let u in i){if(u==="id")continue;let g=i[u],h=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let f=[];for(let b in g){let y=g[b],v=`${h}.${b}`,S=o[b];if(b==="targetId"||b==="inputId"){let C=this.registry.getObjectIds(),I=typeof y=="string"?y:"",O=I&&!C.includes(I)?[I,...C]:C;f.push(`
951
+ `);for(let u in i){if(u==="id")continue;let g=i[u],h=`${n}.${u}`;if(u==="props"&&g&&typeof g=="object"){let m=[];for(let b in g){let y=g[b],v=`${h}.${b}`,x=o[b];if(b==="targetId"||b==="inputId"){let L=this.registry.getObjectIds(),P=typeof y=="string"?y:"",O=P&&!L.includes(P)?[P,...L]:L;m.push(`
952
952
  <div class="inspector-property inspector-property-text">
953
953
  <label class="inspector-property-label">${this.formatLabel(b)}</label>
954
954
  <div class="inspector-input-group">
955
955
  <select class="inspector-component-select inspector-input"
956
956
  data-property-path="${v}"
957
957
  data-object-id="${e}">
958
- <option value="" ${I?"":"selected"}>None</option>
959
- ${O.map(w=>`<option value="${w}" ${w===I?"selected":""}>${w}</option>`).join("")}
958
+ <option value="" ${P?"":"selected"}>None</option>
959
+ ${O.map(w=>`<option value="${w}" ${w===P?"selected":""}>${w}</option>`).join("")}
960
960
  </select>
961
961
  </div>
962
962
  </div>
963
- `);continue}if(Array.isArray(S)&&S.length)f.push(`
963
+ `);continue}if(Array.isArray(x)&&x.length)m.push(`
964
964
  <div class="inspector-property inspector-property-text">
965
965
  <label class="inspector-property-label">${this.formatLabel(b)}</label>
966
966
  <div class="inspector-input-group">
967
967
  <select class="inspector-component-select inspector-input"
968
968
  data-property-path="${v}"
969
969
  data-object-id="${e}">
970
- ${S.map(C=>`<option value="${String(C)}" ${String(C)===String(y)?"selected":""}>${String(C)}</option>`).join("")}
970
+ ${x.map(L=>`<option value="${String(L)}" ${String(L)===String(y)?"selected":""}>${String(L)}</option>`).join("")}
971
971
  </select>
972
972
  </div>
973
973
  </div>
974
- `);else{let C=this.registry.renderProperty(e,b,y,v);C&&f.push(C)}}f.length&&a.push(`
974
+ `);else{let L=this.registry.renderProperty(e,b,y,v);L&&m.push(L)}}m.length&&a.push(`
975
975
  <div class="inspector-property inspector-property-object">
976
976
  <div class="inspector-object-header">Props</div>
977
977
  <div class="inspector-object-body">
978
- ${f.join("")}
978
+ ${m.join("")}
979
979
  </div>
980
980
  </div>
981
- `);continue}let m=this.registry.renderProperty(e,u,g,h);m&&a.push(m)}if(a.length===0)return"";let p=/(^|\.)logic\.\d+$/.test(n)?"":`
981
+ `);continue}let f=this.registry.renderProperty(e,u,g,h);f&&a.push(f)}if(a.length===0)return"";let p=/(^|\.)logic\.\d+$/.test(n)?"":`
982
982
  <div class="inspector-array-actions" style="margin-top: 12px;">
983
983
  <button class="inspector-button"
984
984
  data-logic-add="true"
@@ -1086,8 +1086,8 @@ ${o}`)}this.refreshObjects()}async syncScreens(){try{let e=this.getActiveScreenF
1086
1086
  </div>
1087
1087
  </div>
1088
1088
  </div>
1089
- `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Bi=class{constructor(){this.typeDetector=new Ii,this.imageRenderer=new Mi,this.colorRenderer=new ji,this.numberRenderer=new _i,this.textRenderer=new Oi,this.booleanRenderer=new Ri,this.arrayRenderer=new zi(this),this.objectRenderer=new $i(this),this.selectRenderer=new Di,this.jsonRenderer=new Ni,this.spawnPointsRenderer=new Hi,this.spawnTemplatesRenderer=new Fi(this)}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,a=n==null?void 0:n.schemas;if(!a)return null;let r=String(e||"").split(".").filter(Boolean);if(r.length<2)return null;let o=r[0],l=r.slice(1).join("."),c=a instanceof Map?a.get(o):a==null?void 0:a[o];if(!c)return null;let d=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof d!="string"||!d.startsWith("enum:"))return null;let u=d.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,r)=>a.localeCompare(r))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),r=a==="logic"||a==="logic_id"||a==="logicid",o=a==="id"&&n.toLowerCase().includes("logic");if((r||o)&&typeof i=="string"){let h=this.getLogicOptions(),m=this.selectRenderer.render(e,t,i,n,h);return r?`
1090
- ${m}
1089
+ `}formatLabel(e){return e.replace(/_/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\b\w/g,t=>t.toUpperCase())}};var Bi=class{constructor(){this.typeDetector=new Ii,this.imageRenderer=new Mi,this.colorRenderer=new ji,this.numberRenderer=new _i,this.textRenderer=new Oi,this.booleanRenderer=new Ri,this.arrayRenderer=new zi(this),this.objectRenderer=new $i(this),this.selectRenderer=new Di,this.jsonRenderer=new Ni,this.spawnPointsRenderer=new Hi,this.spawnTemplatesRenderer=new Fi(this)}getObjectIds(){try{let e=window,t=e==null?void 0:e.__editableConfig;if(!(t!=null&&t.objects))return[];let i=[];if(t.objects instanceof Map)for(let n of t.objects.keys())i.push(n);else typeof t.objects=="object"&&i.push(...Object.keys(t.objects));return i.sort()}catch{return[]}}getEnumOptionsFromSchemas(e){var t;try{let i=window,n=i==null?void 0:i.__editableConfig,a=n==null?void 0:n.schemas;if(!a)return null;let r=String(e||"").split(".").filter(Boolean);if(r.length<2)return null;let o=r[0],l=r.slice(1).join("."),c=a instanceof Map?a.get(o):a==null?void 0:a[o];if(!c)return null;let d=(t=c==null?void 0:c.types)==null?void 0:t[l];if(typeof d!="string"||!d.startsWith("enum:"))return null;let u=d.slice(5).split("|").map(g=>g.trim()).filter(Boolean);return u.length?u:null}catch{return null}}getLogicOptions(){try{let e=window,t=Array.isArray(e==null?void 0:e.__HANDLER_LOGIC_OPTIONS)?e.__HANDLER_LOGIC_OPTIONS:[],n=[...["DragToWin","SwerveMove","DragSnap","JoystickMove"],...t].map(a=>String(a)).filter(a=>a.trim().length>0);return Array.from(new Set(n)).sort((a,r)=>a.localeCompare(r))}catch{return[]}}renderProperty(e,t,i,n){let a=t.toLowerCase(),r=a==="logic"||a==="logic_id"||a==="logicid",o=a==="id"&&n.toLowerCase().includes("logic");if((r||o)&&typeof i=="string"){let h=this.getLogicOptions(),f=this.selectRenderer.render(e,t,i,n,h);return r?`
1090
+ ${f}
1091
1091
  <div class="inspector-array-actions">
1092
1092
  <button class="inspector-button"
1093
1093
  data-logic-add="true"
@@ -1096,7 +1096,7 @@ ${m}
1096
1096
  Add Logic
1097
1097
  </button>
1098
1098
  </div>
1099
- `:m}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let p=c[t];if(p&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let h=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,h,n,p)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),m=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?m+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':m}if(n.includes("motion.")){if(t==="enabled")return this.booleanRenderer.render(e,t,!!i,n);if(t==="direction"&&(n.includes("continuousMove")||n.includes("continuousRotate")||n.includes("orbit"))){let m=["1","-1"],f=i==null?"1":String(i);return this.selectRenderer.render(e,t,f,n,m)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let m=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,m,n)}}let u=this.getEnumOptionsFromSchemas(n);if(u)return this.selectRenderer.render(e,t,i,n,u);switch(this.typeDetector.detectType(t,i)){case"image":return this.imageRenderer.render(e,t,i,n);case"color":return this.colorRenderer.render(e,t,i,n);case"number":return this.numberRenderer.render(e,t,i,n);case"boolean":return this.booleanRenderer.render(e,t,i,n);case"array":return this.arrayRenderer.render(e,t,i,n);case"object":return this.objectRenderer.render(e,t,i,n);case"select":return this.selectRenderer.render(e,t,i,n,[]);default:return this.textRenderer.render(e,t,i,n)}}getTypeDetector(){return this.typeDetector}};function nl(s,e){let t;return function(...n){let a=()=>{clearTimeout(t),s(...n)};clearTimeout(t),t=setTimeout(a,e)}}var Gi=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 Bi,this.updateManager=new je,this.quickActions=new Ei;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`
1099
+ `:f}let l={zone:["bottom-left","bottom-center","bottom-right","top-left","top-center","top-right"],directionMode:["dominantAxis","free"],axis:["both","x","y"],ease:["power2.out","linear","sine.inOut","back.out(1.8)"],direction:["any","horizontal","vertical"],spawnPattern:["continuous","onClick","wave","burst"],positionSource:["spawner","target","custom","random","points"],spawnPointMode:["cycle","random"],movementMode:["none","velocity"],particleEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],collectSound:["","click_4.wav","click_6.wav","success_4.wav"],hitEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroyEffect:["","sparkle","gem","fire","heart","stars","smoke","magic","coin"],destroySound:["","click_4.wav","click_6.wav","success_4.wav"]},c={anchor:["center","top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"]},d=l[t];if(d&&n.includes("logic.props"))return this.selectRenderer.render(e,t,i,n,d);let p=c[t];if(p&&(n.includes("transform")||n.includes("render"))&&!(t==="anchor"&&typeof i!="string"&&i!=null)){let h=t==="anchor"&&i==null?"center":i;return this.selectRenderer.render(e,t,h,n,p)}if(t==="spawnPoints"&&n.includes("logic.props"))return this.spawnPointsRenderer.render(e,t,i,n);if(t==="spawnTemplates"&&n.includes("logic.props"))return this.spawnTemplatesRenderer.render(e,t,i,n);if((t==="targetId"||t==="inputId"||t==="hitTemplateId"||t==="hpLabelId"||t==="hitPopupTemplateId")&&(i==null||typeof i=="string")){let h=this.getObjectIds(),f=this.selectRenderer.render(e,t,i!=null?i:"",n,["",...h]);return t==="hitTemplateId"&&n.includes("logic.props")?f+'<div class="inspector-text-sm" style="opacity:0.7; margin-top:4px;">Use template id (e.g. bullet_template), not spawner.</div>':f}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 f=["1","-1"],m=i==null?"1":String(i);return this.selectRenderer.render(e,t,m,n,f)}if(["speed","amplitude","intensity","minScale","maxScale","radius","lifetime","pivotOffsetX","pivotOffsetY","duration","delay","startScale","startAlpha","startYOffset","startXOffset"].includes(t)){let f=typeof i=="number"&&!Number.isNaN(i)?i:0;return this.numberRenderer.render(e,t,f,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 nl(s,e){let t;return function(...n){let a=()=>{clearTimeout(t),s(...n)};clearTimeout(t),t=setTimeout(a,e)}}var Gi=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 Bi,this.updateManager=new je,this.quickActions=new Ei;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`
1100
1100
  <div class="scene-panel inspector-panel panel-accent-violet" data-panel="inspector">
1101
1101
  <div class="scene-panel-header" data-panel-handle>
1102
1102
  <div class="panel-title">
@@ -1185,27 +1185,27 @@ ${m}
1185
1185
  <button class="debug-btn debug-btn-sm ${this.motionSimpleMode?"primary":""}" data-motion-simple-toggle>
1186
1186
  ${this.motionSimpleMode?"Simple":"Advanced"}
1187
1187
  </button>
1188
- `,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',u=m=>{let f=m.split(".").filter(Boolean),b=r;for(let S of f)b=b==null?void 0:b[S];let y=f[f.length-1],v=`${i}.${m}`;return this.rendererRegistry.renderProperty(e,y,b,v)};if(this.motionSimpleMode){let m=u("enabled");m&&n.push(m);let f=[],b=u("intro.enabled"),y=u("intro.type"),v=u("intro.duration"),S=u("intro.easing");b&&f.push(b),y&&f.push(y),v&&f.push(v),S&&f.push(S),f.length&&n.push(`
1188
+ `,p='<button class="debug-btn debug-btn-sm success" data-motion-preview>Preview Intro</button>',u=f=>{let m=f.split(".").filter(Boolean),b=r;for(let x of m)b=b==null?void 0:b[x];let y=m[m.length-1],v=`${i}.${f}`;return this.rendererRegistry.renderProperty(e,y,b,v)};if(this.motionSimpleMode){let f=u("enabled");f&&n.push(f);let m=[],b=u("intro.enabled"),y=u("intro.type"),v=u("intro.duration"),x=u("intro.easing");b&&m.push(b),y&&m.push(y),v&&m.push(v),x&&m.push(x),m.length&&n.push(`
1189
1189
  <div class="inspector-subsection">
1190
1190
  <div class="inspector-subsection-title">Intro</div>
1191
1191
  <div class="inspector-subsection-content">
1192
1192
  ${l}
1193
1193
  ${p}
1194
- ${f.join("")}
1194
+ ${m.join("")}
1195
1195
  </div>
1196
1196
  </div>
1197
- `);let C=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),I=[u("swing.enabled"),u("swing.amplitude"),u("swing.speed"),u("swing.axis")].filter(Boolean),O=[u("continuousMove.enabled"),u("continuousMove.axis"),u("continuousMove.speed"),u("continuousMove.direction"),u("continuousMove.lifetime")].filter(Boolean),w=[u("continuousRotate.enabled"),u("continuousRotate.speed"),u("continuousRotate.direction")].filter(Boolean),T=[u("orbit.enabled"),u("orbit.radius"),u("orbit.speed"),u("orbit.direction"),u("orbit.pivotOffsetX"),u("orbit.pivotOffsetY")].filter(Boolean);if(C.length||I.length||O.length||w.length||T.length){let A=(M,L)=>L.length?`
1197
+ `);let L=[u("pulse.enabled"),u("pulse.speed"),u("pulse.intensity")].filter(Boolean),P=[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),w=[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(L.length||P.length||O.length||w.length||k.length){let C=(M,T)=>T.length?`
1198
1198
  <div class="inspector-motion-continuous-group">
1199
1199
  <div class="inspector-subsection-title">${M}</div>
1200
- <div class="inspector-subsection-content">${L.join("")}</div>
1201
- </div>`:"",k=[A("Pulse",C),A("Swing",I),A("Move forever",O),A("Rotate (pivoting itself)",w),A("Rotate around",T)].filter(Boolean).join("");n.push(`
1200
+ <div class="inspector-subsection-content">${T.join("")}</div>
1201
+ </div>`:"",A=[C("Pulse",L),C("Swing",P),C("Move forever",O),C("Rotate (pivoting itself)",w),C("Rotate around",k)].filter(Boolean).join("");n.push(`
1202
1202
  <div class="inspector-subsection inspector-subsection-continuous">
1203
1203
  <div class="inspector-subsection-title">Continuous</div>
1204
1204
  <div class="inspector-subsection-content inspector-motion-continuous-groups">
1205
- ${k}
1205
+ ${A}
1206
1206
  </div>
1207
1207
  </div>
1208
- `)}}else for(let m in r){let f=r[m],b=`${i}.${m}`,y=this.rendererRegistry.renderProperty(e,m,f,b);y&&n.push(y)}return n.length===0?"":`
1208
+ `)}}else for(let f in r){let m=r[f],b=`${i}.${f}`,y=this.rendererRegistry.renderProperty(e,f,m,b);y&&n.push(y)}return n.length===0?"":`
1209
1209
  <div class="inspector-section ${this.expandMotionOnNextRender?"":"collapsed"}" data-section="motion">
1210
1210
  <div class="inspector-section-header" data-section-toggle="motion">
1211
1211
  <span class="inspector-section-arrow">\u25BC</span>
@@ -1218,7 +1218,7 @@ ${m}
1218
1218
  ${n.join("")}
1219
1219
  </div>
1220
1220
  </div>
1221
- `}attachEventListeners(){var S,C,I,O;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=nl((w,T,j)=>{var A,k;this.updateManager.updateProperty(w,T,j),(k=(A=this.options)==null?void 0:A.onPropertyChange)==null||k.call(A,w,T,j)},300),i=w=>w?/(^|\.)logic(\.\d+)?\.id$/.test(w):!1;e.forEach(w=>{let T=A=>{var E,x;let k=A.target,M=k.dataset.propertyPath,L=k.dataset.objectId;if(M&&L){let _=k.value;if(k.type==="checkbox")_=k.checked;else if(k.type==="number"){if(_=parseFloat(k.value),isNaN(_))return}else if(k.dataset.json==="true")try{_=JSON.parse(k.value)}catch{return}k.type==="text"||k.type==="range"||k.tagName==="TEXTAREA"?t(L,M,_):(this.updateManager.updateProperty(L,M,_),(x=(E=this.options)==null?void 0:E.onPropertyChange)==null||x.call(E,L,M,_))}},j=w.dataset.propertyPath;i(j)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",j),w.addEventListener("change",async A=>{var z;let k=A.target,M=k.dataset.propertyPath,L=k.dataset.objectId,E=k.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",E),!M||!L)return;await this.updateManager.updateProperty(L,M,E),console.log("[Inspector v1.0.0] Logic ID updated");let x=window,_=(z=x==null?void 0:x.__HANDLER_LOGIC_META)==null?void 0:z[E],P=this.getDefaultPropsForLogic(E,_);console.log("[Inspector v1.0.0] New logic default props:",P);let R=M.replace(/\.id$/,".props");await this.updateManager.updateProperty(L,R,P),console.log("[Inspector v1.0.0] Logic props updated to:",P),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(L)})):(w.addEventListener("change",T),(w.tagName==="INPUT"||w.tagName==="TEXTAREA")&&w.addEventListener("input",T))}),this.contentContainer.querySelectorAll("[data-action]").forEach(w=>{w.addEventListener("click",T=>{let j=T.target,A=j.dataset.action,k=j.dataset.path,M=j.dataset.object;A&&k&&M&&this.quickActions.handleAction(A,M,k)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(w=>{w.addEventListener("click",T=>{var k,M;let j=T.target,A=j.dataset.sectionToggle||((k=j.closest("[data-section-toggle]"))==null?void 0:k.getAttribute("data-section-toggle"));if(A){let L=(M=this.contentContainer)==null?void 0:M.querySelector(`[data-section="${A}"]`);L==null||L.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(w=>{w.addEventListener("click",async T=>{let A=T.currentTarget.dataset.motionPreset;!A||!this.selectedObjectId||await this.applyMotionPreset(this.selectedObjectId,A)})}),this.contentContainer.querySelectorAll("[data-motion-preview]").forEach(w=>{w.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(w=>{w.addEventListener("click",async T=>{let j=T.target,A=j.dataset.objectId,k=j.dataset.propertyPath;if(!A||!k)return;let M=window.getEditableObjectConfig,L=M==null?void 0:M(A);if(!L)return;let E=this.updateManager.getNestedProperty(L,k),x=Array.isArray(E)?[...E]:[];x.push({x:0,y:0}),await this.updateManager.updateProperty(A,k,x),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(w=>{w.addEventListener("click",async T=>{let j=T.target,A=j.dataset.objectId,k=j.dataset.propertyPath,M=Number(j.dataset.index||"-1");if(!A||!k||M<0)return;let L=window.getEditableObjectConfig,E=L==null?void 0:L(A);if(!E)return;let x=this.updateManager.getNestedProperty(E,k);if(!Array.isArray(x))return;let _=x.filter((P,R)=>R!==M);await this.updateManager.updateProperty(A,k,_),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(w=>{w.addEventListener("click",async T=>{let j=T.target,A=j.dataset.objectId,k=j.dataset.propertyPath;if(!A||!k)return;let M=window.getEditableObjectConfig,L=M==null?void 0:M(A);if(!L)return;let E=this.updateManager.getNestedProperty(L,k),x=Array.isArray(E)?[...E]:[];x.push({templateId:"",weight:1}),await this.updateManager.updateProperty(A,k,x),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(w=>{w.addEventListener("click",async T=>{var P;let j=T.target,A=j.dataset.objectId,k=j.dataset.propertyPath,M=Number((P=j.dataset.index)!=null?P:-1);if(!A||!k||M<0)return;let L=window.getEditableObjectConfig,E=L==null?void 0:L(A);if(!E)return;let x=this.updateManager.getNestedProperty(E,k);if(!Array.isArray(x))return;let _=x.filter((R,z)=>z!==M);await this.updateManager.updateProperty(A,k,_),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(w=>{w.addEventListener("click",async T=>{var N;let j=T.target,A=j.dataset.objectId,k=j.dataset.propertyPath;if(!A||!k)return;let M=window.getEditableObjectConfig,L=M==null?void 0:M(A);if(!L)return;let E=this.updateManager.getNestedProperty(L,k),x;Array.isArray(E)?x=[...E]:E!=null?typeof E=="string"?x=[{id:E,props:{}}]:typeof E=="object"?x=[E]:x=[]:x=[];let _=this.getDefaultLogicId(),P=window,R=(N=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:N[_],z=this.getDefaultPropsForLogic(_,R);x.push({id:_,props:z}),console.log("[InspectorPanel] Adding logic to array:",{objectId:A,path:k,current:E,next:x}),await this.updateManager.updateProperty(A,k,x),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(w=>{w.addEventListener("click",async T=>{var P;let j=T.target,A=j.dataset.objectId,k=j.dataset.propertyPath,M=Number((P=j.dataset.index)!=null?P:-1);if(!A||!k||M<0)return;let L=window.getEditableObjectConfig,E=L==null?void 0:L(A);if(!E)return;let x=this.updateManager.getNestedProperty(E,k);if(!Array.isArray(x))return;let _=x.filter((R,z)=>z!==M);await this.updateManager.updateProperty(A,k,_),this.loadObject(A)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(w=>{w.addEventListener("click",async T=>{var J,H;let j=T.target,A=j.dataset.objectId,k=j.dataset.propertyPath,M=Number((J=j.dataset.index)!=null?J:-1);if(!A||!k||M<0)return;let L=window.getEditableObjectConfig,E=L==null?void 0:L(A);if(!E)return;let x=this.updateManager.getNestedProperty(E,k);if(!Array.isArray(x))return;let _=x[M];if(typeof _!="string")return;let P=window,R=(H=P==null?void 0:P.__HANDLER_LOGIC_META)==null?void 0:H[_],z=this.getDefaultPropsForLogic(_,R),N=[...x];N[M]={id:_,props:z},await this.updateManager.updateProperty(A,k,N),this.loadObject(A)})});let f=(S=this.root)==null?void 0:S.querySelector("[data-inspector-advanced]");f==null||f.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(C=this.root)==null?void 0:C.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var T;let w=(T=this.root)==null?void 0:T.querySelector("[data-convert-menu]");w==null||w.classList.toggle("hidden")});let y=(I=this.contentContainer)==null?void 0:I.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 w=v.value;w&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,w)})}getMotionDefaults(){var i,n,a,r;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(r=(a=t.motion)==null?void 0:a.defaults)!=null?r:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),r={...(l=n.motion)!=null?l:a},o={...(c=r.intro)!=null?c:{}};r.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",r.intro=o,await this.updateManager.updateProperty(e,"motion",r),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},r={...(l=a.intro)!=null?l:{}};a.enabled=!0,r.enabled=!0,a.intro=r,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,r=a==null?void 0:a.schemas,o=null;r instanceof Map?o=r.get(t):r&&typeof r=="object"&&(o=r[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,r;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((r=(a=i.render)==null?void 0:a.asset)==null?void 0:r.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
1221
+ `}attachEventListeners(){var x,L,P,O;if(!this.contentContainer)return;let e=this.contentContainer.querySelectorAll("[data-property-path]"),t=nl((w,k,j)=>{var C,A;this.updateManager.updateProperty(w,k,j),(A=(C=this.options)==null?void 0:C.onPropertyChange)==null||A.call(C,w,k,j)},300),i=w=>w?/(^|\.)logic(\.\d+)?\.id$/.test(w):!1;e.forEach(w=>{let k=C=>{var E,S;let A=C.target,M=A.dataset.propertyPath,T=A.dataset.objectId;if(M&&T){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(T,M,_):(this.updateManager.updateProperty(T,M,_),(S=(E=this.options)==null?void 0:E.onPropertyChange)==null||S.call(E,T,M,_))}},j=w.dataset.propertyPath;i(j)?(console.log("[Inspector v1.0.0] PATH-BASED DETECTION ACTIVE - logic ID found at:",j),w.addEventListener("change",async C=>{var z;let A=C.target,M=A.dataset.propertyPath,T=A.dataset.objectId,E=A.value;if(console.log("[Inspector v1.0.0] Logic ID changed to:",E),!M||!T)return;await this.updateManager.updateProperty(T,M,E),console.log("[Inspector v1.0.0] Logic ID updated");let S=window,_=(z=S==null?void 0:S.__HANDLER_LOGIC_META)==null?void 0:z[E],I=this.getDefaultPropsForLogic(E,_);console.log("[Inspector v1.0.0] New logic default props:",I);let R=M.replace(/\.id$/,".props");await this.updateManager.updateProperty(T,R,I),console.log("[Inspector v1.0.0] Logic props updated to:",I),console.log("[Inspector v1.0.0] Reloading inspector with updated config"),this.loadObject(T)})):(w.addEventListener("change",k),(w.tagName==="INPUT"||w.tagName==="TEXTAREA")&&w.addEventListener("input",k))}),this.contentContainer.querySelectorAll("[data-action]").forEach(w=>{w.addEventListener("click",k=>{let j=k.target,C=j.dataset.action,A=j.dataset.path,M=j.dataset.object;C&&A&&M&&this.quickActions.handleAction(C,M,A)})}),this.contentContainer.querySelectorAll("[data-section-toggle]").forEach(w=>{w.addEventListener("click",k=>{var A,M;let j=k.target,C=j.dataset.sectionToggle||((A=j.closest("[data-section-toggle]"))==null?void 0:A.getAttribute("data-section-toggle"));if(C){let T=(M=this.contentContainer)==null?void 0:M.querySelector(`[data-section="${C}"]`);T==null||T.classList.toggle("collapsed")}})}),this.contentContainer.querySelectorAll("[data-motion-preset]").forEach(w=>{w.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(w=>{w.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(w=>{w.addEventListener("click",async k=>{let j=k.target,C=j.dataset.objectId,A=j.dataset.propertyPath;if(!C||!A)return;let M=window.getEditableObjectConfig,T=M==null?void 0:M(C);if(!T)return;let E=this.updateManager.getNestedProperty(T,A),S=Array.isArray(E)?[...E]:[];S.push({x:0,y:0}),await this.updateManager.updateProperty(C,A,S),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawnpoints-remove]").forEach(w=>{w.addEventListener("click",async k=>{let j=k.target,C=j.dataset.objectId,A=j.dataset.propertyPath,M=Number(j.dataset.index||"-1");if(!C||!A||M<0)return;let T=window.getEditableObjectConfig,E=T==null?void 0:T(C);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let _=S.filter((I,R)=>R!==M);await this.updateManager.updateProperty(C,A,_),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-add]").forEach(w=>{w.addEventListener("click",async k=>{let j=k.target,C=j.dataset.objectId,A=j.dataset.propertyPath;if(!C||!A)return;let M=window.getEditableObjectConfig,T=M==null?void 0:M(C);if(!T)return;let E=this.updateManager.getNestedProperty(T,A),S=Array.isArray(E)?[...E]:[];S.push({templateId:"",weight:1}),await this.updateManager.updateProperty(C,A,S),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-spawntemplates-remove]").forEach(w=>{w.addEventListener("click",async k=>{var I;let j=k.target,C=j.dataset.objectId,A=j.dataset.propertyPath,M=Number((I=j.dataset.index)!=null?I:-1);if(!C||!A||M<0)return;let T=window.getEditableObjectConfig,E=T==null?void 0:T(C);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let _=S.filter((R,z)=>z!==M);await this.updateManager.updateProperty(C,A,_),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-add]").forEach(w=>{w.addEventListener("click",async k=>{var N;let j=k.target,C=j.dataset.objectId,A=j.dataset.propertyPath;if(!C||!A)return;let M=window.getEditableObjectConfig,T=M==null?void 0:M(C);if(!T)return;let E=this.updateManager.getNestedProperty(T,A),S;Array.isArray(E)?S=[...E]:E!=null?typeof E=="string"?S=[{id:E,props:{}}]:typeof E=="object"?S=[E]:S=[]:S=[];let _=this.getDefaultLogicId(),I=window,R=(N=I==null?void 0:I.__HANDLER_LOGIC_META)==null?void 0:N[_],z=this.getDefaultPropsForLogic(_,R);S.push({id:_,props:z}),console.log("[InspectorPanel] Adding logic to array:",{objectId:C,path:A,current:E,next:S}),await this.updateManager.updateProperty(C,A,S),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-remove]").forEach(w=>{w.addEventListener("click",async k=>{var I;let j=k.target,C=j.dataset.objectId,A=j.dataset.propertyPath,M=Number((I=j.dataset.index)!=null?I:-1);if(!C||!A||M<0)return;let T=window.getEditableObjectConfig,E=T==null?void 0:T(C);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let _=S.filter((R,z)=>z!==M);await this.updateManager.updateProperty(C,A,_),this.loadObject(C)})}),this.contentContainer.querySelectorAll("[data-logic-convert]").forEach(w=>{w.addEventListener("click",async k=>{var X,F;let j=k.target,C=j.dataset.objectId,A=j.dataset.propertyPath,M=Number((X=j.dataset.index)!=null?X:-1);if(!C||!A||M<0)return;let T=window.getEditableObjectConfig,E=T==null?void 0:T(C);if(!E)return;let S=this.updateManager.getNestedProperty(E,A);if(!Array.isArray(S))return;let _=S[M];if(typeof _!="string")return;let I=window,R=(F=I==null?void 0:I.__HANDLER_LOGIC_META)==null?void 0:F[_],z=this.getDefaultPropsForLogic(_,R),N=[...S];N[M]={id:_,props:z},await this.updateManager.updateProperty(C,A,N),this.loadObject(C)})});let m=(x=this.root)==null?void 0:x.querySelector("[data-inspector-advanced]");m==null||m.addEventListener("click",()=>{this.showAdvanced=!this.showAdvanced,this.selectedObjectId&&this.loadObject(this.selectedObjectId)});let b=(L=this.root)==null?void 0:L.querySelector("[data-convert-toggle]");b==null||b.addEventListener("click",()=>{var k;let w=(k=this.root)==null?void 0:k.querySelector("[data-convert-menu]");w==null||w.classList.toggle("hidden")});let y=(P=this.contentContainer)==null?void 0:P.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 w=v.value;w&&this.selectedObjectId&&await this.addComponent(this.selectedObjectId,w)})}getMotionDefaults(){var i,n,a,r;let e=window.__editableConfig,t=e==null?void 0:e.schemas;return t instanceof Map?(n=(i=t.get("motion"))==null?void 0:i.defaults)!=null?n:{enabled:!0}:t&&typeof t=="object"?(r=(a=t.motion)==null?void 0:a.defaults)!=null?r:{enabled:!0}:{enabled:!0}}async applyMotionPreset(e,t){var l,c;let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n)return;let a=this.getMotionDefaults(),r={...(l=n.motion)!=null?l:a},o={...(c=r.intro)!=null?c:{}};r.enabled=!0,o.enabled=!0,o.type=t,o.duration=typeof o.duration=="number"&&o.duration>0?o.duration:500,o.delay=typeof o.delay=="number"?o.delay:0,o.easing=typeof o.easing=="string"?o.easing:"easeOut",r.intro=o,await this.updateManager.updateProperty(e,"motion",r),this.expandMotionOnNextRender=!0,this.loadObject(e)}async previewMotionIntro(e){var o,l;let t=window.getEditableObjectConfig,i=t==null?void 0:t(e);if(!i)return;let n=this.getMotionDefaults(),a={...(o=i.motion)!=null?o:n},r={...(l=a.intro)!=null?l:{}};a.enabled=!0,r.enabled=!0,a.intro=r,await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!1}}),await this.updateManager.updateProperty(e,"motion",{...a,intro:{...r,enabled:!0}}),this.loadObject(e)}async addComponent(e,t){console.log("[InspectorPanel] Adding component:",t,"to:",e);let i=window.getEditableObjectConfig,n=i==null?void 0:i(e);if(!n){console.error("[InspectorPanel] Failed to get config for:",e);return}if(t==="logic"){let c={id:"SwerveMove",props:this.getDefaultPropsForLogic("SwerveMove",null)};n[t]=c,await this.updateManager.updateProperty(e,t,c),this.loadObject(e),console.log("[InspectorPanel] Logic component added with default SwerveMove");return}t==="motion"&&(this.expandMotionOnNextRender=!0);let a=window.__editableConfig,r=a==null?void 0:a.schemas,o=null;r instanceof Map?o=r.get(t):r&&typeof r=="object"&&(o=r[t]),o||console.warn("[InspectorPanel] Schema not found for component:",t);let l=(o==null?void 0:o.defaults)||{enabled:!0};n[t]={...l},await this.updateManager.updateProperty(e,t,n[t]),this.loadObject(e),console.log("[InspectorPanel] Component added successfully")}isSectionMeaningful(e,t,i){var a,r;if(["identity","transform","render"].includes(e))return!0;if(!t||typeof t!="object"||e==="ui"&&((r=(a=i.render)==null?void 0:a.asset)==null?void 0:r.type)==="image")return!1;if(e==="interaction")return t.clickable===!0||t.draggable===!0;if(t.enabled===!0||t.active===!0||t.visible===!0)return!0;if(e==="ui")return!!(t.text||t.font||t.fontSize);let n=Object.keys(t);return n.length===0||n.length===1&&n[0]==="enabled"&&t.enabled===!1?!1:["audio","effects","physics","motion","gameplay"].includes(e)?t.enabled===!0:!0}showError(e){this.contentContainer&&(this.contentContainer.innerHTML=`
1222
1222
  <div class="inspector-empty">
1223
1223
  <span class="inspector-empty-icon">\u26A0\uFE0F</span>
1224
1224
  <span class="inspector-empty-text">${e}</span>
@@ -1228,7 +1228,7 @@ ${m}
1228
1228
  <span class="inspector-empty-icon">\u{1F3AF}</span>
1229
1229
  <span class="inspector-empty-text">Select an object to inspect</span>
1230
1230
  </div>
1231
- `)}};function ia(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function Vs(s){var n;let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Ws(s){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=s})}async function Ui(s){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",s);let i=await fetch(s);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,s),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await ia(n),r=await Ws(a),o=Vs(a);return console.log("[ImageUtils] Success resolution:",r==null?void 0:r.width,"x",r==null?void 0:r.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:a,width:(e=r==null?void 0:r.width)!=null?e:0,height:(t=r==null?void 0:r.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function _e(s){var e,t;try{let i=await ia(s),n=await Ws(i),a=Vs(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 na(s){return ia(s).then(e=>e).catch(()=>null)}function aa(s,e){var t;try{let[i,n]=s.split(","),a=i.match(/data:(.*?);base64/),r=(t=a==null?void 0:a[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:r})}catch{return null}}async function rt(s,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((p,u)=>{let g=new Image;g.onload=()=>p(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=s}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),s;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),r=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(p=>({r:r[p.offset],g:r[p.offset+1],b:r[p.offset+2]})),c=0;for(let p=0;p<r.length;p+=4){let u=r[p],g=r[p+1],h=r[p+2],m=!1;for(let f of l)if(Math.sqrt(Math.pow(u-f.r,2)+Math.pow(g-f.g,2)+Math.pow(h-f.b,2))<e){m=!0;break}m&&(r[p+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),s}}function sa(s,e){if(!s||!e)return"1:1";let t=s/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function Ee(s){return typeof s=="object"&&s!==null&&!Array.isArray(s)}function X(s){return typeof s=="string"?s:void 0}function Ys(s){return s.toLowerCase().endsWith(".png")?s.slice(0,-4):s}function al(s){var i,n,a;let e=(i=X(s.id))!=null?i:X(s.name);if(e)return e;let t=(n=X(s.file))!=null?n:X(s.asset);return t?Ys((a=t.split("/").pop())!=null?a:t):void 0}function sl(s,e,t){var i,n,a;if(typeof e=="string")return{id:s,file:e,role:t};if(Ee(e)){let r=(i=X(e.file))!=null?i:X(e.asset);return r?{id:(n=X(e.id))!=null?n:s,file:r,role:(a=X(e.role))!=null?a:t,dataUrl:X(e.dataUrl),layout:e.layout}:null}return null}function ra(s,e){var t,i,n;if(!s)return[];if(Array.isArray(s)){let a=[];for(let r of s){if(typeof r=="string"){let o=Ys((t=r.split("/").pop())!=null?t:r);a.push({id:o,file:r,role:e});continue}if(Ee(r)){let o=al(r),l=(i=X(r.file))!=null?i:X(r.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=X(r.role))!=null?n:e,dataUrl:X(r.dataUrl),layout:r.layout})}}return a}if(Ee(s)){let a=[];for(let[r,o]of Object.entries(s)){let l=sl(r,o,e);l&&a.push(l)}return a}return[]}function rl(s){var e,t;return(t=(e=X(s.brand_name))!=null?e:X(s.brandName))!=null?t:X(s.name)}function ol(s){if(Ee(s.brand_dna)&&Ee(s.brand_dna.colors))return s.brand_dna;if(Ee(s.colors)){let e={colors:s.colors};return typeof s.style=="string"&&(e.style=s.style),Ee(s.fonts)&&(e.fonts=s.fonts),e}}function ll(s){var t;let e=new Map;for(let i of s){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Ks(s,e={}){var r,o,l;let t=s.filter(Ee),i=(o=(r=t.map(rl).find(Boolean))!=null?r:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(ol).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...ra(c.layers,"visual element")),"assets"in c&&a.push(...ra(c.assets,"visual element")),Ee(c.endgame)&&"assets"in c.endgame&&a.push(...ra(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:ll(a)}}var Xs=require("@google/genai");async function qi(s,e,t=[],i={}){var n,a,r,o,l,c,d;try{if(!(s!=null&&s.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let 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 p=new Xs.GoogleGenAI({apiKey:s}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await p.models.generateContent({model:u,contents:g}),m="",f=(r=(a=(n=h.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:r.parts;if(f)for(let b of f)b.text&&(m+=b.text);if(!m.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${m.length}`),m}catch(p){throw console.error("[Gemini] API error:",p),(o=p.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=p.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=p.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=p.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):p}}var Js=require("@google/genai");async function ot(s,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new Js.GoogleGenAI({apiKey:s}),a=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let r=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!r.candidates||!r.candidates[0]||!r.candidates[0].content||!r.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let o of r.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,c=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function Zs(s){let e=s.brandAssets.map(a=>{let r=`- ${a.id}: ${a.role}`;return a.layout&&(r+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),r}).join(`
1231
+ `)}};function ia(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function Vs(s){var n;let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}async function Ws(s){return await new Promise(e=>{let t=new Image;t.onload=()=>e({width:t.naturalWidth||t.width,height:t.naturalHeight||t.height}),t.onerror=()=>e(null),t.src=s})}async function Ui(s){var e,t;try{console.log("[ImageUtils] Fetching image data from URL:",s);let i=await fetch(s);if(!i.ok)return console.warn("[ImageUtils] Fetch failed with status:",i.status,s),null;let n=await i.blob();console.log("[ImageUtils] Blob received, size:",n.size,"type:",n.type);let a=await ia(n),r=await Ws(a),o=Vs(a);return console.log("[ImageUtils] Success resolution:",r==null?void 0:r.width,"x",r==null?void 0:r.height,"mime:",o.mimeType),{base64:o.base64,mimeType:o.mimeType,dataUrl:a,width:(e=r==null?void 0:r.width)!=null?e:0,height:(t=r==null?void 0:r.height)!=null?t:0}}catch(i){return console.error("[ImageUtils] Error fetching image data:",i),null}}async function _e(s){var e,t;try{let i=await ia(s),n=await Ws(i),a=Vs(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 na(s){return ia(s).then(e=>e).catch(()=>null)}function aa(s,e){var t;try{let[i,n]=s.split(","),a=i.match(/data:(.*?);base64/),r=(t=a==null?void 0:a[1])!=null?t:"image/png",o=atob(n),l=new Uint8Array(o.length);for(let c=0;c<o.length;c++)l[c]=o.charCodeAt(c);return new File([l],e,{type:r})}catch{return null}}async function rt(s,e=30){try{console.log("[ImageUtils] Removing background color...");let t=await new Promise((p,u)=>{let g=new Image;g.onload=()=>p(g),g.onerror=()=>u(new Error("Failed to load image")),g.src=s}),i=document.createElement("canvas");i.width=t.width,i.height=t.height;let n=i.getContext("2d");if(!n)return console.error("[ImageUtils] Failed to get canvas context"),s;n.drawImage(t,0,0);let a=n.getImageData(0,0,i.width,i.height),r=a.data,l=[{name:"top-left",offset:0},{name:"top-right",offset:(i.width-1)*4},{name:"bottom-left",offset:(i.height-1)*i.width*4},{name:"bottom-right",offset:((i.height-1)*i.width+(i.width-1))*4}].map(p=>({r:r[p.offset],g:r[p.offset+1],b:r[p.offset+2]})),c=0;for(let p=0;p<r.length;p+=4){let u=r[p],g=r[p+1],h=r[p+2],f=!1;for(let m of l)if(Math.sqrt(Math.pow(u-m.r,2)+Math.pow(g-m.g,2)+Math.pow(h-m.b,2))<e){f=!0;break}f&&(r[p+3]=0,c++)}return console.log(`[ImageUtils] Removed background from ${c} pixels (4-corner sampling, tolerance: ${e})`),n.putImageData(a,0,0),i.toDataURL("image/png")}catch(t){return console.error("[ImageUtils] Error removing background:",t),s}}function sa(s,e){if(!s||!e)return"1:1";let t=s/e;return t>1.3?"16:9":t<.77?"9:16":"1:1"}function Ee(s){return typeof s=="object"&&s!==null&&!Array.isArray(s)}function J(s){return typeof s=="string"?s:void 0}function Ys(s){return s.toLowerCase().endsWith(".png")?s.slice(0,-4):s}function al(s){var i,n,a;let e=(i=J(s.id))!=null?i:J(s.name);if(e)return e;let t=(n=J(s.file))!=null?n:J(s.asset);return t?Ys((a=t.split("/").pop())!=null?a:t):void 0}function sl(s,e,t){var i,n,a;if(typeof e=="string")return{id:s,file:e,role:t};if(Ee(e)){let r=(i=J(e.file))!=null?i:J(e.asset);return r?{id:(n=J(e.id))!=null?n:s,file:r,role:(a=J(e.role))!=null?a:t,dataUrl:J(e.dataUrl),layout:e.layout}:null}return null}function ra(s,e){var t,i,n;if(!s)return[];if(Array.isArray(s)){let a=[];for(let r of s){if(typeof r=="string"){let o=Ys((t=r.split("/").pop())!=null?t:r);a.push({id:o,file:r,role:e});continue}if(Ee(r)){let o=al(r),l=(i=J(r.file))!=null?i:J(r.asset);if(!o||!l)continue;a.push({id:o,file:l,role:(n=J(r.role))!=null?n:e,dataUrl:J(r.dataUrl),layout:r.layout})}}return a}if(Ee(s)){let a=[];for(let[r,o]of Object.entries(s)){let l=sl(r,o,e);l&&a.push(l)}return a}return[]}function rl(s){var e,t;return(t=(e=J(s.brand_name))!=null?e:J(s.brandName))!=null?t:J(s.name)}function ol(s){if(Ee(s.brand_dna)&&Ee(s.brand_dna.colors))return s.brand_dna;if(Ee(s.colors)){let e={colors:s.colors};return typeof s.style=="string"&&(e.style=s.style),Ee(s.fonts)&&(e.fonts=s.fonts),e}}function ll(s){var t;let e=new Map;for(let i of s){let n=e.get(i.id);if(!n){e.set(i.id,i);continue}e.set(i.id,{...n,...i,file:i.file||n.file,role:i.role||n.role,dataUrl:i.dataUrl||n.dataUrl,layout:(t=i.layout)!=null?t:n.layout})}return Array.from(e.values())}function Ks(s,e={}){var r,o,l;let t=s.filter(Ee),i=(o=(r=t.map(rl).find(Boolean))!=null?r:e.defaultBrandName)!=null?o:"Imported Brand",n=(l=t.map(ol).find(Boolean))!=null?l:{colors:{}},a=[];for(let c of t)"layers"in c&&a.push(...ra(c.layers,"visual element")),"assets"in c&&a.push(...ra(c.assets,"visual element")),Ee(c.endgame)&&"assets"in c.endgame&&a.push(...ra(c.endgame.assets,"endgame"));return{version:"1.0",brand_name:i,brand_dna:n,assets:ll(a)}}var Xs=require("@google/genai");async function qi(s,e,t=[],i={}){var n,a,r,o,l,c,d;try{if(!(s!=null&&s.trim()))throw new Error("Gemini API key is required");if(!(e!=null&&e.trim()))throw new Error("Prompt is required");for(let 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 p=new Xs.GoogleGenAI({apiKey:s}),u="gemini-2.5-flash",g=[e];t.length>0&&t.forEach((b,y)=>{g.push({inlineData:{data:b.base64,mimeType:b.mimeType}}),console.log(`[Gemini] Added image ${y+1}: ${b.mimeType}, size: ${Math.round(b.base64.length/1024)}KB`)}),console.log(`[Gemini] Making request with ${t.length} images and prompt length: ${e.length}`);let h=await p.models.generateContent({model:u,contents:g}),f="",m=(r=(a=(n=h.candidates)==null?void 0:n[0])==null?void 0:a.content)==null?void 0:r.parts;if(m)for(let b of m)b.text&&(f+=b.text);if(!f.trim())throw new Error("Empty response from Gemini API");return console.log(`[Gemini] Response received, length: ${f.length}`),f}catch(p){throw console.error("[Gemini] API error:",p),(o=p.message)!=null&&o.includes("Unable to process input image")?new Error("Unable to process the uploaded image. Please ensure it's a valid PNG, JPG, or JPEG file under 10MB and not corrupted."):(l=p.message)!=null&&l.includes("API_KEY_INVALID")?new Error("Invalid Gemini API key. Please check your API key configuration."):(c=p.message)!=null&&c.includes("QUOTA_EXCEEDED")?new Error("Gemini API quota exceeded. Please try again later or check your billing."):(d=p.message)!=null&&d.includes("SAFETY")?new Error("Content was flagged by Gemini safety filters. Please try with different images."):p}}var Js=require("@google/genai");async function ot(s,e,t=[],i={}){try{console.info("[GEMINI-REAL-SDK] Initializing GoogleGenAI...");let n=new Js.GoogleGenAI({apiKey:s}),a=[{text:e}];t.length>0&&t.forEach((o,l)=>{console.info(`[GEMINI-REAL-SDK] Adding image part ${l}`),a.push({inlineData:{mimeType:o.mimeType,data:o.base64}})}),console.info("[GEMINI-REAL-SDK] Calling generateContent with model: gemini-2.5-flash-image");let r=await n.models.generateContent({model:"gemini-2.5-flash-image",contents:a});if(console.info("[GEMINI-REAL-SDK] Received response from model"),!r.candidates||!r.candidates[0]||!r.candidates[0].content||!r.candidates[0].content.parts)throw new Error("Gemini 2.5 Flash Image returned invalid response structure.");for(let o of r.candidates[0].content.parts)if(o.text)console.log(o.text);else if(o.inlineData){let l=o.inlineData.data,c=o.inlineData.mimeType||"image/png";return console.info("[GEMINI-REAL-SDK] Found inline image data in response"),`data:${c};base64,${l}`}throw new Error("Gemini 2.5 Flash Image returned no image data.")}catch(n){throw console.error("[GEMINI-REAL-SDK] Error in generateImageWithGemini25Flash:",JSON.stringify(n,Object.getOwnPropertyNames(n),2)),n}}function Zs(s){let e=s.brandAssets.map(a=>{let r=`- ${a.id}: ${a.role}`;return a.layout&&(r+=` [pos: ${a.layout.x.toFixed(0)},${a.layout.y.toFixed(0)}, size: ${a.layout.w.toFixed(0)}x${a.layout.h.toFixed(0)}, z: ${a.layout.z}, opacity: ${a.layout.opacity}]`),r}).join(`
1232
1232
  `)||"None",t=s.brandDna?`Colors: ${JSON.stringify(s.brandDna.colors)}, Style: ${s.brandDna.style||"not specified"}`:"Not provided",i=s.gameObjects.map(a=>typeof a=="string"?`- id: ${a}`:`- id: ${a.id}${a.category?`, category: ${a.category}`:""}${a.type?`, type: ${a.type}`:""}`).join(`
1233
1233
  `),n="";if(s.brandConfig){let a=s.brandConfig,r=[];a.splash&&r.push(`SPLASH: title="${a.splash.title||""}", subtitle="${a.splash.subtitle||""}", button="${a.splash.button_label||""}"`),a.endgame&&r.push(`ENDGAME: title="${a.endgame.title||""}", subtitle="${a.endgame.subtitle||""}", cta="${a.endgame.cta_label||""}"`),a.tutorial&&r.push(`TUTORIAL: text="${a.tutorial.label_text||""}", helper="${a.tutorial.helper_text||""}"`),r.length>0&&(n=`
1234
1234
  BRAND CONTENT:
@@ -1313,7 +1313,7 @@ OUTPUT CONSTRAINTS (MUST FOLLOW):
1313
1313
 
1314
1314
  OUTPUT:
1315
1315
  Generate the requested asset matching the brand style.${s.needsTransparency?" Background MUST be solid magenta (#FF00FF).":""}
1316
- `.trim()}function er(s){return s.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function tr(s,e){return!(s.includes("background")&&(s.includes("_1")||s.includes("splash")||s.includes("endgame")||s.includes("main"))||e==="text"||e==="effects"&&s.includes("particle"))}async function ir(s){var r,o;let e=er(s.gameObjects),t={gamePrompt:s.gamePrompt,gameObjects:e,brandAssets:s.manifest.assets,brandDna:s.manifest.brand_dna,brandName:s.manifest.brand_name},i=Zs(t),n=[];if(s.flatDesignDataUrl)try{let l=nr(s.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await qi(s.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(r=l.message)!=null&&r.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return cl(a,s.gameObjects)}function cl(s,e){try{let t=s,i=s.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=s.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:s,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:s,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:s,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function oa(s,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let r=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,r.game_object);try{let o=await dl(s,r);r.output_dataUrl=o,r.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${r.game_object}:`,o),r.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function dl(s,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&s.manifest){let o=s.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=s.assetFiles.get(o.file);if(l){let c=await _e(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(s.flatDesignDataUrl){let o=nr(s.flatDesignDataUrl);o&&t.push(o)}let i=tr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:s.manifest.brand_dna,needsTransparency:i},a=Qs(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let r=await ot(s.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await rt(r)||r}function nr(s){let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function ar(s,e){let t=s.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],s.assets=i;for(let n of i){let a=e.get(n.file);if(a){let r=await _e(a);r&&(n.dataUrl=r.dataUrl)}}}function sr(s){var t,i;let e=new Map;if(!s)return console.warn("[CanvaZip] No position data provided"),e;if(typeof s=="string")try{s=JSON.parse(s)}catch(n){return console.error("[CanvaZip] Failed to parse position data JSON:",n),e}if(s!=null&&s.layers&&Array.isArray(s.layers)){console.log(`[CanvaZip] Parsing ${s.layers.length} layers from position data`);for(let n of s.layers){let a=n.asset;if(!a||!n.layout){console.warn("[CanvaZip] Skipping layer without asset or layout:",n);continue}let r=n.layout,o={x:typeof r.x=="number"?r.x:0,y:typeof r.y=="number"?r.y:0},l=typeof r.scaleX=="number"?r.scaleX:1,c=typeof r.scaleY=="number"?r.scaleY:1,d=(l+c)/2;d>1&&(d=d/13.33);let p=typeof r.rotation=="number"?r.rotation:0;e.set(a,{position:o,scale:d,rotation:p}),console.log(`[CanvaZip] Parsed position for ${a}:`,{position:o,scale:d,rotation:p})}console.log(`[CanvaZip] Successfully parsed ${e.size} assets from position data`)}else console.warn("[CanvaZip] Position data does not have layers array:",s);if(e.size===0&&typeof s=="object"&&!Array.isArray(s)){for(let[n,a]of Object.entries(s))if(a&&typeof a=="object"&&"layout"in a){let r=a.layout,o={x:0,y:0},l=1,c=0;if(r.position&&typeof r.position=="object"?o={x:r.position.x||0,y:r.position.y||0}:(typeof r.x=="number"||typeof r.y=="number")&&(o={x:r.x||0,y:r.y||0}),typeof r.scale=="number")l=r.scale;else if(typeof r.scaleX=="number"||typeof r.scaleY=="number"){let d=(t=r.scaleX)!=null?t:1,p=(i=r.scaleY)!=null?i:1;l=(d+p)/2}typeof r.rotation=="number"&&(c=r.rotation),e.set(n,{position:o,scale:l,rotation:c})}}return e}function rr(s,e){if(!s)return console.warn("[CanvaZip] No filename provided for matching"),null;if(e.size===0)return console.warn("[CanvaZip] Position map is empty, cannot match:",s),null;if(e.has(s))return console.log(`[CanvaZip] Exact match found for ${s}`),e.get(s);let t=s.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return console.log(`[CanvaZip] Match found (without extension) for ${s} -> ${t}`),e.get(t);let i=t.toLowerCase();for(let[n,a]of e.entries()){let r=n.toLowerCase();if(r===i||r.includes(i)||i.includes(r))return console.log(`[CanvaZip] Partial match found for ${s} -> ${n}`),a}return console.warn(`[CanvaZip] No match found for ${s}. Available keys:`,Array.from(e.keys()).slice(0,5)),null}function pl(s){return s.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function or(){let s=window.getEditableAssets;if(typeof s!="function")return console.warn("[CanvaZip] getEditableAssets not available"),[];let e=s();if(!(e!=null&&e.slots)||!Array.isArray(e.slots))return console.warn("[CanvaZip] No slots found in registry"),[];let t=[];for(let i of e.slots)i.assetType==="image"&&i.objectId&&t.push({id:i.objectId,name:i.displayName||pl(i.slotId||i.objectId),type:"sprite"});return t.sort((i,n)=>i.name.localeCompare(n.name))}var lt=require("pixi.js");it();ii();K();async function cr(s,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await lt.Assets.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)ue[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function dr(s,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,r=typeof a=="function"?a():null,o=(t=r==null?void 0:r.slots)==null?void 0:t.find(f=>f.category===e),l=o==null?void 0:o.defaultAsset;if(!l){console.warn("[LIBRARY] Could not find default asset for:",e);return}let c=Date.now(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let p=await lt.Assets.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(f=>f.startsWith(g)||f.includes(g));for(let f of h)ue[f]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+f),(i=u[f])!=null&&i.texture&&(u[f].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+f+" to default"));let m=window.gameObjectManager;if(m)for(let f of h){let b=m.get(f);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=p,console.log("[LIBRARY] \u2705 Reset display object:",f))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function Vi(s,e,t,i){var n,a,r,o,l,c,d,p,u,g,h,m,f,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=ur(v),C=Date.now(),I=`/raw/library/${i}/${t}?t=${C}`;console.log("[LIBRARY] Loading texture from:",I);let O=await lt.Assets.load(I);if(!O){console.error("[LIBRARY] Failed to load texture:",I);return}console.log("[LIBRARY] \u2705 Texture loaded"),ue[v]=O,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let w=window.CustomAssets;w!=null&&w[v]&&(w[v].texture=O,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let T=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!T),T){let A=Array.from(((n=T.keys)==null?void 0:n.call(T))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",A);let k=T.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!k),k){let M=((a=k.getDisplayObject)==null?void 0:a.call(k))||k.pixiObject||k.pixi||k,L=(r=M==null?void 0:M.constructor)==null?void 0:r.name;if(console.log("[LIBRARY] displayObject:",M),console.log("[LIBRARY] displayObject type:",L),console.log("[LIBRARY] has texture?",!!(M!=null&&M.texture)),M!=null&&M.texture)M.texture=O,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(L==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:E}=await import("pixi.js"),x=M.parent,_=(l=(o=x==null?void 0:x.getChildIndex)==null?void 0:o.call(x,M))!=null?l:0,P={x:M.x,y:M.y},R={x:(d=(c=M.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=M.anchor)==null?void 0:p.y)!=null?u:.5},z={x:(h=(g=M.scale)==null?void 0:g.x)!=null?h:1,y:(f=(m=M.scale)==null?void 0:m.y)!=null?f:1},N=(b=M.alpha)!=null?b:1,J=(y=M.visible)!=null?y:!0,H=new E(O);H.anchor.set(R.x,R.y),H.position.set(P.x,P.y),H.scale.set(z.x,z.y),H.alpha=N,H.visible=J,x&&(x.removeChild(M),x.addChildAt(H,_),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),k.pixiObject&&(k.pixiObject=H),k.pixi&&(k.pixi=H),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(M!=null&&M.children){let E=M.children.find(x=>x.texture);E?(E.texture=O,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let j=`raw/library/${i}/${t}`;gr(v,j,O,S),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:v,texture:O,assetPath:j}})),Q({objectId:v,path:"render.asset.path",value:j}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",j)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function pr(s,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,r=ur(a),o=Date.now(),l=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",l);let c=await lt.Assets.load(l);if(!c){console.error("[LIBRARY] Failed to load default texture:",l);return}ue[a]=c,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let d=window.CustomAssets;d!=null&&d[a]&&(d[a].texture=c,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let p=window.gameObjectManager;if(p){let u=p.get(a);if(u){let g=((n=u.getDisplayObject)==null?void 0:n.call(u))||u.pixiObject||u;g!=null&&g.texture&&(g.texture=c,console.log("[LIBRARY] \u2705 Reset display object:",a))}}gr(a,t,c,r),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:a,texture:c,assetPath:t}})),Q({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)}}function ur(s){var e,t,i;try{let n=window.getEditableObjectConfig,a=typeof n=="function"?n(s):null;return(i=(t=(e=a==null?void 0:a.render)==null?void 0:e.asset)==null?void 0:t.path)!=null?i:null}catch{return null}}function gr(s,e,t,i){if(e){try{let n=`${s}:${e}`;ie.set(n,t)}catch{}if(i&&i!==e)try{let n=ie.store;n!=null&&n.delete&&n.delete(`${s}:${i}`)}catch{}lr(e,t),i&&i!==e&&lr(i,null)}}function lr(s,e){if(!s)return;let t=lt.Assets.cache;if(!t)return;let i=s.replace(/^\.?\//,""),n=[i,`/${i}`];for(let a of n)typeof t.remove=="function"?t.remove(a):typeof t.delete=="function"&&t.delete(a),e&&typeof t.set=="function"&&t.set(a,e)}var Wi=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
1316
+ `.trim()}function er(s){return s.map(e=>{if(typeof e=="string"){let t=e,i,n;return t.includes("background")?(i="background",n="background"):t.includes("button")||t.includes("cta")?(i="ui",n="button"):t.includes("logo")?(i="ui",n="logo"):t.includes("title")||t.includes("subtitle")||t.includes("text")?(i="text",n="text"):t.includes("effect")||t.includes("confetti")||t.includes("particle")?(i="effects",n="effect"):t.includes("ui.")||t.includes("splash")||t.includes("endgame")?(i="ui",n="image"):(i="environment",n="interactive"),{id:t,category:i,type:n}}return e})}function tr(s,e){return!(s.includes("background")&&(s.includes("_1")||s.includes("splash")||s.includes("endgame")||s.includes("main"))||e==="text"||e==="effects"&&s.includes("particle"))}async function ir(s){var r,o;let e=er(s.gameObjects),t={gamePrompt:s.gamePrompt,gameObjects:e,brandAssets:s.manifest.assets,brandDna:s.manifest.brand_dna,brandName:s.manifest.brand_name},i=Zs(t),n=[];if(s.flatDesignDataUrl)try{let l=nr(s.flatDesignDataUrl);l&&l.base64&&l.mimeType?l.base64.length<100?console.warn("[Pipeline] Flat design data URL appears invalid (too short)"):(n.push(l),console.log("[Pipeline] Added flat design to analysis, size:",l.base64.length)):console.warn("[Pipeline] Failed to parse flat design data URL")}catch(l){console.warn("[Pipeline] Error processing flat design:",l)}console.log("[Pipeline] Running analysis chain with",n.length,"images...");let a;try{a=await qi(s.apiKey,i,n,{model:"gemini-2.5-flash"}),console.log("[Pipeline] Analysis response received")}catch(l){throw console.error("[Pipeline] Gemini API error:",l),(r=l.message)!=null&&r.includes("Unable to process input image")?new Error("Gemini API unable to process the uploaded images. Please try with different images or ensure they are valid PNG/JPG files under 10MB."):(o=l.message)!=null&&o.includes("image")?new Error("Image processing failed. Please ensure your images are valid and not corrupted."):l}return cl(a,s.gameObjects)}function cl(s,e){try{let t=s,i=s.match(/```(?:json)?\s*([\s\S]*?)```/);if(i)t=i[1].trim();else{let a=s.match(/\{[\s\S]*\}/);a&&(t=a[0])}let n=JSON.parse(t);return n.mappings&&Array.isArray(n.mappings)?{mappingResult:n,rawResponse:s,parsed:!0}:{mappingResult:{mappings:e.map(a=>({game_object:a,action:"KEEP",status:"Analysis response missing mappings[]"}))},rawResponse:s,parsed:!1,parseError:"Missing mappings[] array"}}catch(t){return{mappingResult:{mappings:e.map(i=>({game_object:i,action:"KEEP",status:"Analysis response was not valid JSON"}))},rawResponse:s,parsed:!1,parseError:t!=null&&t.message?String(t.message):"JSON parse failed"}}}async function oa(s,e,t={}){var n;let i=e.mappings.filter(a=>a.action==="GENERATE");if(i.length===0){console.log("[Pipeline] No assets to generate");return}console.log(`[Pipeline] Generating ${i.length} assets...`);for(let a=0;a<i.length;a++){let r=i[a];(n=t.onProgress)==null||n.call(t,a+1,i.length,r.game_object);try{let o=await dl(s,r);r.output_dataUrl=o,r.status="Generated \u2713"}catch(o){console.error(`[Pipeline] Failed to generate ${r.game_object}:`,o),r.status="Failed \u2717"}}console.log("[Pipeline] Generation chain complete")}async function dl(s,e){if(!e.generation_prompt)throw new Error("No generation prompt provided");let t=[];if(e.reference_asset&&s.manifest){let o=s.manifest.assets.find(l=>l.id===e.reference_asset);if(o){let l=s.assetFiles.get(o.file);if(l){let c=await _e(l);c&&t.push({base64:c.base64,mimeType:c.mimeType})}}}if(s.flatDesignDataUrl){let o=nr(s.flatDesignDataUrl);o&&t.push(o)}let i=tr(e.game_object),n={prompt:e.generation_prompt,hasReference:t.length>0,brandDna:s.manifest.brand_dna,needsTransparency:i},a=Qs(n);console.log(`[Pipeline] Generating asset for ${e.game_object}... (transparency: ${i})`);let r=await ot(s.apiKey,a,t,{aspectRatio:"1:1",model:"gemini-2.5-flash-image"});return i&&await rt(r)||r}function nr(s){let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return t&&i?{base64:t,mimeType:i[1]}:null}async function ar(s,e){let t=s.assets,i=[];Array.isArray(t)?i=t:t&&typeof t=="object"?i=Object.entries(t).map(([n,a])=>({id:n,file:String(a),role:"visual element"})):i=[],s.assets=i;for(let n of i){let a=e.get(n.file);if(a){let r=await _e(a);r&&(n.dataUrl=r.dataUrl)}}}function sr(s){var t,i;let e=new Map;if(!s)return console.warn("[CanvaZip] No position data provided"),e;if(typeof s=="string")try{s=JSON.parse(s)}catch(n){return console.error("[CanvaZip] Failed to parse position data JSON:",n),e}if(s!=null&&s.layers&&Array.isArray(s.layers)){console.log(`[CanvaZip] Parsing ${s.layers.length} layers from position data`);for(let n of s.layers){let a=n.asset;if(!a||!n.layout){console.warn("[CanvaZip] Skipping layer without asset or layout:",n);continue}let r=n.layout,o={x:typeof r.x=="number"?r.x:0,y:typeof r.y=="number"?r.y:0},l=typeof r.scaleX=="number"?r.scaleX:1,c=typeof r.scaleY=="number"?r.scaleY:1,d=(l+c)/2;d>1&&(d=d/13.33);let p=typeof r.rotation=="number"?r.rotation:0;e.set(a,{position:o,scale:d,rotation:p}),console.log(`[CanvaZip] Parsed position for ${a}:`,{position:o,scale:d,rotation:p})}console.log(`[CanvaZip] Successfully parsed ${e.size} assets from position data`)}else console.warn("[CanvaZip] Position data does not have layers array:",s);if(e.size===0&&typeof s=="object"&&!Array.isArray(s)){for(let[n,a]of Object.entries(s))if(a&&typeof a=="object"&&"layout"in a){let r=a.layout,o={x:0,y:0},l=1,c=0;if(r.position&&typeof r.position=="object"?o={x:r.position.x||0,y:r.position.y||0}:(typeof r.x=="number"||typeof r.y=="number")&&(o={x:r.x||0,y:r.y||0}),typeof r.scale=="number")l=r.scale;else if(typeof r.scaleX=="number"||typeof r.scaleY=="number"){let d=(t=r.scaleX)!=null?t:1,p=(i=r.scaleY)!=null?i:1;l=(d+p)/2}typeof r.rotation=="number"&&(c=r.rotation),e.set(n,{position:o,scale:l,rotation:c})}}return e}function rr(s,e){if(!s)return console.warn("[CanvaZip] No filename provided for matching"),null;if(e.size===0)return console.warn("[CanvaZip] Position map is empty, cannot match:",s),null;if(e.has(s))return console.log(`[CanvaZip] Exact match found for ${s}`),e.get(s);let t=s.replace(/\.png$/i,"").replace(/\.jpg$/i,"").replace(/\.jpeg$/i,"");if(e.has(t))return console.log(`[CanvaZip] Match found (without extension) for ${s} -> ${t}`),e.get(t);let i=t.toLowerCase();for(let[n,a]of e.entries()){let r=n.toLowerCase();if(r===i||r.includes(i)||i.includes(r))return console.log(`[CanvaZip] Partial match found for ${s} -> ${n}`),a}return console.warn(`[CanvaZip] No match found for ${s}. Available keys:`,Array.from(e.keys()).slice(0,5)),null}function pl(s){return s.replace(/^json\./,"").replace(/_/g," ").replace(/\b\w/g,e=>e.toUpperCase())}function or(){let s=window.getEditableAssets;if(typeof s!="function")return console.warn("[CanvaZip] getEditableAssets not available"),[];let e=s();if(!(e!=null&&e.slots)||!Array.isArray(e.slots))return console.warn("[CanvaZip] No slots found in registry"),[];let t=[];for(let i of e.slots)i.assetType==="image"&&i.objectId&&t.push({id:i.objectId,name:i.displayName||pl(i.slotId||i.objectId),type:"sprite"});return t.sort((i,n)=>i.name.localeCompare(n.name))}var lt=require("pixi.js");it();ii();K();async function cr(s,e,t){var i,n;console.log("[LIBRARY] applyAssetChange called with:",e,t);try{let a=Date.now(),o=`/${`raw/library/${e}/${t}`}?t=${a}`;console.log("[LIBRARY] Loading texture from:",o);let l=await lt.Assets.load(o);if(!l){console.error("[LIBRARY] Failed to load texture:",o);return}let c=window.CustomAssets,d=Object.keys(c||{}).filter(u=>{let g=e.replace(/s$/,"");return u.startsWith(g)||u.includes(g)});for(let u of d)ge[u]=l,console.log("[LIBRARY] \u2705 Updated AssetTextures."+u),(i=c[u])!=null&&i.texture&&(c[u].texture=l,console.log("[LIBRARY] \u2705 Updated CustomAssets."+u+".texture"));let p=window.gameObjectManager;if(p)for(let u of d){let g=p.get(u);if(g){let h=((n=g.getDisplayObject)==null?void 0:n.call(g))||g.pixiObject||g;h!=null&&h.texture&&(h.texture=l,console.log("[LIBRARY] \u2705 Applied to display object:",u))}}}catch(a){console.error("[LIBRARY] Error applying asset change:",a)}}async function dr(s,e){var t,i,n;console.log("[LIBRARY] resetAsset called for:",e);try{let a=window.getEditableAssets,r=typeof a=="function"?a():null,o=(t=r==null?void 0:r.slots)==null?void 0:t.find(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(),d=`/raw/${l}?t=${c}`;console.log("[LIBRARY] Loading default texture from:",d);let p=await lt.Assets.load(d);if(!p){console.error("[LIBRARY] Failed to load default texture:",d);return}let u=window.CustomAssets,g=e.replace(/s$/,""),h=Object.keys(u||{}).filter(m=>m.startsWith(g)||m.includes(g));for(let m of h)ge[m]=p,console.log("[LIBRARY] \u2705 Reset AssetTextures."+m),(i=u[m])!=null&&i.texture&&(u[m].texture=p,console.log("[LIBRARY] \u2705 Reset CustomAssets."+m+" to default"));let f=window.gameObjectManager;if(f)for(let m of h){let b=f.get(m);if(b){let y=((n=b.getDisplayObject)==null?void 0:n.call(b))||b.pixiObject||b;y!=null&&y.texture&&(y.texture=p,console.log("[LIBRARY] \u2705 Reset display object:",m))}}}catch(a){console.error("[LIBRARY] Error resetting asset:",a)}}async function Vi(s,e,t,i){var n,a,r,o,l,c,d,p,u,g,h,f,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 x=ur(v),L=Date.now(),P=`/raw/library/${i}/${t}?t=${L}`;console.log("[LIBRARY] Loading texture from:",P);let O=await lt.Assets.load(P);if(!O){console.error("[LIBRARY] Failed to load texture:",P);return}console.log("[LIBRARY] \u2705 Texture loaded"),ge[v]=O,console.log("[LIBRARY] \u2705 Updated AssetTextures."+v);let w=window.CustomAssets;w!=null&&w[v]&&(w[v].texture=O,console.log("[LIBRARY] \u2705 Updated legacy CustomAssets."+v));let k=window.gameObjectManager;if(console.log("[LIBRARY] gameObjectManager exists?",!!k),k){let C=Array.from(((n=k.keys)==null?void 0:n.call(k))||[]).slice(0,10);console.log("[LIBRARY] Available gameObject keys (first 10):",C);let A=k.get(v);if(console.log("[LIBRARY] gameObject for "+v+"?",!!A),A){let M=((a=A.getDisplayObject)==null?void 0:a.call(A))||A.pixiObject||A.pixi||A,T=(r=M==null?void 0:M.constructor)==null?void 0:r.name;if(console.log("[LIBRARY] displayObject:",M),console.log("[LIBRARY] displayObject type:",T),console.log("[LIBRARY] has texture?",!!(M!=null&&M.texture)),M!=null&&M.texture)M.texture=O,console.log("[LIBRARY] \u2705 Applied to display object:",v);else if(T==="Text"){console.log("[LIBRARY] \u{1F504} Converting Text to Sprite...");let{Sprite:E}=await import("pixi.js"),S=M.parent,_=(l=(o=S==null?void 0:S.getChildIndex)==null?void 0:o.call(S,M))!=null?l:0,I={x:M.x,y:M.y},R={x:(d=(c=M.anchor)==null?void 0:c.x)!=null?d:.5,y:(u=(p=M.anchor)==null?void 0:p.y)!=null?u:.5},z={x:(h=(g=M.scale)==null?void 0:g.x)!=null?h:1,y:(m=(f=M.scale)==null?void 0:f.y)!=null?m:1},N=(b=M.alpha)!=null?b:1,X=(y=M.visible)!=null?y:!0,F=new E(O);F.anchor.set(R.x,R.y),F.position.set(I.x,I.y),F.scale.set(z.x,z.y),F.alpha=N,F.visible=X,S&&(S.removeChild(M),S.addChildAt(F,_),console.log("[LIBRARY] \u2705 Replaced Text with Sprite in parent")),A.pixiObject&&(A.pixiObject=F),A.pixi&&(A.pixi=F),console.log("[LIBRARY] \u2705 Text \u2192 Sprite conversion complete")}else if(M!=null&&M.children){let E=M.children.find(S=>S.texture);E?(E.texture=O,console.log("[LIBRARY] \u2705 Applied to child sprite")):console.warn("[LIBRARY] \u26A0\uFE0F No texture found in displayObject or children")}}}let j=`raw/library/${i}/${t}`;gr(v,j,O,x),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:v,texture:O,assetPath:j}})),ee({objectId:v,path:"render.asset.path",value:j}),console.log("[LIBRARY] \u2705 Staged config override for:",v,"path:",j)}catch(v){console.error("[LIBRARY] Error applying slot asset:",v)}}async function pr(s,e,t,i){var n;console.log("[LIBRARY] resetSlotAsset:",{objectId:e,defaultAsset:t,category:i});try{let a=e.startsWith("json.")?e.replace("json.",""):e,r=ur(a),o=Date.now(),l=`/raw/${t}?t=${o}`;console.log("[LIBRARY] Loading default texture from:",l);let c=await lt.Assets.load(l);if(!c){console.error("[LIBRARY] Failed to load default texture:",l);return}ge[a]=c,console.log("[LIBRARY] \u2705 Reset AssetTextures."+a);let d=window.CustomAssets;d!=null&&d[a]&&(d[a].texture=c,console.log("[LIBRARY] \u2705 Reset CustomAssets."+a+" to default"));let p=window.gameObjectManager;if(p){let u=p.get(a);if(u){let g=((n=u.getDisplayObject)==null?void 0:n.call(u))||u.pixiObject||u;g!=null&&g.texture&&(g.texture=c,console.log("[LIBRARY] \u2705 Reset display object:",a))}}gr(a,t,c,r),window.dispatchEvent(new CustomEvent("scene-editor:asset-updated",{detail:{objectId:a,texture:c,assetPath:t}})),ee({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)}}function ur(s){var e,t,i;try{let n=window.getEditableObjectConfig,a=typeof n=="function"?n(s):null;return(i=(t=(e=a==null?void 0:a.render)==null?void 0:e.asset)==null?void 0:t.path)!=null?i:null}catch{return null}}function gr(s,e,t,i){if(e){try{let n=`${s}:${e}`;ne.set(n,t)}catch{}if(i&&i!==e)try{let n=ne.store;n!=null&&n.delete&&n.delete(`${s}:${i}`)}catch{}lr(e,t),i&&i!==e&&lr(i,null)}}function lr(s,e){if(!s)return;let t=lt.Assets.cache;if(!t)return;let i=s.replace(/^\.?\//,""),n=[i,`/${i}`];for(let a of n)typeof t.remove=="function"?t.remove(a):typeof t.delete=="function"&&t.delete(a),e&&typeof t.set=="function"&&t.set(a,e)}var Wi=class{constructor(){this.root=null;this.assets=[];this.positionMap=new Map;this.replaceableObjects=[];this.options=null;this.processedCount=0}render(){let e=this.assets.length,t=this.processedCount;return`
1317
1317
  <div class="canva-wizard-overlay" data-canva-wizard>
1318
1318
  <div class="canva-wizard-modal">
1319
1319
  <div class="canva-wizard-header">
@@ -1419,7 +1419,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1419
1419
  ${this.replaceableObjects.map(i=>`<option value="${i.id}" ${e.targetObjectId===i.id?"selected":""}>${i.name}</option>`).join("")}
1420
1420
  </select>
1421
1421
  </div>
1422
- `}initialize(e,t,i,n){this.options=n,this.positionMap=sr(i),this.replaceableObjects=or(),this.assets=t.map(a=>{let r=rr(a.filename,this.positionMap);return{filename:a.filename,dataUrl:a.dataUrl,category:this.inferCategory(a.filename),position:r==null?void 0:r.position,scale:r==null?void 0:r.scale,rotation:r==null?void 0:r.rotation,action:void 0,targetObjectId:void 0}}),e.innerHTML=this.render(),this.root=e.querySelector("[data-canva-wizard]"),this.attachEventListeners()}attachEventListeners(){var e,t,i;this.root&&((e=this.root.querySelector("[data-canva-wizard-close]"))==null||e.addEventListener("click",()=>{this.close()}),(t=this.root.querySelector("[data-canva-wizard-cancel]"))==null||t.addEventListener("click",()=>{this.close()}),(i=this.root.querySelector("[data-canva-wizard-apply-all]"))==null||i.addEventListener("click",()=>{this.applyAll()}),this.root.querySelectorAll("[data-asset-action]").forEach(n=>{n.addEventListener("click",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-action")||"0"),l=r.getAttribute("data-action");this.handleAction(o,l)})}),this.root.querySelectorAll("[data-asset-category]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-category")||"0"),l=r.value;this.assets[o]&&(this.assets[o].category=l)})}),this.root.querySelectorAll("[data-asset-target]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-target")||"0"),l=r.value;this.assets[o]&&(this.assets[o].targetObjectId=l)})}),this.root.querySelectorAll("[data-asset-screen]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-screen")||"0"),l=r.value;this.assets[o]&&(this.assets[o].screen=l)})}),this.root.querySelectorAll("[data-asset-type]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-type")||"0"),l=r.value;this.assets[o]&&(this.assets[o].objectType=l)})}),this.root.addEventListener("click",n=>{n.target===this.root&&this.close()}))}handleAction(e,t){this.assets[e]&&(this.assets[e].action=t,t==="add"&&(this.assets[e].screen||(this.assets[e].screen="gameplay"),this.assets[e].objectType||(this.assets[e].objectType="sprite")),t==="replace"?this.updateAssetCard(e):(this.assets[e].targetObjectId=void 0,this.updateAssetCard(e)))}updateAssetCard(e){var i,n,a,r;if(!this.root)return;let t=this.root.querySelector(`[data-asset-index="${e}"]`);if(t&&this.assets[e]){let o=this.assets[e],l=this.renderAssetCard(o,e);t.outerHTML=l;let c=this.root.querySelector(`[data-asset-index="${e}"]`);c&&(c.querySelectorAll("[data-asset-action]").forEach(d=>{d.addEventListener("click",p=>{let u=p.target,g=parseInt(u.getAttribute("data-asset-action")||"0"),h=u.getAttribute("data-action");this.handleAction(g,h)})}),(i=c.querySelector("[data-asset-category]"))==null||i.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].category=u)}),(n=c.querySelector("[data-asset-target]"))==null||n.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].targetObjectId=u)}),(a=c.querySelector("[data-asset-screen]"))==null||a.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].screen=u)}),(r=c.querySelector("[data-asset-type]"))==null||r.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].objectType=u)}))}}async applyAll(){if(this.options){for(let e of this.assets)e.action||(e.action="skip");this.processedCount=0,this.updateProgress();for(let e=0;e<this.assets.length;e++){let t=this.assets[e];try{let i=await this.saveAssetToLibrary(t);t.libraryPath=i,t.action==="add"?(await this.addToScene(t),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed"))):t.action==="replace"&&t.targetObjectId&&(await this.replaceObject(t,t.targetObjectId),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh"))),this.processedCount++,this.updateProgress()}catch(i){console.error(`[CanvaZip] Failed to process ${t.filename}:`,i)}}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),this.options.onComplete&&this.options.onComplete(this.assets),this.close()}}async saveAssetToLibrary(e){try{let i=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:e.category,filename:e.filename,data:e.dataUrl,overwrite:!0})})).json();if(i.success&&i.path)return console.log(`[CanvaZip] \u2705 Saved ${e.filename} to library: ${i.path}`),i.path;throw new Error(i.error||"Failed to save to library")}catch(t){throw console.error(`[CanvaZip] Failed to save ${e.filename} to library:`,t),t}}async addToScene(e){var a;if(!e.screen||!e.objectType||!e.libraryPath)throw new Error(`Missing required fields: screen=${e.screen}, objectType=${e.objectType}, libraryPath=${e.libraryPath}`);console.log(`[CanvaZip] Add to scene: ${e.filename}`,{screen:e.screen,objectType:e.objectType,position:e.position,scale:e.scale,category:e.category,libraryPath:e.libraryPath});let t=e.filename.replace(/\.(png|jpg|jpeg)$/i,"").replace(/[^a-zA-Z0-9._-]/g,"_").toLowerCase(),i=`json.${t}`,n={identity:{id:i,category:e.category||"environment"},transform:{position:e.position||{x:0,y:0},offset:{x:0,y:0},scale:e.scale||1,rotation:e.rotation||0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0,asset:{type:"image",path:e.libraryPath}},instance_id:t,object_config:i};try{let r=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:e.screen,instanceId:t,objectConfigId:i,layer:e.objectType==="ui-image"?"ui":"world",config:n,forceSync:!0})}),o=await r.json().catch(()=>({}));if(!r.ok||(o==null?void 0:o.success)===!1){let l=((a=o==null?void 0:o.errors)==null?void 0:a.join(`
1422
+ `}initialize(e,t,i,n){this.options=n,this.positionMap=sr(i),this.replaceableObjects=or(),this.assets=t.map(a=>{let r=rr(a.filename,this.positionMap);return{filename:a.filename,dataUrl:a.dataUrl,category:this.inferCategory(a.filename),position:r==null?void 0:r.position,scale:r==null?void 0:r.scale,rotation:r==null?void 0:r.rotation,action:void 0,targetObjectId:void 0}}),e.innerHTML=this.render(),this.root=e.querySelector("[data-canva-wizard]"),this.attachEventListeners()}attachEventListeners(){var e,t,i;this.root&&((e=this.root.querySelector("[data-canva-wizard-close]"))==null||e.addEventListener("click",()=>{this.close()}),(t=this.root.querySelector("[data-canva-wizard-cancel]"))==null||t.addEventListener("click",()=>{this.close()}),(i=this.root.querySelector("[data-canva-wizard-apply-all]"))==null||i.addEventListener("click",()=>{this.applyAll()}),this.root.querySelectorAll("[data-asset-action]").forEach(n=>{n.addEventListener("click",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-action")||"0"),l=r.getAttribute("data-action");this.handleAction(o,l)})}),this.root.querySelectorAll("[data-asset-category]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-category")||"0"),l=r.value;this.assets[o]&&(this.assets[o].category=l)})}),this.root.querySelectorAll("[data-asset-target]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-target")||"0"),l=r.value;this.assets[o]&&(this.assets[o].targetObjectId=l)})}),this.root.querySelectorAll("[data-asset-screen]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-screen")||"0"),l=r.value;this.assets[o]&&(this.assets[o].screen=l)})}),this.root.querySelectorAll("[data-asset-type]").forEach(n=>{n.addEventListener("change",a=>{let r=a.target,o=parseInt(r.getAttribute("data-asset-type")||"0"),l=r.value;this.assets[o]&&(this.assets[o].objectType=l)})}),this.root.addEventListener("click",n=>{n.target===this.root&&this.close()}))}handleAction(e,t){this.assets[e]&&(this.assets[e].action=t,t==="add"&&(this.assets[e].screen||(this.assets[e].screen="gameplay"),this.assets[e].objectType||(this.assets[e].objectType="sprite")),t==="replace"?this.updateAssetCard(e):(this.assets[e].targetObjectId=void 0,this.updateAssetCard(e)))}updateAssetCard(e){var i,n,a,r;if(!this.root)return;let t=this.root.querySelector(`[data-asset-index="${e}"]`);if(t&&this.assets[e]){let o=this.assets[e],l=this.renderAssetCard(o,e);t.outerHTML=l;let c=this.root.querySelector(`[data-asset-index="${e}"]`);c&&(c.querySelectorAll("[data-asset-action]").forEach(d=>{d.addEventListener("click",p=>{let u=p.target,g=parseInt(u.getAttribute("data-asset-action")||"0"),h=u.getAttribute("data-action");this.handleAction(g,h)})}),(i=c.querySelector("[data-asset-category]"))==null||i.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].category=u)}),(n=c.querySelector("[data-asset-target]"))==null||n.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].targetObjectId=u)}),(a=c.querySelector("[data-asset-screen]"))==null||a.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].screen=u)}),(r=c.querySelector("[data-asset-type]"))==null||r.addEventListener("change",d=>{let u=d.target.value;this.assets[e]&&(this.assets[e].objectType=u)}))}}async applyAll(){if(this.options){for(let e of this.assets)e.action||(e.action="skip");this.processedCount=0,this.updateProgress();for(let e=0;e<this.assets.length;e++){let t=this.assets[e];try{let i=await this.saveAssetToLibrary(t);t.libraryPath=i,t.action==="add"?(await this.addToScene(t),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed"))):t.action==="replace"&&t.targetObjectId&&(await this.replaceObject(t,t.targetObjectId),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh"))),this.processedCount++,this.updateProgress()}catch(i){console.error(`[CanvaZip] Failed to process ${t.filename}:`,i)}}await this.syncScreens(),window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed")),this.options.onComplete&&this.options.onComplete(this.assets),this.close()}}async saveAssetToLibrary(e){try{let i=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:e.category,filename:e.filename,data:e.dataUrl,overwrite:!0})})).json();if(i.success&&i.path)return console.log(`[CanvaZip] \u2705 Saved ${e.filename} to library: ${i.path}`),i.path;throw new Error(i.error||"Failed to save to library")}catch(t){throw console.error(`[CanvaZip] Failed to save ${e.filename} to library:`,t),t}}async addToScene(e){var a;if(!e.screen||!e.objectType||!e.libraryPath)throw new Error(`Missing required fields: screen=${e.screen}, objectType=${e.objectType}, libraryPath=${e.libraryPath}`);console.log(`[CanvaZip] Add to scene: ${e.filename}`,{screen:e.screen,objectType:e.objectType,position:e.position,scale:e.scale,category:e.category,libraryPath:e.libraryPath});let t=e.filename.replace(/\.(png|jpg|jpeg)$/i,"").replace(/[^a-zA-Z0-9._-]/g,"_").toLowerCase(),i=`json.${t}`,n={identity:{id:i,category:e.category||"environment"},transform:{position:e.position||{x:0,y:0},offset:{x:0,y:0},scale:.3,rotation:e.rotation||0,anchor:{x:.5,y:.5},position_ratio:null,position_mode:"static"},render:{alpha:1,visible:!0,tint:null,z_index:0,asset:{type:"image",path:e.libraryPath}},instance_id:t,object_config:i};try{let r=await fetch("/api/objects/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({screenId:e.screen,instanceId:t,objectConfigId:i,layer:e.objectType==="ui-image"?"ui":"world",config:n,forceSync:!0})}),o=await r.json().catch(()=>({}));if(!r.ok||(o==null?void 0:o.success)===!1){let l=((a=o==null?void 0:o.errors)==null?void 0:a.join(`
1423
1423
  `))||(o==null?void 0:o.error)||"Failed to create object.";throw new Error(l)}try{let{trackObjectCreation:l}=await Promise.resolve().then(()=>(K(),Ie));l(t,e.screen,n)}catch(l){console.warn("[CanvaZip] Failed to track object creation:",l)}console.log(`[CanvaZip] \u2705 Added ${e.filename} to scene ${e.screen} as ${e.objectType}`)}catch(r){throw console.error("[CanvaZip] Failed to add object to scene:",r),r}}async syncScreens(){try{let e=window.__HANDLER_ACTIVE_SCREEN,t=await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e})});if(!t.ok){let i=await t.json().catch(()=>({}));throw new Error((i==null?void 0:i.error)||"Failed to sync screens")}}catch(e){console.warn("[CanvaZip] Screen sync failed:",e)}}async replaceObject(e,t){let i=window.__debugContext;if(!i){console.warn("[CanvaZip] No debug context available for replace");return}try{await Vi(i,t,e.filename,e.category),console.log(`[CanvaZip] \u2705 Replaced ${t} with ${e.filename}`)}catch(n){throw console.error(`[CanvaZip] Failed to replace ${t}:`,n),n}}updateProgress(){if(!this.root)return;let e=this.root.querySelector(".canva-wizard-progress-fill"),t=this.root.querySelector(".canva-wizard-progress-text");if(e){let i=this.processedCount/this.assets.length*100;e.style.width=`${i}%`}t&&(t.textContent=`${this.processedCount} of ${this.assets.length} assets processed`)}inferCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"environment"}close(){var e;(e=this.options)!=null&&e.onCancel&&this.options.onCancel(),this.root&&this.root.remove()}};var Yi=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.wizardProcessedAssets=new Set;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`
1424
1424
  <div class="scene-panel brand-vision-panel panel-accent-violet" data-panel="brand-vision">
1425
1425
  <div class="scene-panel-header" data-panel-handle>
@@ -1535,7 +1535,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1535
1535
  </div>
1536
1536
  <div class="panel-resize-handle" data-panel-resize></div>
1537
1537
  </div>
1538
- `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,r,o,l,c,d,p,u,g;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()}),(r=this.root.querySelector("[data-vision-zip-input]"))==null||r.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)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var h,m;(m=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||m.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-generate-all]"))==null||u.addEventListener("click",()=>{this.generateAllMissing()}),(g=this.root.querySelector("[data-vision-apply-all]"))==null||g.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 f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;b&&(m.closest("[data-mapping-apply-one]")&&this.applyOne(b),m.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(b),m.closest("[data-mapping-edit-one]")&&this.openEditorForOne(b),m.closest("[data-mapping-generate-one]")&&this.generateOne(b),m.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let m=h.target;if(!m||!this.mappingResult)return;let f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;if(!b)return;let y=this.mappingResult.mappings.find(v=>v.game_object===b);y&&(m.matches("[data-mapping-action]")&&(y.action=String(m.value||"KEEP"),y.status="Edited",this.renderMappings()),m.matches("[data-mapping-brand-asset]")&&(y.brand_asset=String(m.value||""),y.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let m=h.target;if(!m||!this.mappingResult||!m.matches("[data-mapping-prompt]"))return;let f=m.closest("[data-mapping-item]"),b=f==null?void 0:f.dataset.mappingItem;if(!b)return;let y=this.mappingResult.mappings.find(v=>v.game_object===b);y&&(y.generation_prompt=String(m.value||""),y.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var l;let t=null;if(typeof window!="undefined"&&window.JSZip)t=window.JSZip,console.log("[BrandVision] \u2705 Found window.JSZip");else try{let c=await import("jszip");t=c.default||c,console.log("[BrandVision] \u2705 Loaded JSZip via dynamic import")}catch(c){throw new Error(`JSZip is not properly imported. Make sure jszip is loaded globally (window.JSZip) or available as a module: ${(c==null?void 0:c.message)||"Unknown error"}`)}if(!t||typeof t.loadAsync!="function")throw new Error("JSZip is not properly imported - loadAsync method not found");let i=await t.loadAsync(e),n=[],a=[];i.forEach((c,d)=>{let p=c.toLowerCase();p.endsWith(".json")?n.push({name:c,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&a.push({name:c,file:d})});for(let c of n)try{let d=await((l=i.file(c.name))==null?void 0:l.async("text"));d&&(c.content=JSON.parse(d))}catch(d){console.warn(`Failed to parse ${c.name}:`,d)}let r=[];for(let c of a)try{let d=await c.file.async("uint8array"),p=new Blob([d],{type:"image/png"}),u=c.name.split("/").pop()||c.name;console.log(`Processing ${u}, uint8array length: ${d.length}, blob size: ${p.size}`);let g;try{g=await this.blobToDataUrl(p)}catch(h){console.warn(`FileReader failed for ${u}, using fallback:`,h),g=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(d)))}`}if(!g.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${u}:`,g.substring(0,100));continue}r.push({filename:u,dataUrl:g})}catch(d){console.warn(`Failed to extract ${c.name}:`,d)}let o=null;for(let c of n){let d=c.name.toLowerCase();if(d.includes("positionnormalizedpack")||d.includes("positionnormalized")){o=c.content,console.log(`[BrandVision] Found position data file: ${c.name}`,{hasContent:!!o,isString:typeof o=="string",isObject:typeof o=="object",hasLayers:o!=null&&o.layers?o.layers.length:0});break}}if(o||console.warn("[BrandVision] No positionnormalizedpack.json found in ZIP. Available JSON files:",n.map(c=>c.name)),r.length>0){await this.showCanvaZipWizard(r,o),this.setStatus("zip",`\u2705 Wizard completed - ${r.length} assets processed`);return}else{this.setStatus("zip","\u26A0\uFE0F No PNG files found in ZIP");return}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async showCanvaZipWizard(e,t){return new Promise(i=>{let n=e.filter(o=>!this.wizardProcessedAssets.has(o.filename));if(n.length===0){console.log("[BrandVision] All assets already processed by wizard"),i();return}let a=document.createElement("div");document.body.appendChild(a),new Wi().initialize(a,n,t,{onComplete:o=>{console.log("[BrandVision] Wizard completed, processed assets:",o),o.forEach(l=>{this.wizardProcessedAssets.add(l.filename)}),a.remove(),i()},onCancel:()=>{console.log("[BrandVision] Wizard cancelled"),a.remove(),i()}})})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let r=a.category||"misc";n[r]||(n[r]=[]),i.libraryAssets[r]||(i.libraryAssets[r]=[]),i.libraryAssets[r].some(l=>l.filename===a.filename)||(i.libraryAssets[r].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${r}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var r;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let o of Array.from(i))try{let l=await o.text(),c=JSON.parse(l);this.uploadedJsons.set(o.name,c),c.layers?n+=`\u2705 Layers: ${o.name}
1538
+ `}initialize(e,t){this.root=e.querySelector('[data-panel="brand-vision"]'),this.onClose=t,this.root&&(this.attachEventListeners(),this.setupResizeHandle())}attachEventListeners(){var t,i,n,a,r,o,l,c,d,p,u,g;if(!this.root)return;(t=this.root.querySelector("[data-panel-close]"))==null||t.addEventListener("click",()=>{if(this.onClose)this.onClose();else{let h="/dashboard";window.location.pathname!==h&&(window.location.href=h)}}),this.root.querySelectorAll("[data-vision-tab]").forEach(h=>{h.addEventListener("click",()=>{let f=h.dataset.visionTab;this.switchTab(f)})}),(i=this.root.querySelector("[data-vision-upload-method]"))==null||i.addEventListener("change",h=>{let f=h.target.value;this.switchUploadMethod(f)}),(n=this.root.querySelector("[data-vision-upload-manifest]"))==null||n.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-manifest-input]"))==null||f.click()}),(a=this.root.querySelector("[data-vision-upload-zip]"))==null||a.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-zip-input]"))==null||f.click()}),(r=this.root.querySelector("[data-vision-zip-input]"))==null||r.addEventListener("change",h=>{this.handleZipUpload(h)}),(o=this.root.querySelector("[data-vision-manifest-input]"))==null||o.addEventListener("change",h=>{this.handleManifestUpload(h)}),(l=this.root.querySelector("[data-vision-upload-assets]"))==null||l.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-assets-input]"))==null||f.click()}),(c=this.root.querySelector("[data-vision-assets-input]"))==null||c.addEventListener("change",h=>{this.handleAssetsUpload(h)}),(d=this.root.querySelector("[data-vision-upload-flat]"))==null||d.addEventListener("click",()=>{var h,f;(f=(h=this.root)==null?void 0:h.querySelector("[data-vision-flat-input]"))==null||f.click()}),(p=this.root.querySelector("[data-vision-flat-input]"))==null||p.addEventListener("change",h=>{this.handleFlatDesignUpload(h)}),(u=this.root.querySelector("[data-vision-generate-all]"))==null||u.addEventListener("click",()=>{this.generateAllMissing()}),(g=this.root.querySelector("[data-vision-apply-all]"))==null||g.addEventListener("click",()=>{this.applyAll()});let e=this.root.querySelector("[data-vision-mappings]");e==null||e.addEventListener("click",h=>{let f=h.target;if(!f)return;let m=f.closest("[data-mapping-item]"),b=m==null?void 0:m.dataset.mappingItem;b&&(f.closest("[data-mapping-apply-one]")&&this.applyOne(b),f.closest("[data-mapping-save-one]")&&this.saveAndApplyOne(b),f.closest("[data-mapping-edit-one]")&&this.openEditorForOne(b),f.closest("[data-mapping-generate-one]")&&this.generateOne(b),f.closest("[data-mapping-copy-raw]")&&this.copyRawAnalysis())}),e==null||e.addEventListener("change",h=>{let f=h.target;if(!f||!this.mappingResult)return;let m=f.closest("[data-mapping-item]"),b=m==null?void 0:m.dataset.mappingItem;if(!b)return;let y=this.mappingResult.mappings.find(v=>v.game_object===b);y&&(f.matches("[data-mapping-action]")&&(y.action=String(f.value||"KEEP"),y.status="Edited",this.renderMappings()),f.matches("[data-mapping-brand-asset]")&&(y.brand_asset=String(f.value||""),y.status="Edited",this.renderMappings()))}),e==null||e.addEventListener("input",h=>{let f=h.target;if(!f||!this.mappingResult||!f.matches("[data-mapping-prompt]"))return;let m=f.closest("[data-mapping-item]"),b=m==null?void 0:m.dataset.mappingItem;if(!b)return;let y=this.mappingResult.mappings.find(v=>v.game_object===b);y&&(y.generation_prompt=String(f.value||""),y.status="Edited")})}switchTab(e){var t,i;this.root&&(this.currentTab=e,this.root.querySelectorAll("[data-vision-tab]").forEach(n=>n.classList.remove("active")),this.root.querySelectorAll("[data-vision-content]").forEach(n=>n.classList.remove("active")),(t=this.root.querySelector(`[data-vision-tab="${e}"]`))==null||t.classList.add("active"),(i=this.root.querySelector(`[data-vision-content="${e}"]`))==null||i.classList.add("active"))}switchUploadMethod(e){var t;this.root&&(this.uploadMethod=e,this.root.querySelectorAll("[data-vision-upload-section]").forEach(i=>{i.classList.remove("active")}),(t=this.root.querySelector(`[data-vision-upload-section="${e}"]`))==null||t.classList.add("active"))}async handleZipUpload(e){var n;let i=(n=e.target.files)==null?void 0:n[0];if(i){this.zipFile=i,this.setStatus("zip",`Selected: ${i.name} (${(i.size/1024/1024).toFixed(2)} MB)`);try{await this.processZipFile(i)}catch(a){console.error("[BrandVision] ZIP processing failed:",a),this.setStatus("zip",`Error: ${a instanceof Error?a.message:"Unknown error"}`)}}}async processZipFile(e){var l;let t=null;if(typeof window!="undefined"&&window.JSZip)t=window.JSZip,console.log("[BrandVision] \u2705 Found window.JSZip");else try{let c=await import("jszip");t=c.default||c,console.log("[BrandVision] \u2705 Loaded JSZip via dynamic import")}catch(c){throw new Error(`JSZip is not properly imported. Make sure jszip is loaded globally (window.JSZip) or available as a module: ${(c==null?void 0:c.message)||"Unknown error"}`)}if(!t||typeof t.loadAsync!="function")throw new Error("JSZip is not properly imported - loadAsync method not found");let i=await t.loadAsync(e),n=[],a=[];i.forEach((c,d)=>{let p=c.toLowerCase();p.endsWith(".json")?n.push({name:c,content:null}):p.startsWith("assets/")&&p.endsWith(".png")&&a.push({name:c,file:d})});for(let c of n)try{let d=await((l=i.file(c.name))==null?void 0:l.async("text"));d&&(c.content=JSON.parse(d))}catch(d){console.warn(`Failed to parse ${c.name}:`,d)}let r=[];for(let c of a)try{let d=await c.file.async("uint8array"),p=new Blob([d],{type:"image/png"}),u=c.name.split("/").pop()||c.name;console.log(`Processing ${u}, uint8array length: ${d.length}, blob size: ${p.size}`);let g;try{g=await this.blobToDataUrl(p)}catch(h){console.warn(`FileReader failed for ${u}, using fallback:`,h),g=`data:image/png;base64,${btoa(String.fromCharCode.apply(null,Array.from(d)))}`}if(!g.startsWith("data:image/png;base64,")){console.warn(`Invalid data URL format for ${u}:`,g.substring(0,100));continue}r.push({filename:u,dataUrl:g})}catch(d){console.warn(`Failed to extract ${c.name}:`,d)}let o=null;for(let c of n){let d=c.name.toLowerCase();if(d.includes("positionnormalizedpack")||d.includes("positionnormalized")){o=c.content,console.log(`[BrandVision] Found position data file: ${c.name}`,{hasContent:!!o,isString:typeof o=="string",isObject:typeof o=="object",hasLayers:o!=null&&o.layers?o.layers.length:0});break}}if(o||console.warn("[BrandVision] No positionnormalizedpack.json found in ZIP. Available JSON files:",n.map(c=>c.name)),r.length>0){await this.showCanvaZipWizard(r,o),this.setStatus("zip",`\u2705 Wizard completed - ${r.length} assets processed`);return}else{this.setStatus("zip","\u26A0\uFE0F No PNG files found in ZIP");return}}async fileToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>t(n.result),n.onerror=i,n.readAsDataURL(e)})}async showCanvaZipWizard(e,t){return new Promise(i=>{let n=e.filter(o=>!this.wizardProcessedAssets.has(o.filename));if(n.length===0){console.log("[BrandVision] All assets already processed by wizard"),i();return}let a=document.createElement("div");document.body.appendChild(a),new Wi().initialize(a,n,t,{onComplete:o=>{console.log("[BrandVision] Wizard completed, processed assets:",o),o.forEach(l=>{this.wizardProcessedAssets.add(l.filename)}),a.remove(),i()},onCancel:()=>{console.log("[BrandVision] Wizard cancelled"),a.remove(),i()}})})}async blobToDataUrl(e){return new Promise((t,i)=>{let n=new FileReader;n.onload=()=>{let a=n.result;console.log("FileReader result type:",typeof a,"length:",a.length),console.log("Data URL prefix:",a.substring(0,30)),t(a)},n.onerror=a=>{console.error("FileReader error:",a),i(a)},n.readAsDataURL(e)})}inferAssetCategory(e){let t=e.toLowerCase();return t.includes("background")||t.includes("bg")?"backgrounds":t.includes("ui")||t.includes("button")||t.includes("cta")||t.includes("logo")||t.includes("text")?"ui":t.includes("sparkle")||t.includes("effect")||t.includes("particle")?"effects":t.includes("bottle")||t.includes("product")||t.includes("item")?"products":"misc"}addAssetsToRegistry(e){let t=window.getEditableAssets;if(typeof t!="function")return;let i=t();if(!(i!=null&&i.libraryAssets))return;let n={};for(let a of e){let r=a.category||"misc";n[r]||(n[r]=[]),i.libraryAssets[r]||(i.libraryAssets[r]=[]),i.libraryAssets[r].some(l=>l.filename===a.filename)||(i.libraryAssets[r].unshift({filename:a.filename,displayName:a.id.replace(/_/g," ").replace(/\b\w/g,l=>l.toUpperCase())}),console.log(`[BrandVision] Added ${a.filename} to registry category ${r}`))}}refreshLibrary(){let e=window.refreshAssetLibrary;typeof e=="function"&&e();let t=window.reRenderAssetLibrary;typeof t=="function"&&t()}async handleManifestUpload(e){var r;let t=e.target,i=t.files;if(!i||i.length===0)return;this.uploadedJsons.clear(),this.normalizedManifest=null,this.mappingResult=null;let n="";for(let o of Array.from(i))try{let l=await o.text(),c=JSON.parse(l);this.uploadedJsons.set(o.name,c),c.layers?n+=`\u2705 Layers: ${o.name}
1539
1539
  `:c.brand_dna||c.colors?n+=`\u2705 Brand: ${o.name}
1540
1540
  `:n+=`\u2705 Loaded: ${o.name}
1541
1541
  `}catch{n+=`\u274C Error in ${o.name}
@@ -1553,7 +1553,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1553
1553
  </div>
1554
1554
  `:"";e.innerHTML=`
1555
1555
  ${r}
1556
- ${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",d=l.brand_asset||"",p=(b=t==null?void 0:t.assets)==null?void 0:b.find(y=>y.id===d),u=(p==null?void 0:p.dataUrl)||"",g=l.output_dataUrl||"",h=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",m=!!h,f=`
1556
+ ${this.mappingResult.mappings.map(l=>{var b;let c=i[l.game_object]||"",d=l.brand_asset||"",p=(b=t==null?void 0:t.assets)==null?void 0:b.find(y=>y.id===d),u=(p==null?void 0:p.dataUrl)||"",g=l.output_dataUrl||"",h=l.action==="GENERATE"?g:l.action==="APPLY"?u:"",f=!!h,m=`
1557
1557
  <select class="inspector-input" data-mapping-brand-asset style="flex:1; padding:6px 8px;">
1558
1558
  <option value="">Select brand asset\u2026</option>
1559
1559
  ${a.replace(`value="${d}"`,`value="${d}" selected`)}
@@ -1571,7 +1571,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1571
1571
 
1572
1572
  ${l.action==="APPLY"?`
1573
1573
  <div class="inspector-row" style="margin-top:8px;">
1574
- ${f}
1574
+ ${m}
1575
1575
  <button class="inspector-btn inspector-btn-sm" type="button" data-mapping-edit-one>Edit/Crop\u2026</button>
1576
1576
  </div>
1577
1577
  `:""}
@@ -1594,7 +1594,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1594
1594
  </div>
1595
1595
  <div class="vision-mapping-preview">
1596
1596
  <div class="inspector-text-sm" style="opacity:0.8;">Preview</div>
1597
- ${m?`<img src="${h}">`:'<div class="inspector-text-sm" style="opacity:0.6;">None</div>'}
1597
+ ${f?`<img src="${h}">`:'<div class="inspector-text-sm" style="opacity:0.6;">None</div>'}
1598
1598
  </div>
1599
1599
  </div>
1600
1600
 
@@ -1606,7 +1606,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1606
1606
  </div>
1607
1607
  `}).join("")}
1608
1608
  `}async applyAll(){let e=await this.stageOverridesFromMappings({saveToLibrary:!1});this.setStatus("apply",e>0?`Staged ${e} asset overrides`:"No assets to stage")}getEngineAssets(){let e=window.getEditableEngineConfig;if(typeof e!="function")return{};let t=e();return t!=null&&t.assets&&typeof t.assets=="object"?t.assets:{}}getPreviewValueForMapping(e){if(!this.mappingResult||!this.manifest)return{value:null,source:"none"};let t=this.mappingResult.mappings.find(i=>i.game_object===e);if(!t)return{value:null,source:"none"};if(t.action==="GENERATE"&&t.output_dataUrl)return{value:t.output_dataUrl,source:"generated"};if(t.action==="APPLY"&&t.brand_asset){let i=this.manifest.assets.find(n=>n.id===t.brand_asset);if(i!=null&&i.dataUrl)return{value:i.dataUrl,source:"brand"}}return{value:null,source:"none"}}async stageOverridesFromMappings(e){if(!this.mappingResult)return 0;let t=0;for(let i of this.mappingResult.mappings){if(i.action==="KEEP"||i.action==="APPLY"&&!i.brand_asset||i.action==="GENERATE"&&!i.output_dataUrl)continue;let n=i.game_object,a=this.getPreviewValueForMapping(n);if(!a.value)continue;let r=e.saveToLibrary?await this.saveToLibraryAndReturnPath(n,a.value):a.value;r&&(await this.stageEngineAssetOverride(n,r),i.status=e.saveToLibrary?"Saved + staged \u2713":"Staged \u2713",t++)}return this.renderMappings(),t}async applyOne(e){var n;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to apply for ${e}`);return}await this.stageEngineAssetOverride(e,t.value);let i=(n=this.mappingResult)==null?void 0:n.mappings.find(a=>a.game_object===e);i&&(i.status="Staged \u2713"),this.renderMappings(),this.setStatus("apply",`Staged override for ${e}`)}async saveAndApplyOne(e){var a;let t=this.getPreviewValueForMapping(e);if(!t.value){this.setStatus("apply",`No output to save for ${e}`);return}let i=await this.saveToLibraryAndReturnPath(e,t.value);if(!i){this.setStatus("apply",`Save failed for ${e}`);return}await this.stageEngineAssetOverride(e,i);let n=(a=this.mappingResult)==null?void 0:a.mappings.find(r=>r.game_object===e);n&&(n.status="Saved + staged \u2713"),this.renderMappings(),this.setStatus("apply",`Saved + staged ${e}`)}openEditorForOne(e){if(!this.mappingResult)return;let t=this.mappingResult.mappings.find(r=>r.game_object===e);if(!t)return;let i=this.getPreviewValueForMapping(e),n=window.__openAiEditor;if(typeof n!="function"){this.setStatus("apply","AI editor not available");return}let a=t.action==="GENERATE"?t.generation_prompt:void 0;n(e,a,i.value||void 0,{path:`assets.${e}`})}async generateOne(e){var n,a,r;if(!this.mappingResult||this.isGenerating)return;let t=this.mappingResult.mappings.find(o=>o.game_object===e);if(!t)return;if(t.action="GENERATE",!t.generation_prompt){t.status="Missing prompt",this.renderMappings();return}let i=(r=(a=(n=this.root)==null?void 0:n.querySelector("[data-vision-api-key]"))==null?void 0:a.value)==null?void 0:r.trim();if(!i||!this.manifest){this.setStatus("apply","Missing API key or manifest");return}this.isGenerating=!0,t.status="Generating\u2026",this.renderMappings();try{let o={apiKey:i,manifest:this.manifest,flatDesignDataUrl:this.flatDesignDataUrl,assetFiles:this.assetFiles,gameObjects:this.getGameObjects(),gamePrompt:await this.getGamePrompt()};await oa(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(),Ie));i({path:`assets.${e}`,value:t},{silent:!0});let n=window.applyEditableEngineConfig;typeof n=="function"&&n({assets:{[e]:t}})}async saveToLibraryAndReturnPath(e,t){if(!/^(data:|blob:)/.test(t))return t;let i=this.inferCategoryFromAssetKey(e),n=`${e.replace(/[^a-zA-Z0-9_-]/g,"_")}_vision_${Date.now()}.png`;try{let r=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:i,filename:n,data:t,overwrite:!0})})).json();if(!(r!=null&&r.success)||!(r!=null&&r.path))return console.error("[BrandVision] Save to library failed:",(r==null?void 0:r.error)||r),null;let o=window.addAssetToRegistry;typeof o=="function"&&o(i,n);let l=window.refreshAssetLibrary;return typeof l=="function"&&l(),String(r.path)}catch(a){return console.error("[BrandVision] Save to library error:",a),null}}inferCategoryFromAssetKey(e){let t=window.getEditableAssets;if(typeof t=="function"){let n=t();if(n!=null&&n.slots&&Array.isArray(n.slots)){let r=n.slots.find(o=>o.slotId===e||o.currentAsset===e);if(r!=null&&r.category)return String(r.category)}let a=n==null?void 0:n.categories;if(Array.isArray(a)&&a.length>0){let r=e.toLowerCase(),o=l=>a.find(c=>c.toLowerCase().includes(l));return r.includes("bg")||r.includes("background")?o("background")||a[0]:(r.includes("cta")||r.includes("button")||r.includes("ui")||r.includes("logo"))&&o("ui")||a[0]}}let i=e.toLowerCase();return i.includes("bg")||i.includes("background")?"backgrounds":i.includes("cta")||i.includes("button")||i.includes("ui")||i.includes("logo")?"ui":"misc"}async copyRawAnalysis(){if(this.analysisRawResponse)try{await navigator.clipboard.writeText(this.analysisRawResponse),this.setStatus("mapping","Copied raw analysis to clipboard")}catch{this.setStatus("mapping","Clipboard not available")}}setStatus(e,t){var a;let i={manifest:"[data-vision-manifest-status]",assets:"[data-vision-assets-status]",flat:"[data-vision-flat-status]",zip:"[data-vision-zip-status]",upload:"[data-vision-upload-status]",mapping:"[data-vision-mapping-status]",apply:"[data-vision-apply-status]"},n=(a=this.root)==null?void 0:a.querySelector(i[e]);n&&(n.textContent=t)}getGameObjects(){let e=window.getEditableObjectList;return typeof e=="function"?e():[]}async getGamePrompt(){try{let e=await fetch("./configs/engine/game.prompt.json");if(e.ok)return(await e.json()).game_prompt||""}catch{}return""}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");e&&e.addEventListener("pointerdown",t=>{let i=t.clientX,n=this.root.getBoundingClientRect().width,a=o=>{let l=Math.max(300,n+(o.clientX-i));this.root.style.width=`${l}px`},r=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",r)};window.addEventListener("pointermove",a),window.addEventListener("pointerup",r)})}refresh(){}};function hr(s,e={}){let{includeReference:t=!1,includeMagenta:i=!0,changeLevel:n=5}=e;return[`TASK: ${s}`,`CHANGE_STRENGTH: ${n}/10`,t?"REFERENCE: provided":"REFERENCE: none",i?"BACKGROUND: solid magenta #FF00FF (if possible)":""].filter(Boolean).join(`
1609
- `)}var ul=["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"],gl=["cta_hint","cta_label_end"],mr=[{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"}],hl=["brand.primary","brand.heading","brand.body","brand.warning"],Ki=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`
1609
+ `)}var ul=["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"],gl=["cta_hint","cta_label_end"],fr=[{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"}],hl=["brand.primary","brand.heading","brand.body","brand.warning"],Ki=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`
1610
1610
  <div class="scene-panel customize-panel panel-accent-blue" data-panel="customize-settings">
1611
1611
  <div class="scene-panel-header" data-panel-handle>
1612
1612
  <div class="panel-title">
@@ -1674,7 +1674,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1674
1674
  <path d="M12 3l4 4h-3v6h-2V7H8l4-4z" />
1675
1675
  <path d="M5 14v4h14v-4h2v6H3v-6h2z" />
1676
1676
  </svg>
1677
- `;let p=document.createElement("input");p.type="file",p.accept="image/*,audio/*,application/json",p.className="customize-file",p.addEventListener("change",()=>{var h;let g=(h=p.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>p.click()),l.appendChild(c),l.appendChild(d),l.appendChild(p),a.appendChild(r),a.appendChild(o),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",ul.forEach(t=>{var l,c,d;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let r=document.createElement("input");r.type="color",r.value=i,r.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=i,o.className="customize-color-text",o.dataset.colorTextKey=t,r.addEventListener("input",()=>{o.value=r.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(r.value=o.value)}),n.appendChild(a),n.appendChild(r),n.appendChild(o),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",hl.forEach(t=>{var r,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(r=e==null?void 0:e[t])!=null?r:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",gl.forEach(t=>{var r,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(r=this.readUiValue(e,t))!=null?r:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(o=this.textsContainer)==null||o.appendChild(i)}),mr.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.getObjectTextValue(i))!=null?o:"",r.className="customize-input",r.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(r),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let r=document.createElement("input");r.type=i.includes("volume")?"number":"text",r.min="0",r.max="1",r.step="0.1",r.value=String((o=e==null?void 0:e[i])!=null?o:""),r.className="customize-input",r.dataset.audioKey=i,i.includes("file")&&(r.placeholder="audio file path"),n.appendChild(a),n.appendChild(r),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let r of n){if(a==null)return null;a=a[r]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),r=n;for(let o of a){if(r==null)return null;r=r[o]}return typeof r=="string"?r:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(o=>{let l=o;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(o=>{let l=o,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(o=>{let l=o,c=l.dataset.fontKey;c&&(n[c]=l.value)});let a={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(a[c]=l.value)});let r={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let d=parseFloat(l.value);r[c]=isNaN(d)?0:d}else r[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let d=mr.find(p=>p.key===c);d&&this.applyObjectPropertyValue(d.objectId,d.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:r}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await Ui(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,r;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(a=(n=o==null?void 0:o.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(r=i==null?void 0:i.dataUrl)!=null?r:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let r=this.resolveAssetUrls(i);r[0]&&(a.src=r[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(a),n.appendChild(o),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var r,o;let i=t,n=i.dataset.assetKey,a=(o=(r=i.value)==null?void 0:r.trim())!=null?o:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var o,l,c,d,p,u,g,h,m,f;this.closeAiModal(),this.aiTargetKey=e,this.aiBaseValue=t||null,this.aiContext=i||null,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null;let n=document.createElement("div");n.className="ai-modal",n.innerHTML=`
1677
+ `;let p=document.createElement("input");p.type="file",p.accept="image/*,audio/*,application/json",p.className="customize-file",p.addEventListener("change",()=>{var h;let g=(h=p.files)==null?void 0:h[0];g&&this.handleAssetUpload(g,o,i)}),d.addEventListener("click",()=>p.click()),l.appendChild(c),l.appendChild(d),l.appendChild(p),a.appendChild(r),a.appendChild(o),a.appendChild(l),(u=this.assetsContainer)==null||u.appendChild(a)})}renderColors(e){this.colorsContainer&&(this.colorsContainer.innerHTML="",ul.forEach(t=>{var l,c,d;let i=(l=e==null?void 0:e[t])!=null?l:"#ffffff";if(t.includes("_text_color")||t.includes("_color")){let u={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[t];u&&(i=(c=this.getObjectPropertyValue(u.objectId,u.property))!=null?c:"#ffffff")}let n=document.createElement("label");n.className="customize-color-field";let a=document.createElement("span");a.textContent=t.replace(/_/g," ");let r=document.createElement("input");r.type="color",r.value=i,r.dataset.colorKey=t;let o=document.createElement("input");o.type="text",o.value=i,o.className="customize-color-text",o.dataset.colorTextKey=t,r.addEventListener("input",()=>{o.value=r.value}),o.addEventListener("input",()=>{/^#([0-9a-fA-F]{6})$/.test(o.value)&&(r.value=o.value)}),n.appendChild(a),n.appendChild(r),n.appendChild(o),(d=this.colorsContainer)==null||d.appendChild(n)}))}renderFonts(e){this.fontsContainer&&(this.fontsContainer.innerHTML="",hl.forEach(t=>{var r,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(r=e==null?void 0:e[t])!=null?r:t,a.className="customize-input",a.dataset.fontKey=t,i.appendChild(n),i.appendChild(a),(o=this.fontsContainer)==null||o.appendChild(i)}))}renderTexts(e){this.textsContainer&&(this.textsContainer.innerHTML="",gl.forEach(t=>{var r,o;let i=document.createElement("div");i.className="customize-row";let n=document.createElement("span");n.className="customize-key",n.textContent=t;let a=document.createElement("input");a.type="text",a.value=(r=this.readUiValue(e,t))!=null?r:"",a.className="customize-input",a.dataset.textKey=t,i.appendChild(n),i.appendChild(a),(o=this.textsContainer)==null||o.appendChild(i)}),fr.forEach(({key:t,objectId:i})=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=t;let r=document.createElement("input");r.type="text",r.value=(o=this.getObjectTextValue(i))!=null?o:"",r.className="customize-input",r.dataset.objectTextKey=t,n.appendChild(a),n.appendChild(r),(l=this.textsContainer)==null||l.appendChild(n)}))}renderAudio(e){if(!this.audioContainer)return;this.audioContainer.innerHTML="",["background_file","background_volume","click_file","click_volume","success_file","success_volume","complete_file","complete_volume"].forEach(i=>{var o,l;let n=document.createElement("div");n.className="customize-row";let a=document.createElement("span");a.className="customize-key",a.textContent=i.replace("_"," ");let r=document.createElement("input");r.type=i.includes("volume")?"number":"text",r.min="0",r.max="1",r.step="0.1",r.value=String((o=e==null?void 0:e[i])!=null?o:""),r.className="customize-input",r.dataset.audioKey=i,i.includes("file")&&(r.placeholder="audio file path"),n.appendChild(a),n.appendChild(r),(l=this.audioContainer)==null||l.appendChild(n)})}readUiValue(e,t){if(t.includes(".")){let n=t.split("."),a=e;for(let r of n){if(a==null)return null;a=a[r]}return typeof a=="string"?a:null}let i=e==null?void 0:e[t];return typeof i=="string"?i:null}getObjectTextValue(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t!="function")return null;let i=t(e);return(a=(n=i==null?void 0:i.ui)==null?void 0:n.text)!=null?a:null}getObjectPropertyValue(e,t){let i=window.getEditableObjectConfig;if(typeof i!="function")return null;let n=i(e);if(!n)return null;let a=t.split("."),r=n;for(let o of a){if(r==null)return null;r=r[o]}return typeof r=="string"?r:null}handleApply(){this.handleApplyWithSource("manual")}handleApplyWithSource(e){if(console.log(`[CustomizePanel] handleApplyWithSource called with source: ${e}`),!this.root||!this.options)return;let t={};this.root.querySelectorAll("[data-asset-key]").forEach(o=>{let l=o;l.dataset.assetKey&&(t[l.dataset.assetKey]=l.value)}),console.log("[CustomizePanel] Assets being applied:",Object.keys(t).length,"total"),console.log("[CustomizePanel] Asset values:",t);let i={};this.root.querySelectorAll("[data-color-text-key]").forEach(o=>{let l=o,c=l.dataset.colorTextKey;c&&(c.includes("_text_color")||c.includes("_color")?this.applyTextColorToObject(c,l.value):i[c]=l.value)});let n={};this.root.querySelectorAll("[data-font-key]").forEach(o=>{let l=o,c=l.dataset.fontKey;c&&(n[c]=l.value)});let a={};this.root.querySelectorAll("[data-text-key]").forEach(o=>{let l=o,c=l.dataset.textKey;c&&(a[c]=l.value)});let r={};this.root.querySelectorAll("[data-audio-key]").forEach(o=>{let l=o,c=l.dataset.audioKey;if(c)if(c.includes("volume")){let d=parseFloat(l.value);r[c]=isNaN(d)?0:d}else r[c]=l.value}),this.root.querySelectorAll("[data-object-text-key]").forEach(o=>{let l=o,c=l.dataset.objectTextKey;if(!c)return;let d=fr.find(p=>p.key===c);d&&this.applyObjectPropertyValue(d.objectId,d.property,l.value)}),console.log("[CustomizePanel] Calling onApply callback to restart game with source:",e),this.options.onApply({assets:t,runtime:{theme:i,ui:a,fonts:n,audio:r}},{source:e})}setupAiPanel(){}setAiStatus(e){this.aiStatusEl&&(this.aiStatusEl.textContent=e)}getSelectedAssetKey(){return this.aiTargetKey}getSelectedAssetInput(){let e=this.getSelectedAssetKey();return!this.root||!e?null:this.root.querySelector(`input[data-asset-key="${e}"]`)}async getImageDataFromAsset(e){let t=this.resolveAssetUrls(e);console.log("[CustomizePanel] Resolving asset urls for AI:",e,t);for(let i of t)try{let n=await Ui(i);if(n)return console.log("[CustomizePanel] Successfully fetched image data for AI"),{input:{base64:n.base64,mimeType:n.mimeType},dataUrl:n.dataUrl,width:n.width,height:n.height}}catch(n){console.warn("[CustomizePanel] Failed to fetch image data from:",i,n)}return console.error("[CustomizePanel] Could not load image data for AI from any URL"),null}async updateAiBasePreview(e){var n,a,r;let t=(e==null?void 0:e.trim())||"";if(!t){let o=this.getSelectedAssetInput();t=(a=(n=o==null?void 0:o.value)==null?void 0:n.trim())!=null?a:""}if(console.log("[CustomizePanel] updateAiBasePreview using value:",t),!t){this.aiBaseDataUrl=null,this.updateAiPreview();return}let i=await this.getImageDataFromAsset(t);this.aiBaseDataUrl=(r=i==null?void 0:i.dataUrl)!=null?r:null,this.updateAiPreview()}updateAiPreview(){if(!this.aiPreviewImg)return;let e=this.aiOutputDataUrl||this.aiBaseDataUrl||"";if(!e){this.aiPreviewImg.removeAttribute("src");return}this.aiPreviewImg.src=e}updateAiModalPreview(e,t){if(!e)return;let i=t!=null?t:this.activePreviewKey;if(!i||!this.aiOutputDataUrl||this.aiOutputKey!==i){e.classList.add("hidden");return}let n=e.querySelector(".asset-preview-ai-image");n&&(n.src=this.aiOutputDataUrl),e.classList.remove("hidden")}setAiLoading(e){this.aiLoadingEl&&this.aiLoadingEl.classList.toggle("active",e),this.aiGenerateBtn&&(this.aiGenerateBtn.disabled=e)}toggleAiGallery(){if(!this.aiGalleryEl||!this.aiGalleryToggle)return;let e=this.aiGalleryEl.classList.toggle("hidden");this.aiGalleryToggle.textContent=e?"Gallery":"Hide Gallery",e||this.renderAiGallery()}renderAiGallery(){if(!this.aiGalleryGrid)return;let e=this.getAiGalleryEntries();if(!e.length){this.aiGalleryGrid.innerHTML='<div class="ai-gallery-empty">No image assets found.</div>';return}this.aiGalleryGrid.innerHTML="",e.forEach(({key:t,value:i})=>{var l;let n=document.createElement("button");n.type="button",n.className="ai-gallery-item",t===this.aiTargetKey&&n.classList.add("active");let a=document.createElement("img");a.className="ai-gallery-thumb",a.alt=t;let r=this.resolveAssetUrls(i);r[0]&&(a.src=r[0]);let o=document.createElement("span");o.className="ai-gallery-label",o.textContent=t,n.appendChild(a),n.appendChild(o),n.addEventListener("click",()=>this.selectAiGalleryAsset(t)),(l=this.aiGalleryGrid)==null||l.appendChild(n)})}getAiGalleryEntries(){if(!this.root)return[];let e=[];return this.root.querySelectorAll("[data-asset-key]").forEach(t=>{var r,o;let i=t,n=i.dataset.assetKey,a=(o=(r=i.value)==null?void 0:r.trim())!=null?o:"";!n||!a||this.isAiGalleryImage(a)&&e.push({key:n,value:a})}),e}isAiGalleryImage(e){let t=e.trim();if(!t)return!1;if(/^(data:image|blob:)/.test(t))return!0;let i=t.split("?")[0].toLowerCase();return![".mp3",".wav",".ogg",".json"].some(n=>i.endsWith(n))}selectAiGalleryAsset(e){this.aiTargetKey!==e&&(this.aiTargetKey=e,this.aiOutputDataUrl=null,this.aiOutputKey=null,this.aiReferenceFile=null,this.aiBaseDataUrl=null,this.aiReferenceInput&&(this.aiReferenceInput.value=""),this.aiReferenceName&&(this.aiReferenceName.textContent="Optional"),this.aiModalSubtitle&&(this.aiModalSubtitle.textContent=e),this.setAiOutputButtonsEnabled(!1),this.updateAiBasePreview(),this.updateAiPreview(),this.renderAiGallery())}openAiModal(e,t,i){var o,l,c,d,p,u,g,h,f,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=`
1678
1678
  <div class="ai-modal-card">
1679
1679
  <div class="ai-modal-header">
1680
1680
  <div>
@@ -1745,7 +1745,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1745
1745
  </div>
1746
1746
  </div>
1747
1747
  </div>
1748
- `;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 r=n.querySelector("[data-ai-ref-button]");r==null||r.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)}),(d=this.aiBgToleranceInput)==null||d.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()}),(p=this.aiReferenceInput)==null||p.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()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(m=this.aiCropBtn)==null||m.addEventListener("click",()=>{this.handleAiCrop()}),(f=this.aiDownloadBtn)==null||f.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,h,m,f,b,y,v,S,C,I,O,w,T,j,A,k,M;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(b=(f=(m=this.aiPromptInput)==null?void 0:m.value)==null?void 0:f.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,a=n,r=n,o=Number((C=(S=this.aiStrengthInput)==null?void 0:S.value)!=null?C:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((I=l==null?void 0:l.value)==null?void 0:I.trim())||((O=this.aiBaseValue)==null?void 0:O.trim())||"";this.setAiLoading(!0),this.setAiStatus(c?"Generating...":"Generating from scratch...");try{let L=null,E=null,x=(w=this.getSelectedAssetKey())!=null?w:"unknown",_=(T=this.aiUseOutputToggle)!=null&&T.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl){let q=aa(this.aiOutputDataUrl,"ai-output.png");if(q){let fe=await _e(q);fe&&(L={input:{base64:fe.base64,mimeType:fe.mimeType},dataUrl:fe.dataUrl,width:fe.width,height:fe.height})}}!L&&c&&(L=await this.getImageDataFromAsset(c));let P=[];L&&P.push(L.input);let R=!1;if(this.aiReferenceFile){let q=await _e(this.aiReferenceFile);q?(E={input:{base64:q.base64,mimeType:q.mimeType},dataUrl:q.dataUrl,width:q.width,height:q.height},P.push(E.input),R=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let z=hr(i,{includeReference:R,includeMagenta:a,changeLevel:o}),N=(k=(A=this.aiReferenceFile)==null?void 0:A.name)!=null?k:"none";console.info("[AI] Final prompt:",z),console.info("[AI] Image sources:",{assetKey:x,base:_,reference:N});let J=L?sa(L.width,L.height):E?sa(E.width,E.height):"1:1";console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let H=await ot(e,z,P,{aspectRatio:J,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",H==null?void 0:H.length),this.aiRawOutputDataUrl=H,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,r,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(r=this.aiBgToleranceInput)==null?void 0:r.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await rt(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),r=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&r)console.log("[CustomizePanel] Applying AI output directly to object:",a,r),this.applyObjectPropertyValue(a,r,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,r,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),h=((r=this.aiContext)==null?void 0:r.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),m=this.getSelectedAssetInput();if(m&&(m.value=c.path,this.handleAssetValueChange((o=m.dataset.assetKey)!=null?o:"",m)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(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,h,c.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&g&&(console.log("[CustomizePanel] Highlighting slot in library:",g,n),setTimeout(()=>{f(g,n)},500)),this.setAiStatus(`\u2705 Saved and applied ${i}.png`),setTimeout(()=>{this.closeAiModal()},1500)}else console.error("[CustomizePanel] \u274C Save failed:",c.error),this.setAiStatus(`Save failed: ${c.error}`)}catch(l){console.error("[CustomizePanel] \u274C Save error:",l),this.setAiStatus("Save failed. Check console.")}}inferCategoryFromAssetKey(e){var r;let t=(r=this.aiContext)==null?void 0:r.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=aa(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let r=await na(a);r&&this.setAiOutput(r)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let d=await this.getImageDimensions(n);if(d){let p=await this.showManualCropModal(e,d,n);if(!p)return;a=p}}let r=await na(a);if(!r){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",p.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=p.path,this.handleAssetValueChange(i,t);let h=this.inferObjectIdFromAssetKey(i),m=this.inferPathFromAssetKey(i);if(h&&m){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(m)||/\\.(png|jpg|jpeg)$/i.test(String(p.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(p.path);await b(h,v,c)}else this.applyObjectPropertyValue(h,m,p.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let f=window.__highlightLibrarySlot;typeof f=="function"&&h&&setTimeout(()=>{f(h,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",p.error),alert(`Failed to save uploaded file: ${p.error}`)}catch(d){console.error("[CustomizePanel] \u274C Upload error:",d),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let r=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,r)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1748
+ `;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 r=n.querySelector("[data-ai-ref-button]");r==null||r.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)}),(d=this.aiBgToleranceInput)==null||d.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()}),(p=this.aiReferenceInput)==null||p.addEventListener("change",()=>{var y,v,x;let b=(x=(v=(y=this.aiReferenceInput)==null?void 0:y.files)==null?void 0:v[0])!=null?x:null;this.aiReferenceFile=b,this.aiReferenceName&&(this.aiReferenceName.textContent=b?`${b.name} (loaded)`:"Optional"),b&&this.setAiStatus(`Reference attached: ${b.name}`)}),(u=this.aiGenerateBtn)==null||u.addEventListener("click",()=>{this.handleAiGenerate()}),(g=this.aiApplyBtn)==null||g.addEventListener("click",()=>this.handleAiApply()),(h=this.aiSaveLibraryBtn)==null||h.addEventListener("click",()=>{this.handleAiSaveToLibrary()}),(f=this.aiCropBtn)==null||f.addEventListener("click",()=>{this.handleAiCrop()}),(m=this.aiDownloadBtn)==null||m.addEventListener("click",()=>this.handleAiDownload()),document.body.appendChild(n),this.setAiOutputButtonsEnabled(!1),this.setAiStatus("Ready."),this.updateAiBasePreview(t),this.updateAiPreview(),this.renderAiGallery()}closeAiModal(){this.aiModal&&(this.aiModal.remove(),this.aiModal=null),this.aiTargetKey=null,this.aiBaseValue=null,this.aiContext=null,this.aiKeyInput=null,this.aiModelSelect=null,this.aiPromptInput=null,this.aiStrengthInput=null,this.aiStrengthValue=null,this.aiModalSubtitle=null,this.aiGalleryToggle=null,this.aiGalleryEl=null,this.aiGalleryGrid=null,this.aiReferenceInput=null,this.aiReferenceName=null,this.aiReferenceFile=null,this.aiRemoveBgToggle=null,this.aiUseOutputToggle=null,this.aiGenerateBtn=null,this.aiApplyBtn=null,this.aiCropBtn=null,this.aiDownloadBtn=null,this.aiPreviewImg=null,this.aiStatusEl=null,this.aiLoadingEl=null,this.aiBgToleranceInput=null,this.aiBgToleranceValue=null}async handleAiGenerate(){var d,p,u,g,h,f,m,b,y,v,x,L,P,O,w,k,j,C,A,M;if(console.log("[CustomizePanel] handleAiGenerate clicked"),!this.aiGenerateBtn)return;let e=(u=(p=(d=this.aiKeyInput)==null?void 0:d.value)==null?void 0:p.trim())!=null?u:"",t=(h=(g=this.aiModelSelect)==null?void 0:g.value)!=null?h:"gemini-2.5-flash-image",i=(b=(m=(f=this.aiPromptInput)==null?void 0:f.value)==null?void 0:m.trim())!=null?b:"",n=(v=(y=this.aiRemoveBgToggle)==null?void 0:y.checked)!=null?v:!1,a=n,r=n,o=Number((L=(x=this.aiStrengthInput)==null?void 0:x.value)!=null?L:"5");if(!e){this.setAiStatus("Missing API key.");return}if(!i){this.setAiStatus("Add a prompt.");return}let l=this.getSelectedAssetInput(),c=((P=l==null?void 0:l.value)==null?void 0:P.trim())||((O=this.aiBaseValue)==null?void 0:O.trim())||"";this.setAiLoading(!0),this.setAiStatus(c?"Generating...":"Generating from scratch...");try{let T=null,E=null,S=(w=this.getSelectedAssetKey())!=null?w:"unknown",_=(k=this.aiUseOutputToggle)!=null&&k.checked&&this.aiOutputDataUrl?"ai-output":"asset-value";if((j=this.aiUseOutputToggle)!=null&&j.checked&&this.aiOutputDataUrl){let q=aa(this.aiOutputDataUrl,"ai-output.png");if(q){let Q=await _e(q);Q&&(T={input:{base64:Q.base64,mimeType:Q.mimeType},dataUrl:Q.dataUrl,width:Q.width,height:Q.height})}}!T&&c&&(T=await this.getImageDataFromAsset(c));let I=[];T&&I.push(T.input);let R=!1;if(this.aiReferenceFile){let q=await _e(this.aiReferenceFile);q?(E={input:{base64:q.base64,mimeType:q.mimeType},dataUrl:q.dataUrl,width:q.width,height:q.height},I.push(E.input),R=!0,this.setAiStatus(`Generating with reference: ${this.aiReferenceFile.name}`)):this.setAiStatus("Reference image failed to load, generating without reference.")}let z=hr(i,{includeReference:R,includeMagenta:a,changeLevel:o}),N=(A=(C=this.aiReferenceFile)==null?void 0:C.name)!=null?A:"none";console.info("[AI] Final prompt:",z),console.info("[AI] Image sources:",{assetKey:S,base:_,reference:N});let X=T?sa(T.width,T.height):E?sa(E.width,E.height):"1:1";console.info("[AI] CRITICAL: Calling generateImageWithGemini25Flash NOW...");let F=await ot(e,z,I,{aspectRatio:X,model:t});console.info("[AI] CRITICAL: generateImageWithGemini25Flash returned! Length:",F==null?void 0:F.length),this.aiRawOutputDataUrl=F,await this.refreshAiOutputFromRaw()}catch(T){console.error("[CustomizePanel] AI Generate Error:",T),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,r,o;if(!this.aiRawOutputDataUrl)return;let e=(a=(n=this.aiRemoveBgToggle)==null?void 0:n.checked)!=null?a:!1,t=Number((o=(r=this.aiBgToleranceInput)==null?void 0:r.value)!=null?o:"30"),i=this.aiRawOutputDataUrl;if(e){let l=await rt(this.aiRawOutputDataUrl,t);l&&(i=l)}this.setAiOutput(i),this.setAiStatus("Ready.")}setAiOutput(e){var i,n;this.aiOutputDataUrl=e,this.aiOutputKey=this.getSelectedAssetKey(),this.updateAiPreview(),this.setAiOutputButtonsEnabled(!0);let t=(i=this.previewModal)==null?void 0:i.querySelector("[data-asset-ai-preview]");this.updateAiModalPreview(t,(n=this.activePreviewKey)!=null?n:void 0)}setAiOutputButtonsEnabled(e){this.aiApplyBtn&&(this.aiApplyBtn.disabled=!e),this.aiSaveLibraryBtn&&(this.aiSaveLibraryBtn.disabled=!e),this.aiCropBtn&&(this.aiCropBtn.disabled=!e),this.aiDownloadBtn&&(this.aiDownloadBtn.disabled=!e)}handleAiApply(){var t,i,n;let e=this.getSelectedAssetInput();if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(e)console.log("[CustomizePanel] Applying AI output to brand asset:",e.dataset.assetKey),e.value=this.aiOutputDataUrl,this.handleAssetValueChange((t=e.dataset.assetKey)!=null?t:"",e),this.setAiStatus("Applied. Restarting game...");else{let a=((i=this.aiContext)==null?void 0:i.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),r=((n=this.aiContext)==null?void 0:n.path)||this.inferPathFromAssetKey(this.aiTargetKey||"");if(a&&r)console.log("[CustomizePanel] Applying AI output directly to object:",a,r),this.applyObjectPropertyValue(a,r,this.aiOutputDataUrl),this.setAiStatus("Applied directly. Restarting game..."),window.dispatchEvent(new CustomEvent("inspector:refresh"));else{this.setAiStatus("No target input found to apply.");return}}setTimeout(()=>{this.closeAiModal()},500)}async handleAiSaveToLibrary(){var a,r,o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}if(!this.getSelectedAssetKey()){this.setAiStatus("No asset selected.");return}let i=`${(this.aiTargetKey||"asset").replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_ai_generated`,n=this.inferCategoryFromAssetKey(this.aiTargetKey||"");this.setAiStatus("Saving to library...");try{let c=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:n,filename:`${i}.png`,data:this.aiOutputDataUrl,overwrite:!0})})).json();if(c.success){console.log("[CustomizePanel] \u2705 Saved to library:",c.path),this.setAiStatus(`Saved as ${i}.png. Refreshing library...`);let d=window.addAssetToRegistry;typeof d=="function"&&(console.log("[CustomizePanel] Adding to registry category:",n),d(n,`${i}.png`));try{console.log("[CustomizePanel] Triggering setup-library..."),(await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})).ok?console.log("[CustomizePanel] \u2705 Library setup completed"):console.warn("[CustomizePanel] Setup-library returned non-OK status")}catch(b){console.warn("[CustomizePanel] Setup-library endpoint not available:",b)}let p=window.refreshAssetLibrary;typeof p=="function"&&(console.log("[CustomizePanel] Refreshing library panel..."),await p());let u=window.__wizardAssetPicker;if(u!=null&&u.onPick){u.onPick(c.path),window.__wizardAssetPicker=null,this.setAiStatus("Saved to library and applied to wizard.");return}let g=((a=this.aiContext)==null?void 0:a.objectId)||this.inferObjectIdFromAssetKey(this.aiTargetKey||""),h=((r=this.aiContext)==null?void 0:r.path)||this.inferPathFromAssetKey(this.aiTargetKey||""),f=this.getSelectedAssetInput();if(f&&(f.value=c.path,this.handleAssetValueChange((o=f.dataset.assetKey)!=null?o:"",f)),g&&h){console.log("[CustomizePanel] Applying saved asset to object:",g,h);let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(h)||/\\.(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,h,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 r;let t=(r=this.aiContext)==null?void 0:r.objectId,i=e||this.aiTargetKey||"",n=window.getEditableAssets;if(typeof n=="function"){let o=n();if(o!=null&&o.slots){let l=o.slots.find(c=>t&&c.objectId===t||c.currentAsset===i||c.slotId===i||c.currentAsset&&c.currentAsset.includes(i)||i.includes(c.slotId));if(l){let c=l.libraryFolder||l.category;if(c)return c}}}let a=i.toLowerCase();return a.includes("background")?"backgrounds":a.includes("character")?"characters":a.includes("key")?"collectedkeys":a.includes("draggable")?"draggables":a.includes("environment")||a.includes("env")||a.includes("hand")||a.includes("prop")||a.includes("item")||a.includes("decor")||a.includes("object")?"environment":a.includes("machine")?"machines":a.includes("tutorial")?"tutorial":a.includes("ui")||a.includes("button")||a.includes("label")||a.includes("icon")||a.includes("logo")||a.includes("cta")||a.includes("menu")||a.includes("overlay")?"ui":a.includes("effect")||a.includes("confetti")||a.includes("particle")?"effects":"ui"}inferObjectIdFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(a=>a.currentAsset===e||a.slotId===e);return(n==null?void 0:n.objectId)||null}inferPathFromAssetKey(e){let t=window.getEditableAssets;if(typeof t!="function")return null;let i=t();if(!(i!=null&&i.slots))return null;let n=i.slots.find(r=>r.currentAsset===e||r.slotId===e);if(!n)return null;let a=n.category;return a==="render"||a==="backgrounds"||a==="characters"?"render.texture":a==="ui"?"ui.image":a==="audio"?"audio.src":"render.texture"}getFilenameFromPath(e){if(!e)return"";let t=e.split("/");return t[t.length-1]}async handleAiCrop(){var o;if(!this.aiOutputDataUrl){this.setAiStatus("Generate output first.");return}let e=this.getSelectedAssetInput(),t=(o=e==null?void 0:e.value)!=null?o:"",i=await this.getImageDimensions(t);if(!i){this.setAiStatus("Unable to read target dimensions.");return}let n=aa(this.aiOutputDataUrl,"ai-output.png");if(!n)return;let a=await this.showManualCropModal(n,i,t);if(!a)return;let r=await na(a);r&&this.setAiOutput(r)}handleAiDownload(){var i;if(!this.aiOutputDataUrl)return;let e=(i=this.getSelectedAssetKey())!=null?i:"ai-image",t=document.createElement("a");t.href=this.aiOutputDataUrl,t.download=`${e}-ai.png`,t.click()}handleAssetValueChange(e,t){this.previewModal&&this.closePreviewModal(),this.scheduleAutoApply(),this.updatePreviewIfOpen(e,t.value,t.dataset.assetType)}async handleAssetUpload(e,t,i){console.log("[CustomizePanel] Handling asset upload for:",i);let n=t.value,a=e;if(e.type.startsWith("image/")){let d=await this.getImageDimensions(n);if(d){let p=await this.showManualCropModal(e,d,n);if(!p)return;a=p}}let r=await na(a);if(!r){console.error("[CustomizePanel] Failed to convert file to data URL");return}let l=`${i.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"")}_uploaded`,c=this.inferCategoryFromAssetKey(i);console.log("[CustomizePanel] Saving uploaded file to library:",l,"category:",c);try{let p=await(await fetch("/api/library/save",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({category:c,filename:`${l}.png`,data:r,overwrite:!0})})).json();if(p.success){console.log("[CustomizePanel] \u2705 Uploaded file saved to library:",p.path);let u=window.addAssetToRegistry;typeof u=="function"&&u(c,`${l}.png`);try{await fetch("/api/setup-library",{method:"POST",headers:{"Content-Type":"application/json"}})}catch(b){console.warn("[CustomizePanel] Setup-library not available:",b)}let g=window.refreshAssetLibrary;typeof g=="function"&&await g(),t.value=p.path,this.handleAssetValueChange(i,t);let h=this.inferObjectIdFromAssetKey(i),f=this.inferPathFromAssetKey(i);if(h&&f){let b=window.applyAssetToSlot,y=/texture|image|sprite|asset\\.path/i.test(f)||/\\.(png|jpg|jpeg)$/i.test(String(p.path||""));if(typeof b=="function"&&y){let v=this.getFilenameFromPath(p.path);await b(h,v,c)}else this.applyObjectPropertyValue(h,f,p.path);window.dispatchEvent(new CustomEvent("inspector:refresh"))}let m=window.__highlightLibrarySlot;typeof m=="function"&&h&&setTimeout(()=>{m(h,c)},500),console.log("[CustomizePanel] \u2705 Upload complete:",l)}else console.error("[CustomizePanel] \u274C Upload save failed:",p.error),alert(`Failed to save uploaded file: ${p.error}`)}catch(d){console.error("[CustomizePanel] \u274C Upload error:",d),alert("Failed to save uploaded file. Check console for details.")}}scheduleAutoApply(){this.options&&(this.autoApplyTimer&&window.clearTimeout(this.autoApplyTimer),console.log("[CustomizePanel] Scheduling auto-apply in 250ms"),this.autoApplyTimer=window.setTimeout(()=>{this.autoApplyTimer=null,console.log("[CustomizePanel] Executing auto-apply now"),this.handleApplyWithSource("auto")},250))}previewAsset(e,t,i,n){if(!t)return;let a=this.resolveAssetUrls(t);if(a.length===0)return;let r=i||this.guessMimeType(t);this.activePreviewKey=e,this.activePreviewValue=t,this.activePreviewFileInput=n!=null?n:null,this.openPreviewModal(e,t,a,r)}resolveAssetUrls(e){let t=e.trim();if(!t)return[];if(console.log("[CustomizePanel] Resolving asset urls for:",t),/^(blob:|data:|https?:|\/)/.test(t))return console.log("[CustomizePanel] Path is absolute or data/blob, using as is"),[t];let i=t.replace(/^\.?\//,""),n=[];return i.startsWith("raw/")?n=[`/${i}`,`/assets/${i}`]:i.startsWith("assets/")?n=[`/${i}`]:n=[`/raw/${i}`,`/assets/raw/${i}`,`/assets/${i}`,`/${i}`],console.log("[CustomizePanel] Resolved to possible paths:",n),n}guessMimeType(e){let t=e.toLowerCase();return t.endsWith(".png")||t.endsWith(".jpg")||t.endsWith(".jpeg")||t.endsWith(".gif")||t.endsWith(".webp")||t.endsWith(".svg")?"image":t.endsWith(".mp3")||t.endsWith(".wav")||t.endsWith(".ogg")?"audio":t.endsWith(".json")?"json":"file"}openPreviewModal(e,t,i,n){this.closePreviewModal(!0);let a=document.createElement("div");a.className="asset-preview-modal",a.innerHTML=`
1749
1749
  <div class="asset-preview-card">
1750
1750
  <div class="asset-preview-header">
1751
1751
  <div class="asset-preview-title">${e}</div>
@@ -1761,7 +1761,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1761
1761
  <img class="asset-preview-ai-image" alt="AI output preview">
1762
1762
  </div>
1763
1763
  </div>
1764
- `;let r=a.querySelector(".asset-preview-body"),o=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),d=a.querySelector("[data-asset-ai-preview]");if(o==null||o.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),a.addEventListener("click",p=>{p.target===a&&this.closePreviewModal()}),r)if(n==="image"){let p=document.createElement("img");this.loadWithFallback(p,i),r.appendChild(p)}else if(n==="audio"){let p=document.createElement("audio");p.controls=!0,this.loadWithFallback(p,i),r.appendChild(p)}else if(n==="json"){let p=document.createElement("pre");this.fetchWithFallback(i).then(u=>{p.textContent=u!=null?u:"Unable to load JSON."}),r.appendChild(p)}else{let p=document.createElement("a");p.href=i[0],p.target="_blank",p.rel="noreferrer",p.textContent="Open asset",r.appendChild(p)}document.body.appendChild(a),this.previewModal=a,this.updateAiModalPreview(d,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="function")return;let r=n(e);if(!r)return;let o=JSON.parse(JSON.stringify(r)),l=t.split("."),c=o;for(let d=0;d<l.length-1;d++){let p=l[d];c[p]=c[p]||{},c=c[p]}c[l[l.length-1]]=i,a(e,o)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var a;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(a=this.activePreviewFileInput)!=null?a:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=a=>{var u,g;a.preventDefault();let r=a.clientX,o=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,d=h=>{let m=h.clientX-r,f=Math.min(c,Math.max(l,o+m));this.root&&(this.root.style.width=`${f}px`)},p=()=>{var m,f;window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p);let h=(f=(m=this.root)==null?void 0:m.getBoundingClientRect().width)!=null?f:0;h>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(h)))};window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,a=URL.createObjectURL(e),r=await this.loadImage(a);try{URL.revokeObjectURL(a)}catch{}if(!(r!=null&&r.naturalWidth)||!(r!=null&&r.naturalHeight))return null;let o=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let d=Math.min(860,window.innerWidth-60),h=Math.max(220,Math.floor((d-32-16)/2)),m=Math.min(520,window.innerHeight-240),f=h,b=f/n;b>m&&(b=m,f=b*n),c.innerHTML=`
1764
+ `;let r=a.querySelector(".asset-preview-body"),o=a.querySelector(".asset-preview-close"),l=a.querySelector(".asset-preview-change"),c=a.querySelector(".asset-preview-ai"),d=a.querySelector("[data-asset-ai-preview]");if(o==null||o.addEventListener("click",()=>this.closePreviewModal()),c==null||c.addEventListener("click",()=>{console.log("[CustomizePanel] AI Edit clicked for:",e),this.openAiModal(e,t)}),l==null||l.addEventListener("click",()=>{console.log("[CustomizePanel] Change clicked for:",e),this.activePreviewFileInput&&this.activePreviewFileInput.click()}),a.addEventListener("click",p=>{p.target===a&&this.closePreviewModal()}),r)if(n==="image"){let p=document.createElement("img");this.loadWithFallback(p,i),r.appendChild(p)}else if(n==="audio"){let p=document.createElement("audio");p.controls=!0,this.loadWithFallback(p,i),r.appendChild(p)}else if(n==="json"){let p=document.createElement("pre");this.fetchWithFallback(i).then(u=>{p.textContent=u!=null?u:"Unable to load JSON."}),r.appendChild(p)}else{let p=document.createElement("a");p.href=i[0],p.target="_blank",p.rel="noreferrer",p.textContent="Open asset",r.appendChild(p)}document.body.appendChild(a),this.previewModal=a,this.updateAiModalPreview(d,e)}loadWithFallback(e,t){if(t.length===0)return;let i=0,n=()=>{i>=t.length||(e.src=t[i],i+=1)};e.addEventListener("error",n),n()}async fetchWithFallback(e){for(let t of e)try{let i=await fetch(t);if(!i.ok)continue;return await i.text()}catch{}return null}applyObjectPropertyValue(e,t,i){let n=window.getEditableObjectConfig,a=window.applyEditableObjectConfig;if(typeof n!="function"||typeof a!="function")return;let r=n(e);if(!r)return;let o=JSON.parse(JSON.stringify(r)),l=t.split("."),c=o;for(let d=0;d<l.length-1;d++){let p=l[d];c[p]=c[p]||{},c=c[p]}c[l[l.length-1]]=i,a(e,o)}applyTextColorToObject(e,t){let n={warning_text_color:{objectId:"label.warning",property:"render.tint"},endgame_title_color:{objectId:"ui.endgame.title",property:"render.tint"},endgame_subtitle_color:{objectId:"ui.endgame.subtitle",property:"render.tint"},endgame_cta_text_color:{objectId:"ui.endgame.cta",property:"render.tint"},endgame_cta_hint_color:{objectId:"ui.endgame.cta.hint",property:"render.tint"},endgame_footer_color:{objectId:"ui.endgame.footer",property:"render.tint"}}[e];n&&this.applyObjectPropertyValue(n.objectId,n.property,t)}closePreviewModal(e){this.previewModal&&(this.previewModal.remove(),this.previewModal=null),e||(this.activePreviewKey=null,this.activePreviewValue=null,this.activePreviewFileInput=null)}updatePreviewIfOpen(e,t,i){var a;if(!this.previewModal||this.activePreviewKey!==e)return;let n=t!=null?t:"";this.activePreviewValue!==n&&this.previewAsset(e,n,i,(a=this.activePreviewFileInput)!=null?a:void 0)}scheduleRetry(){this.retryTimer||(this.retryTimer=window.setTimeout(()=>{this.retryTimer=null,this.refresh()},350))}clearRetry(){this.retryTimer&&(window.clearTimeout(this.retryTimer),this.retryTimer=null)}setupResizeHandle(){if(!this.root)return;let e=this.root.querySelector("[data-panel-resize]");if(!e)return;let t=window.localStorage.getItem("customizePanelWidth"),i=t?Number(t):NaN;Number.isFinite(i)&&i>0&&(this.root.style.width=`${i}px`);let n=a=>{var u,g;a.preventDefault();let r=a.clientX,o=(g=(u=this.root)==null?void 0:u.getBoundingClientRect().width)!=null?g:0,l=260,c=620,d=h=>{let f=h.clientX-r,m=Math.min(c,Math.max(l,o+f));this.root&&(this.root.style.width=`${m}px`)},p=()=>{var f,m;window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p);let h=(m=(f=this.root)==null?void 0:f.getBoundingClientRect().width)!=null?m:0;h>0&&window.localStorage.setItem("customizePanelWidth",String(Math.round(h)))};window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)};e.addEventListener("pointerdown",n)}async getImageDimensions(e){let t=this.resolveAssetUrls(e);if(t.length===0)return null;for(let i of t){let n=await this.loadImage(i);if(n!=null&&n.naturalWidth&&(n!=null&&n.naturalHeight))return{width:n.naturalWidth,height:n.naturalHeight}}return null}async loadImage(e){return await new Promise(t=>{let i=new Image;i.onload=()=>t(i),i.onerror=()=>t(null),i.src=e})}async showManualCropModal(e,t,i){let n=t.width/t.height,a=URL.createObjectURL(e),r=await this.loadImage(a);try{URL.revokeObjectURL(a)}catch{}if(!(r!=null&&r.naturalWidth)||!(r!=null&&r.naturalHeight))return null;let o=await this.loadImageForValue(i);return await new Promise(l=>{let c=document.createElement("div");c.className="asset-crop-modal";let d=Math.min(860,window.innerWidth-60),h=Math.max(220,Math.floor((d-32-16)/2)),f=Math.min(520,window.innerHeight-240),m=h,b=m/n;b>f&&(b=f,m=b*n),c.innerHTML=`
1765
1765
  <div class="asset-crop-card" style="width:${d}px;">
1766
1766
  <div class="asset-crop-header">
1767
1767
  <div>
@@ -1773,11 +1773,11 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1773
1773
  <div class="asset-crop-body">
1774
1774
  <div class="asset-crop-column">
1775
1775
  <div class="asset-crop-label">Crop</div>
1776
- <canvas class="asset-crop-canvas" width="${Math.round(f)}" height="${Math.round(b)}"></canvas>
1776
+ <canvas class="asset-crop-canvas" width="${Math.round(m)}" height="${Math.round(b)}"></canvas>
1777
1777
  </div>
1778
1778
  <div class="asset-crop-column">
1779
1779
  <div class="asset-crop-label">Compare</div>
1780
- <canvas class="asset-crop-preview" width="${Math.round(f)}" height="${Math.round(b)}"></canvas>
1780
+ <canvas class="asset-crop-preview" width="${Math.round(m)}" height="${Math.round(b)}"></canvas>
1781
1781
  </div>
1782
1782
  </div>
1783
1783
  <div class="asset-crop-controls">
@@ -1791,7 +1791,7 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1791
1791
  <button class="asset-crop-apply" type="button">Apply Crop</button>
1792
1792
  </div>
1793
1793
  </div>
1794
- `;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),S=c.querySelector(".asset-crop-zoom"),C=c.querySelector(".asset-crop-zoom-value"),I=c.querySelector(".asset-crop-close"),O=c.querySelector(".asset-crop-cancel"),w=c.querySelector(".asset-crop-apply"),T=c.querySelector(".asset-crop-reset");if(!y||!v||!S||!C){l(null);return}let j=y.getContext("2d"),A=v.getContext("2d");if(!j||!A){l(null);return}let k=r.naturalWidth,M=r.naturalHeight,L=Math.max(y.width/k,y.height/M),E=1,x=0,_=0,P=!1,R=0,z=0,N=0,J=0,H=()=>{let F=L*E,$e=Math.max(0,(k*F-y.width)/2),Ke=Math.max(0,(M*F-y.height)/2);x=Math.min($e,Math.max(-$e,x)),_=Math.min(Ke,Math.max(-Ke,_))},q=()=>{let F=L*E;j.clearRect(0,0,y.width,y.height);let $e=y.width/2-k*F/2+x,Ke=y.height/2-M*F/2+_;if(j.drawImage(r,$e,Ke,k*F,M*F),A.clearRect(0,0,v.width,v.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let Je=Math.max(v.width/o.naturalWidth,v.height/o.naturalHeight),wn=v.width/2-o.naturalWidth*Je/2,xt=v.height/2-o.naturalHeight*Je/2;A.drawImage(o,wn,xt,o.naturalWidth*Je,o.naturalHeight*Je)}else A.fillStyle="rgba(255, 255, 255, 0.04)",A.fillRect(0,0,v.width,v.height),A.strokeStyle="rgba(255, 255, 255, 0.08)",A.strokeRect(4,4,v.width-8,v.height-8);let wt=v.width/y.width*(L*E),Xe=x*(v.width/y.width),Jt=_*(v.height/y.height),yn=v.width/2-k*wt/2+Xe,vn=v.height/2-M*wt/2+Jt;A.save(),A.globalAlpha=.7,A.drawImage(r,yn,vn,k*wt,M*wt),A.restore()},fe=()=>{x=0,_=0,H(),q()};S.addEventListener("input",()=>{E=Number(S.value),C.textContent=`${E.toFixed(2)}\xD7`,H(),q()}),y.addEventListener("pointerdown",F=>{P=!0,R=F.clientX,z=F.clientY,N=x,J=_,y.setPointerCapture(F.pointerId)}),y.addEventListener("pointermove",F=>{P&&(x=N+(F.clientX-R),_=J+(F.clientY-z),H(),q())}),y.addEventListener("pointerup",F=>{P=!1,y.releasePointerCapture(F.pointerId)}),y.addEventListener("pointerleave",()=>{P=!1});let fn=()=>{c.remove()},bn=()=>{fn(),l(null)},Qr=async()=>{let F=document.createElement("canvas");F.width=t.width,F.height=t.height;let $e=F.getContext("2d");if(!$e){fn(),l(null);return}let Ke=E,Xe=Math.max(F.width/k,F.height/M)*Ke,Jt=F.width/y.width,yn=x*Jt,vn=_*Jt,Je=F.width/2-k*Xe/2+yn,wn=F.height/2-M*Xe/2+vn;$e.drawImage(r,Je,wn,k*Xe,M*Xe);let xt=await new Promise(eo=>{F.toBlob(to=>eo(to),e.type||"image/png")});if(fn(),!xt){l(null);return}l(new File([xt],e.name,{type:xt.type}))};I==null||I.addEventListener("click",bn),O==null||O.addEventListener("click",bn),T==null||T.addEventListener("click",fe),w==null||w.addEventListener("click",()=>{Qr()}),c.addEventListener("click",F=>{F.target===c&&bn()}),document.body.appendChild(c),fe()})}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 Xi=class{constructor(){this.root=null;this.options=null}render(){return`
1794
+ `;let y=c.querySelector(".asset-crop-canvas"),v=c.querySelector(".asset-crop-preview"),x=c.querySelector(".asset-crop-zoom"),L=c.querySelector(".asset-crop-zoom-value"),P=c.querySelector(".asset-crop-close"),O=c.querySelector(".asset-crop-cancel"),w=c.querySelector(".asset-crop-apply"),k=c.querySelector(".asset-crop-reset");if(!y||!v||!x||!L){l(null);return}let j=y.getContext("2d"),C=v.getContext("2d");if(!j||!C){l(null);return}let A=r.naturalWidth,M=r.naturalHeight,T=Math.max(y.width/A,y.height/M),E=1,S=0,_=0,I=!1,R=0,z=0,N=0,X=0,F=()=>{let H=T*E,$e=Math.max(0,(A*H-y.width)/2),Ke=Math.max(0,(M*H-y.height)/2);S=Math.min($e,Math.max(-$e,S)),_=Math.min(Ke,Math.max(-Ke,_))},q=()=>{let H=T*E;j.clearRect(0,0,y.width,y.height);let $e=y.width/2-A*H/2+S,Ke=y.height/2-M*H/2+_;if(j.drawImage(r,$e,Ke,A*H,M*H),C.clearRect(0,0,v.width,v.height),o!=null&&o.naturalWidth&&(o!=null&&o.naturalHeight)){let Je=Math.max(v.width/o.naturalWidth,v.height/o.naturalHeight),wn=v.width/2-o.naturalWidth*Je/2,xt=v.height/2-o.naturalHeight*Je/2;C.drawImage(o,wn,xt,o.naturalWidth*Je,o.naturalHeight*Je)}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 wt=v.width/y.width*(T*E),Xe=S*(v.width/y.width),Jt=_*(v.height/y.height),yn=v.width/2-A*wt/2+Xe,vn=v.height/2-M*wt/2+Jt;C.save(),C.globalAlpha=.7,C.drawImage(r,yn,vn,A*wt,M*wt),C.restore()},Q=()=>{S=0,_=0,F(),q()};x.addEventListener("input",()=>{E=Number(x.value),L.textContent=`${E.toFixed(2)}\xD7`,F(),q()}),y.addEventListener("pointerdown",H=>{I=!0,R=H.clientX,z=H.clientY,N=S,X=_,y.setPointerCapture(H.pointerId)}),y.addEventListener("pointermove",H=>{I&&(S=N+(H.clientX-R),_=X+(H.clientY-z),F(),q())}),y.addEventListener("pointerup",H=>{I=!1,y.releasePointerCapture(H.pointerId)}),y.addEventListener("pointerleave",()=>{I=!1});let mn=()=>{c.remove()},bn=()=>{mn(),l(null)},Qr=async()=>{let H=document.createElement("canvas");H.width=t.width,H.height=t.height;let $e=H.getContext("2d");if(!$e){mn(),l(null);return}let Ke=E,Xe=Math.max(H.width/A,H.height/M)*Ke,Jt=H.width/y.width,yn=S*Jt,vn=_*Jt,Je=H.width/2-A*Xe/2+yn,wn=H.height/2-M*Xe/2+vn;$e.drawImage(r,Je,wn,A*Xe,M*Xe);let xt=await new Promise(eo=>{H.toBlob(to=>eo(to),e.type||"image/png")});if(mn(),!xt){l(null);return}l(new File([xt],e.name,{type:xt.type}))};P==null||P.addEventListener("click",bn),O==null||O.addEventListener("click",bn),k==null||k.addEventListener("click",Q),w==null||w.addEventListener("click",()=>{Qr()}),c.addEventListener("click",H=>{H.target===c&&bn()}),document.body.appendChild(c),Q()})}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 Xi=class{constructor(){this.root=null;this.options=null}render(){return`
1795
1795
  <div class="scene-panel loading-screen-panel panel-accent-purple" data-panel="loading-screen">
1796
1796
  <div class="scene-panel-header" data-panel-handle>
1797
1797
  <div class="panel-title">
@@ -1857,10 +1857,10 @@ Generate the requested asset matching the brand style.${s.needsTransparency?" Ba
1857
1857
  </div>
1858
1858
  </div>
1859
1859
  </div>
1860
- `}initialize(e,t){var y,v,S,C,I,O,w,T,j,A,k,M,L,E,x,_;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var R;let P=window.getEditableEngineConfig;if(typeof P=="function"){let z=P();return(R=z==null?void 0:z.loading)!=null?R:{}}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 P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{type:a.value}),this.updateFieldVisibility(a.value)}));let r=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");r&&(r.value=n.background_color||"#160a17",r.addEventListener("input",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{background_color:r.value})}));let o=(S=this.root)==null?void 0:S.querySelector("#loading-overlay-alpha"),l=(C=this.root)==null?void 0:C.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((I=n.overlay_alpha)!=null?I:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var R,z;let P=Number(o.value);l&&(l.textContent=P.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{overlay_alpha:P})}));let c=(O=this.root)==null?void 0:O.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{text:c.value})}));let d=(w=this.root)==null?void 0:w.querySelector("#loading-text-scale"),p=(T=this.root)==null?void 0:T.querySelector("#loading-text-scale-value");d&&(d.value=String((j=n.text_scale)!=null?j:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var R,z;let P=Number(d.value);p&&(p.textContent=P.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{text_scale:P})}));let u=(A=this.root)==null?void 0:A.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{enabled:u.checked})}));let g=(k=this.root)==null?void 0:k.querySelector("#loading-blur-enabled");g&&(g.checked=n.blur_enabled!==!1,g.addEventListener("change",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{blur_enabled:g.checked})}));let h=(M=this.root)==null?void 0:M.querySelector("#loading-blur-strength"),m=(L=this.root)==null?void 0:L.querySelector("#loading-blur-strength-value");h&&(h.value=String((E=n.blur_strength)!=null?E:8),m&&(m.textContent=h.value),h.addEventListener("input",()=>{var P,R;m&&(m.textContent=h.value),(R=(P=this.options)==null?void 0:P.onUpdateLoading)==null||R.call(P,{blur_strength:Number(h.value)})}));let f=(x=this.root)==null?void 0:x.querySelector("#loading-show-btn"),b=(_=this.root)==null?void 0:_.querySelector("#loading-hide-btn");f==null||f.addEventListener("click",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onShowLoadingScreen)==null||R.call(P)}),b==null||b.addEventListener("click",()=>{var P,R;(R=(P=this.options)==null?void 0:P.onHideLoadingScreen)==null||R.call(P)}),this.updateFieldVisibility(n.type==="image"?"image":"color")}updateFieldVisibility(e){var n,a;let t=(n=this.root)==null?void 0:n.querySelector("#loading-color-field"),i=(a=this.root)==null?void 0:a.querySelector("#loading-alpha-field");e==="image"?(t&&(t.style.display="none"),i&&(i.style.display="none")):(t&&(t.style.display=""),i&&(i.style.display=""))}refresh(){}};var Nt=require("pixi.js");var la=require("pixi.js"),Oe=()=>window.debugConfig||{},fr=()=>window.resolveAnchorVec2||(s=>({x:.5,y:.5})),br=()=>window.resolveScreenAnchorPoint||(()=>new la.Point),yr=()=>window.resolveScreenRatioPoint||(()=>new la.Point);function vr(s){Ji(s)&&(s.objectDebugRaf||(s.objectDebugRaf=window.requestAnimationFrame(()=>Zi(s))))}function wr(s){s.objectDebugRaf&&(window.cancelAnimationFrame(s.objectDebugRaf),s.objectDebugRaf=null),Dt(s)}function Ji(s){return s.isDebugOpen}function Zi(s){var a,r,o;if(!Ji(s)){s.objectDebugRaf=null;return}s.objectDebugRaf=window.requestAnimationFrame(()=>Zi(s));let e=ca(s);if(!e){$t(s,null),Dt(s);return}let t=da(s,e);if(!t){$t(s,null),Dt(s);return}let i=new Nt.Point;(a=t.getGlobalPosition)==null||a.call(t,i);let n=pa(s,t);$t(s,{instanceId:e,worldX:i.x,worldY:i.y,configX:(r=n==null?void 0:n.x)!=null?r:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),s.highlightObject?ma(s,t):ba(s),s.highlightAnchor&&n?fa(s,n):ya(s)}function ca(s){var n;let e=s.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function da(s,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function Ht(s){let e=s.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function pa(s,e){var r,o;let t=Ht(s);if(!t)return null;let i=(r=t.transform)!=null?r:{},n=ua(s);if(!n)return null;if(i.position_ratio!=null)return yr()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return br()(n.width,n.height,a)}function ua(s){var a;let e=(a=s.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function ga(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectBoundsGfx&&s.objectBoundsGfx.parent!==e.stage&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectBoundsGfx||(s.objectBoundsGfx=new Nt.Graphics,s.objectBoundsGfx.zIndex=999999,e.stage.addChild(s.objectBoundsGfx)),s.objectBoundsGfx):null}function ha(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectAnchorGfx&&s.objectAnchorGfx.parent!==e.stage&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null),s.objectAnchorGfx||(s.objectAnchorGfx=new Nt.Graphics,s.objectAnchorGfx.zIndex=1e6,e.stage.addChild(s.objectAnchorGfx)),s.objectAnchorGfx):null}function ma(s,e){var n;let t=ga(s);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function fa(s,e){let t=ha(s);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function ba(s){s.objectBoundsGfx&&s.objectBoundsGfx.clear()}function ya(s){s.objectAnchorGfx&&s.objectAnchorGfx.clear()}function Dt(s){s.objectBoundsGfx&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectAnchorGfx&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null)}function $t(s,e){s.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function xr(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function Sr(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;for(let o of i)a[o]=(r=a[o])!=null?r:{},a=a[o];a[n]=t}function va(s){var i,n,a,r,o;if(!s)return!1;if((i=s.transform)!=null&&i.offset)return!0;let e=((a=(n=s.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(r=s.identity)==null?void 0:r.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function en(s){let e=Oe();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 Er(s){window.location.reload()}function tn(s){let e=JSON.stringify(Oe(),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 Cr(s,e){var t,i,n;if(!(!s.configViewer||!s.container))try{let a=window.getEditableObjectConfig,r=typeof a=="function"?a(e):null;if(!r){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await Promise.resolve().then(()=>(xi(),Us)),p=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!p)return;let u=await l(p.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),Qi(s,u),(i=s.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,r),Qi(s,r),(n=s.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function Qi(s,e){var p,u,g,h,m,f,b,y,v,S;if(!s.container)return;let t=s.container.querySelector("#config-pos-x"),i=s.container.querySelector("#config-pos-y"),n=s.container.querySelector("#config-scale"),a=s.container.querySelector("#config-anchor-x"),r=s.container.querySelector("#config-anchor-y"),l=va(e)?(p=e.transform)==null?void 0:p.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((h=l==null?void 0:l.y)!=null?h:0)),n&&(n.value=String((f=(m=e.transform)==null?void 0:m.scale)!=null?f:1));let c=(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},d=fr()(c);a&&(a.value=String(d.x)),r&&(r.value=String(d.y))}function Ar(s){var l,c,d,p,u,g,h,m,f,b;let e=s.selectedObjectId;if(!e||!s.container)return;let t=(c=(l=s.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=s.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=s.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(m=(h=s.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?m:"0.5",r=(b=(f=s.container.querySelector("#config-anchor-y"))==null?void 0:f.value)!=null?b:"0.5",o=`${e}:
1860
+ `}initialize(e,t){var y,v,x,L,P,O,w,k,j,C,A,M,T,E,S,_;this.options=t,this.root=e.querySelector('[data-panel="loading-screen"]');let n=(()=>{var R;let I=window.getEditableEngineConfig;if(typeof I=="function"){let z=I();return(R=z==null?void 0:z.loading)!=null?R:{}}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 I,R;(R=(I=this.options)==null?void 0:I.onUpdateLoading)==null||R.call(I,{type:a.value}),this.updateFieldVisibility(a.value)}));let r=(v=this.root)==null?void 0:v.querySelector("#loading-background-color");r&&(r.value=n.background_color||"#160a17",r.addEventListener("input",()=>{var I,R;(R=(I=this.options)==null?void 0:I.onUpdateLoading)==null||R.call(I,{background_color:r.value})}));let o=(x=this.root)==null?void 0:x.querySelector("#loading-overlay-alpha"),l=(L=this.root)==null?void 0:L.querySelector("#loading-overlay-alpha-value");o&&(o.value=String((P=n.overlay_alpha)!=null?P:1),l&&(l.textContent=Number(o.value).toFixed(2)),o.addEventListener("input",()=>{var R,z;let I=Number(o.value);l&&(l.textContent=I.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{overlay_alpha:I})}));let c=(O=this.root)==null?void 0:O.querySelector("#loading-text");c&&(c.value=n.text||"",c.addEventListener("input",()=>{var I,R;(R=(I=this.options)==null?void 0:I.onUpdateLoading)==null||R.call(I,{text:c.value})}));let d=(w=this.root)==null?void 0:w.querySelector("#loading-text-scale"),p=(k=this.root)==null?void 0:k.querySelector("#loading-text-scale-value");d&&(d.value=String((j=n.text_scale)!=null?j:.6),p&&(p.textContent=Number(d.value).toFixed(2)),d.addEventListener("input",()=>{var R,z;let I=Number(d.value);p&&(p.textContent=I.toFixed(2)),(z=(R=this.options)==null?void 0:R.onUpdateLoading)==null||z.call(R,{text_scale:I})}));let u=(C=this.root)==null?void 0:C.querySelector("#loading-enabled");u&&(u.checked=n.enabled!==!1,u.addEventListener("change",()=>{var I,R;(R=(I=this.options)==null?void 0:I.onUpdateLoading)==null||R.call(I,{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 I,R;(R=(I=this.options)==null?void 0:I.onUpdateLoading)==null||R.call(I,{blur_enabled:g.checked})}));let h=(M=this.root)==null?void 0:M.querySelector("#loading-blur-strength"),f=(T=this.root)==null?void 0:T.querySelector("#loading-blur-strength-value");h&&(h.value=String((E=n.blur_strength)!=null?E:8),f&&(f.textContent=h.value),h.addEventListener("input",()=>{var I,R;f&&(f.textContent=h.value),(R=(I=this.options)==null?void 0:I.onUpdateLoading)==null||R.call(I,{blur_strength:Number(h.value)})}));let m=(S=this.root)==null?void 0:S.querySelector("#loading-show-btn"),b=(_=this.root)==null?void 0:_.querySelector("#loading-hide-btn");m==null||m.addEventListener("click",()=>{var I,R;(R=(I=this.options)==null?void 0:I.onShowLoadingScreen)==null||R.call(I)}),b==null||b.addEventListener("click",()=>{var I,R;(R=(I=this.options)==null?void 0:I.onHideLoadingScreen)==null||R.call(I)}),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 Nt=require("pixi.js");var la=require("pixi.js"),Oe=()=>window.debugConfig||{},mr=()=>window.resolveAnchorVec2||(s=>({x:.5,y:.5})),br=()=>window.resolveScreenAnchorPoint||(()=>new la.Point),yr=()=>window.resolveScreenRatioPoint||(()=>new la.Point);function vr(s){Ji(s)&&(s.objectDebugRaf||(s.objectDebugRaf=window.requestAnimationFrame(()=>Zi(s))))}function wr(s){s.objectDebugRaf&&(window.cancelAnimationFrame(s.objectDebugRaf),s.objectDebugRaf=null),Dt(s)}function Ji(s){return s.isDebugOpen}function Zi(s){var a,r,o;if(!Ji(s)){s.objectDebugRaf=null;return}s.objectDebugRaf=window.requestAnimationFrame(()=>Zi(s));let e=ca(s);if(!e){$t(s,null),Dt(s);return}let t=da(s,e);if(!t){$t(s,null),Dt(s);return}let i=new Nt.Point;(a=t.getGlobalPosition)==null||a.call(t,i);let n=pa(s,t);$t(s,{instanceId:e,worldX:i.x,worldY:i.y,configX:(r=n==null?void 0:n.x)!=null?r:null,configY:(o=n==null?void 0:n.y)!=null?o:null}),s.highlightObject?fa(s,t):ba(s),s.highlightAnchor&&n?ma(s,n):ya(s)}function ca(s){var n;let e=s.selectedObjectId;if(!e)return null;let t=window.__editableObjectInstances,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return Array.isArray(i)&&i.length>0?i[0]:e}function da(s,e){var n,a;let t=window.gameObjectManager,i=(n=t==null?void 0:t.get)==null?void 0:n.call(t,e);return i?((a=i.getDisplayObject)==null?void 0:a.call(i))||i.pixiObject||i:null}function Ht(s){let e=s.selectedObjectId;if(!e)return null;let t=window.getEditableObjectConfig;return typeof t!="function"?null:t(e)}function pa(s,e){var r,o;let t=Ht(s);if(!t)return null;let i=(r=t.transform)!=null?r:{},n=ua(s);if(!n)return null;if(i.position_ratio!=null)return yr()(n.width,n.height,i.position_ratio);let a=(o=i.anchor)!=null?o:"center";return br()(n.width,n.height,a)}function ua(s){var a;let e=(a=s.container)==null?void 0:a.querySelector(".game-container"),t=Number(e==null?void 0:e.dataset.screenWidth),i=Number(e==null?void 0:e.dataset.screenHeight);if(Number.isFinite(t)&&t>0&&Number.isFinite(i)&&i>0)return{width:t,height:i};let n=window.gameApp;return n!=null&&n.renderer?{width:n.renderer.width,height:n.renderer.height}:null}function ga(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectBoundsGfx&&s.objectBoundsGfx.parent!==e.stage&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectBoundsGfx||(s.objectBoundsGfx=new Nt.Graphics,s.objectBoundsGfx.zIndex=999999,e.stage.addChild(s.objectBoundsGfx)),s.objectBoundsGfx):null}function ha(s){let e=window.gameApp;return e!=null&&e.stage?(s.objectAnchorGfx&&s.objectAnchorGfx.parent!==e.stage&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null),s.objectAnchorGfx||(s.objectAnchorGfx=new Nt.Graphics,s.objectAnchorGfx.zIndex=1e6,e.stage.addChild(s.objectAnchorGfx)),s.objectAnchorGfx):null}function fa(s,e){var n;let t=ga(s);if(!t)return;let i=(n=e.getBounds)==null?void 0:n.call(e);i&&(t.clear(),t.rect(i.x,i.y,i.width,i.height).stroke({width:2,color:16726832,alpha:.9}))}function ma(s,e){let t=ha(s);if(!t)return;let i=6;t.clear(),t.moveTo(e.x-i,e.y),t.lineTo(e.x+i,e.y),t.moveTo(e.x,e.y-i),t.lineTo(e.x,e.y+i),t.stroke({width:2,color:3066993,alpha:.9})}function ba(s){s.objectBoundsGfx&&s.objectBoundsGfx.clear()}function ya(s){s.objectAnchorGfx&&s.objectAnchorGfx.clear()}function Dt(s){s.objectBoundsGfx&&(s.objectBoundsGfx.destroy(),s.objectBoundsGfx=null),s.objectAnchorGfx&&(s.objectAnchorGfx.destroy(),s.objectAnchorGfx=null)}function $t(s,e){s.sceneToolsPanel.updateInfo(e?{instanceId:e.instanceId,worldX:e.worldX,worldY:e.worldY,anchorX:e.configX,anchorY:e.configY}:null)}function xr(s,e){return e.split(".").reduce((t,i)=>t?t[i]:void 0,s)}function Sr(s,e,t){var r;let i=e.split("."),n=i.pop(),a=s;for(let o of i)a[o]=(r=a[o])!=null?r:{},a=a[o];a[n]=t}function va(s){var i,n,a,r,o;if(!s)return!1;if((i=s.transform)!=null&&i.offset)return!0;let e=((a=(n=s.identity)==null?void 0:n.category)!=null?a:"").toString().toLowerCase(),t=((o=(r=s.identity)==null?void 0:r.id)!=null?o:"").toString().toLowerCase();return e.includes("ui")||t.startsWith("ui")||t.includes("label")}function en(s){let e=Oe();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 Er(s){window.location.reload()}function tn(s){let e=JSON.stringify(Oe(),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 Cr(s,e){var t,i,n;if(!(!s.configViewer||!s.container))try{let a=window.getEditableObjectConfig,r=typeof a=="function"?a(e):null;if(!r){let{loadObjectCentricConfig:o,loadObjectConfig:l}=await Promise.resolve().then(()=>(xi(),Us)),p=(((t=(await o("scene.main")).scene)==null?void 0:t.objects)||[]).find(g=>g.object_config===e||g.instance_id===e);if(!p)return;let u=await l(p.object_config);console.log("[PREVIEW] Loaded object config (fallback)",e,u),Qi(s,u),(i=s.configViewer)==null||i.style.setProperty("display","block");return}console.log("[PREVIEW] Loaded object config",e,r),Qi(s,r),(n=s.configViewer)==null||n.style.setProperty("display","block");return}catch(a){console.error("[DEBUG] Failed to load object config:",a)}}function Qi(s,e){var p,u,g,h,f,m,b,y,v,x;if(!s.container)return;let t=s.container.querySelector("#config-pos-x"),i=s.container.querySelector("#config-pos-y"),n=s.container.querySelector("#config-scale"),a=s.container.querySelector("#config-anchor-x"),r=s.container.querySelector("#config-anchor-y"),l=va(e)?(p=e.transform)==null?void 0:p.offset:(u=e.transform)==null?void 0:u.position;t&&(t.value=String((g=l==null?void 0:l.x)!=null?g:0)),i&&(i.value=String((h=l==null?void 0:l.y)!=null?h:0)),n&&(n.value=String((m=(f=e.transform)==null?void 0:f.scale)!=null?m:1));let c=(x=(v=(b=e.transform)==null?void 0:b.anchor)!=null?v:(y=e.render)==null?void 0:y.anchor)!=null?x:{x:.5,y:.5},d=mr()(c);a&&(a.value=String(d.x)),r&&(r.value=String(d.y))}function Ar(s){var l,c,d,p,u,g,h,f,m,b;let e=s.selectedObjectId;if(!e||!s.container)return;let t=(c=(l=s.container.querySelector("#config-pos-x"))==null?void 0:l.value)!=null?c:"0",i=(p=(d=s.container.querySelector("#config-pos-y"))==null?void 0:d.value)!=null?p:"0",n=(g=(u=s.container.querySelector("#config-scale"))==null?void 0:u.value)!=null?g:"1",a=(f=(h=s.container.querySelector("#config-anchor-x"))==null?void 0:h.value)!=null?f:"0.5",r=(b=(m=s.container.querySelector("#config-anchor-y"))==null?void 0:m.value)!=null?b:"0.5",o=`${e}:
1861
1861
  position: (${t}, ${i})
1862
1862
  scale: ${n}
1863
- anchor: (${a}, ${r})`;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 wa(s,e){var p,u,g,h,m,f,b,y,v,S,C;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!s.container)return;let t=s.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=s.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((h=(g=s.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?h:0),a=Number((f=(m=s.container.querySelector("#config-scale"))==null?void 0:m.value)!=null?f:1),r=Number((y=(b=s.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),o=Number((S=(v=s.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:r,anchorY:o});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Ie));l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:r,y:o}},{silent:e==null?void 0:e.silent});let c=Ht(s);va(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let d=window.applyEditableObjectConfig;if(typeof d=="function"){let I=(C=window.getEditableObjectConfig)==null?void 0:C.call(window,t);I?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,I)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Lr(s,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),Ie));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let m=0;m<g.length-1;m++){let f=g[m];h[f]=(u=h[f])!=null?u:{},h=h[f]}h[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),r=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;r&&(o!=null&&o.refresh)&&o.refresh()}function Tr(s){s.selectedObjectId&&(s.objectAutoApplyTimer&&window.clearTimeout(s.objectAutoApplyTimer),s.objectAutoApplyTimer=window.setTimeout(()=>{s.objectAutoApplyTimer=null,wa(s,{silent:!0})},150))}var ml=3e3;function Ve(s,e,t){let i=t!=null?t:s.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,r=0,o=0,l=0,c=0,d=0,p=g=>{if(!n)return;let h=i.getBoundingClientRect();s.style.left=`${g.clientX-h.left-c}px`,s.style.top=`${g.clientY-h.top-d}px`},u=()=>{n&&(n=!1,s.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let m=s.getBoundingClientRect(),f=i.getBoundingClientRect();console.log("[DRAG] Panel:",s.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:m.left,top:m.top,width:m.width,height:m.height}),console.log("[DRAG] containerRect:",{left:f.left,top:f.top,width:f.width,height:f.height}),console.log("[DRAG] mouse:",{x:g.clientX,y:g.clientY}),c=g.clientX-m.left,d=g.clientY-m.top,console.log("[DRAG] offset:",{x:c,y:d});let b=m.left-f.left,y=m.top-f.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),s.style.left=`${b}px`,s.style.top=`${y}px`,s.style.right="auto",s.style.bottom="auto",s.style.zIndex=String(++ml),n=!0,s.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function nn(s,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,r=0,o=0,l=0,c=!1,d=u=>{var y;if(!c)return;let g=u.clientX-o,h=u.clientY-l,m=Math.max(i,a+g),f=Math.max(n,r+h);s.style.width=`${m}px`,(y=s.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(s.style.height=`${f}px`),t==null||t(m,f)},p=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=s.getBoundingClientRect();a=g.width,r=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function xa(s,e){var m,f,b,y;let t=(b=(f=(m=s.container)==null?void 0:m.querySelector("#debug-overlay"))!=null?f:s.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=s.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,r=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>r&&(e.style.width=`${r}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),p),h=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function ct(s){var i,n;if(!s.container)return;let e=s.container.querySelector("#debug-workbench");if(!e)return;if(xa(s,e),(i=s.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),r={activeTab:s.activeTab};if(a)try{r={...JSON.parse(a),activeTab:s.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(r));return}let t={activeTab:s.activeTab,width:e.style.width,height:(n=s.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function an(s){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(s.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=s.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let r=(a=s.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!r?i.style.height=t.height:r&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),xa(s,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function Sa(s,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",xa(s,e),ct(s))}function kr(s){var n,a,r;if(!s.container)return;let e=s.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=s.toggleDebug)==null||o.call(s)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=s.toggleDebug)==null?void 0:o.call(s,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>en(s)),(r=e.querySelector("#debug-export"))==null||r.addEventListener("click",()=>tn(s)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;s.activeTab=l,Ea(s),ct(s)})}),Aa(s,e),Ca(s,e)}function Ea(s){if(!s.container)return;let e=s.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===s.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===s.activeTab)})}function Ca(s,e){le(s,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),le(s,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),le(s,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),le(s,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),le(s,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),le(s,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),le(s,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),le(s,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),le(s,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=Oe();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),r=Oe();r.layout&&(r.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Pr(s){if(!s.container||!s.debugOverlay)return;let e=s.container.querySelector("#debug-workbench"),t=s.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Ve(e,t,s.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{ct(s),Sa(s,e)},10)}));let i=s.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),Ve(i,n,s.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{Sa(s,i)},10)})),i&&a&&nn(i,a);let r=s.container.querySelector('[data-panel="scene-tools-corner"]'),o=r==null?void 0:r.querySelector("[data-panel-handle]");r&&o&&Ve(r,o,s.debugOverlay);let l=s.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ve(l,c,s.debugOverlay),an(s)}function Aa(s,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function le(s,e,t,i,n){let a=e.querySelector(`#${t}`),r=e.querySelector(n);if(!a||!r)return;let o=xr(Oe(),i);typeof o=="number"&&(a.value=String(o),r.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);r.textContent=String(l),Sr(Oe(),i,l)})}K();var sn=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{let t=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:t})})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=Pe(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let p=d.objectId||"Engine";a[p]||(a[p]=[]),a[p].push(d)}let r=localStorage.getItem("handler_last_applied"),o=r?new Date(parseInt(r)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1863
+ anchor: (${a}, ${r})`;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 wa(s,e){var p,u,g,h,f,m,b,y,v,x,L;if(console.log("[INSPECTOR] \u{1F527} applyObjectConfig called"),!s.container)return;let t=s.selectedObjectId;if(!t){console.warn("[PREVIEW] Apply object config clicked with no selection");return}let i=Number((u=(p=s.container.querySelector("#config-pos-x"))==null?void 0:p.value)!=null?u:0),n=Number((h=(g=s.container.querySelector("#config-pos-y"))==null?void 0:g.value)!=null?h:0),a=Number((m=(f=s.container.querySelector("#config-scale"))==null?void 0:f.value)!=null?m:1),r=Number((y=(b=s.container.querySelector("#config-anchor-x"))==null?void 0:b.value)!=null?y:.5),o=Number((x=(v=s.container.querySelector("#config-anchor-y"))==null?void 0:v.value)!=null?x:.5);console.log("[INSPECTOR] Applying config for:",t,{posX:i,posY:n,scale:a,anchorX:r,anchorY:o});let{applyConfigOverride:l}=await Promise.resolve().then(()=>(K(),Ie));l({objectId:t,path:"transform.position",value:{x:i,y:n}},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.scale",value:a},{silent:e==null?void 0:e.silent}),l({objectId:t,path:"transform.anchor",value:{x:r,y:o}},{silent:e==null?void 0:e.silent});let c=Ht(s);va(c)&&l({objectId:t,path:"transform.offset",value:{x:i,y:n}},{silent:!0}),console.log("[INSPECTOR] Calling applyEditableObjectConfig...");let d=window.applyEditableObjectConfig;if(typeof d=="function"){let P=(L=window.getEditableObjectConfig)==null?void 0:L.call(window,t);P?(console.log("[INSPECTOR] \u2705 Calling applyEditableObjectConfig for:",t),d(t,P)):console.warn("[INSPECTOR] \u26A0\uFE0F No config found for:",t)}else console.warn("[INSPECTOR] \u26A0\uFE0F applyEditableObjectConfig not available")}async function Lr(s,e,t){let{applyConfigOverride:i}=await Promise.resolve().then(()=>(K(),Ie));Object.entries(e.assets).forEach(([l,c])=>{i({path:`assets.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.theme).forEach(([l,c])=>{i({path:`runtime.theme.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.ui).forEach(([l,c])=>{i({path:`runtime.ui.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.fonts).forEach(([l,c])=>{i({path:`runtime.fonts.${l}`,value:c},{silent:!0})}),Object.entries(e.runtime.audio).forEach(([l,c])=>{i({path:`runtime.audio.${l}`,value:c},{silent:!0})});let n=window.applyEditableEngineConfig;if(typeof n=="function"){let l={theme:e.runtime.theme,fonts:e.runtime.fonts,audio:e.runtime.audio},c={};Object.entries(e.runtime.ui).forEach(([d,p])=>{var u;if(d)if(d.includes(".")){let g=d.split("."),h=c;for(let f=0;f<g.length-1;f++){let m=g[f];h[m]=(u=h[m])!=null?u:{},h=h[m]}h[g[g.length-1]]=p}else c[d]=p}),l.ui=c,n({runtime:l,assets:e.assets})}let a=Object.values(e.assets).some(l=>/^(blob:|data:)/.test(l)),r=(t==null?void 0:t.source)!=="auto"&&!a,o=window.__previewShell;r&&(o!=null&&o.refresh)&&o.refresh()}function Tr(s){s.selectedObjectId&&(s.objectAutoApplyTimer&&window.clearTimeout(s.objectAutoApplyTimer),s.objectAutoApplyTimer=window.setTimeout(()=>{s.objectAutoApplyTimer=null,wa(s,{silent:!0})},150))}var fl=3e3;function Ve(s,e,t){let i=t!=null?t:s.offsetParent;if(!i)return;e.style.cursor="move";let n=!1,a=0,r=0,o=0,l=0,c=0,d=0,p=g=>{if(!n)return;let h=i.getBoundingClientRect();s.style.left=`${g.clientX-h.left-c}px`,s.style.top=`${g.clientY-h.top-d}px`},u=()=>{n&&(n=!1,s.classList.remove("dragging"),window.removeEventListener("pointermove",p),window.removeEventListener("pointerup",u))};e.addEventListener("pointerdown",g=>{if(g.button!==0)return;let h=g.target;if(h!=null&&h.closest("button, input, select, textarea"))return;g.preventDefault();let f=s.getBoundingClientRect(),m=i.getBoundingClientRect();console.log("[DRAG] Panel:",s.className),console.log("[DRAG] Container:",i.className),console.log("[DRAG] panelRect:",{left:f.left,top:f.top,width:f.width,height:f.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-f.left,d=g.clientY-f.top,console.log("[DRAG] offset:",{x:c,y:d});let b=f.left-m.left,y=f.top-m.top;console.log("[DRAG] targetPosition:",{left:b,top:y}),s.style.left=`${b}px`,s.style.top=`${y}px`,s.style.right="auto",s.style.bottom="auto",s.style.zIndex=String(++fl),n=!0,s.classList.add("dragging"),window.addEventListener("pointermove",p),window.addEventListener("pointerup",u)})}function nn(s,e,t,i=280,n=200){e.style.cursor="nwse-resize";let a=0,r=0,o=0,l=0,c=!1,d=u=>{var y;if(!c)return;let g=u.clientX-o,h=u.clientY-l,f=Math.max(i,a+g),m=Math.max(n,r+h);s.style.width=`${f}px`,(y=s.closest(".preview-shell"))!=null&&y.classList.contains("layout-fixed")||(s.style.height=`${m}px`),t==null||t(f,m)},p=()=>{c&&(c=!1,window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",p))};e.addEventListener("pointerdown",u=>{if(u.button!==0)return;u.preventDefault(),u.stopPropagation();let g=s.getBoundingClientRect();a=g.width,r=g.height,o=u.clientX,l=u.clientY,c=!0,window.addEventListener("pointermove",d),window.addEventListener("pointerup",p)})}function xa(s,e){var f,m,b,y;let t=(b=(m=(f=s.container)==null?void 0:f.querySelector("#debug-overlay"))!=null?m:s.debugOverlay)!=null?b:e.offsetParent;if(!t||(y=s.container)!=null&&y.classList.contains("layout-fixed"))return;let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),a=12,r=Math.max(250,Math.floor(i.width-a*2)),o=Math.max(200,Math.floor(i.height-a*2));n.width>r&&(e.style.width=`${r}px`),n.height>o&&(e.style.height=`${o}px`);let l=e.getBoundingClientRect(),c=l.left-i.left,d=l.top-i.top,p=Math.max(a,i.width-l.width-a),u=Math.max(a,i.height-l.height-a),g=Math.min(Math.max(c,a),p),h=Math.min(Math.max(d,a),u);e.style.left=`${Math.round(g)}px`,e.style.top=`${Math.round(h)}px`,e.style.right="auto",e.style.bottom="auto"}function ct(s){var i,n;if(!s.container)return;let e=s.container.querySelector("#debug-workbench");if(!e)return;if(xa(s,e),(i=s.container)!=null&&i.classList.contains("layout-fixed")){let a=localStorage.getItem("preview_workbench_state"),r={activeTab:s.activeTab};if(a)try{r={...JSON.parse(a),activeTab:s.activeTab}}catch{}localStorage.setItem("preview_workbench_state",JSON.stringify(r));return}let t={activeTab:s.activeTab,width:e.style.width,height:(n=s.container)!=null&&n.classList.contains("layout-fixed")?"":e.style.height,left:e.style.left,top:e.style.top};localStorage.setItem("preview_workbench_state",JSON.stringify(t))}function an(s){try{let e=localStorage.getItem("preview_workbench_state");if(!e)return;let t=JSON.parse(e);t.activeTab&&(s.activeTab=t.activeTab),window.requestAnimationFrame(()=>{var n,a;let i=(n=s.container)==null?void 0:n.querySelector("#debug-workbench");if(i){let r=(a=s.container)==null?void 0:a.classList.contains("layout-fixed");t.width&&(i.style.width=t.width),t.height&&!r?i.style.height=t.height:r&&(i.style.height=""),t.left&&(i.style.left=t.left,i.style.right="auto"),t.top&&(i.style.top=t.top,i.style.bottom="auto"),xa(s,i)}})}catch(e){console.warn("[PREVIEW] Failed to load workbench state",e)}}function Sa(s,e){let t=e.getBoundingClientRect();(t.left<0||t.top<0||t.right>window.innerWidth||t.bottom>window.innerHeight)&&(console.warn("[Workbench] Workbench positioned outside viewport, repositioning..."),e.style.left="16px",e.style.top="72px",e.style.right="auto",e.style.bottom="auto",xa(s,e),ct(s))}function kr(s){var n,a,r;if(!s.container)return;let e=s.container,t=e.querySelector("#debug-toggle");t||console.warn("[PREVIEW] Debug toggle not found in DOM"),t==null||t.addEventListener("click",()=>{var o;console.log("[PREVIEW] Debug toggle clicked"),(o=s.toggleDebug)==null||o.call(s)}),(n=e.querySelector("#debug-close"))==null||n.addEventListener("click",()=>{var o;return(o=s.toggleDebug)==null?void 0:o.call(s,!1)}),(a=e.querySelector("#debug-reset"))==null||a.addEventListener("click",()=>en(s)),(r=e.querySelector("#debug-export"))==null||r.addEventListener("click",()=>tn(s)),e.querySelectorAll(".workbench-tab").forEach(o=>{o.addEventListener("click",()=>{let l=o.dataset.tab;s.activeTab=l,Ea(s),ct(s)})}),Aa(s,e),Ca(s,e)}function Ea(s){if(!s.container)return;let e=s.container;e.querySelectorAll(".workbench-tab").forEach(n=>{let a=n.dataset.tab;n.classList.toggle("active",a===s.activeTab)}),e.querySelectorAll(".workbench-tab-panel").forEach(n=>{let a=n.dataset.tabPanel;n.classList.toggle("active",a===s.activeTab)})}function Ca(s,e){ce(s,e,"debug-layout-scale","layout.scale_multiplier","#debug-layout-scale-value"),ce(s,e,"debug-layout-offset-x","layout.position_offset.x","#debug-layout-offset-x-value"),ce(s,e,"debug-layout-offset-y","layout.position_offset.y","#debug-layout-offset-y-value"),ce(s,e,"debug-rect-thickness","layout.debug_rect_thickness","#debug-rect-thickness-value"),ce(s,e,"debug-engine-scale","engine.scale","#debug-engine-scale-value"),ce(s,e,"debug-background-scale","engine.background_scale","#debug-background-scale-value"),ce(s,e,"debug-label-pulse-speed","engine.label_pulse_speed","#debug-label-pulse-speed-value"),ce(s,e,"debug-label-pulse-intensity","engine.label_pulse_intensity","#debug-label-pulse-intensity-value"),ce(s,e,"debug-rope-length","physics.rope_length","#debug-rope-length-value");let t=e.querySelector("#debug-rect-visible");t==null||t.addEventListener("change",()=>{let n=Oe();n.layout&&(n.layout.debug_rect_visible=!!t.checked)});let i=e.querySelector("#debug-rect-color");i==null||i.addEventListener("input",()=>{let n=i.value.replace("#",""),a=parseInt(n,16),r=Oe();r.layout&&(r.layout.debug_rect_color=Number.isFinite(a)?a:16711680)})}function Pr(s){if(!s.container||!s.debugOverlay)return;let e=s.container.querySelector("#debug-workbench"),t=s.container.querySelector("#workbench-handle");e&&t&&(!e.style.left&&!e.style.right&&!e.style.top&&!e.style.bottom&&(e.style.right="16px",e.style.top="72px"),Ve(e,t,s.debugOverlay),t.addEventListener("pointerup",()=>{setTimeout(()=>{ct(s),Sa(s,e)},10)}));let i=s.container.querySelector('[data-panel="scene-objects"]'),n=i==null?void 0:i.querySelector("[data-panel-handle]"),a=i==null?void 0:i.querySelector("[data-panel-resize-v]");i&&n&&(!i.style.left&&!i.style.right&&!i.style.top&&!i.style.bottom&&(i.style.left="16px",i.style.top="72px"),Ve(i,n,s.debugOverlay),n.addEventListener("pointerup",()=>{setTimeout(()=>{Sa(s,i)},10)})),i&&a&&nn(i,a);let r=s.container.querySelector('[data-panel="scene-tools-corner"]'),o=r==null?void 0:r.querySelector("[data-panel-handle]");r&&o&&Ve(r,o,s.debugOverlay);let l=s.container.querySelector('[data-panel="nudge-panel"]'),c=l==null?void 0:l.querySelector("[data-panel-handle]");l&&c&&Ve(l,c,s.debugOverlay),an(s)}function Aa(s,e){Array.from(e.querySelectorAll("[data-panel-toggle]")).forEach(i=>{i.addEventListener("click",()=>{let n=i.closest(".scene-panel");n&&n.classList.toggle("collapsed")})})}function ce(s,e,t,i,n){let a=e.querySelector(`#${t}`),r=e.querySelector(n);if(!a||!r)return;let o=xr(Oe(),i);typeof o=="number"&&(a.value=String(o),r.textContent=String(o)),a.addEventListener("input",()=>{let l=Number(a.value);r.textContent=String(l),Sr(Oe(),i,l)})}K();var sn=class{constructor(){this.container=null;this.currentVersion=null;this.availableVersions=[];this.isDevelopmentMode=!1}async forceResyncAfterApply(){var e;try{let t=window.__HANDLER_ACTIVE_SCREEN;await fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:t})})}catch(t){console.warn("[ConfigPersistence] sync-screens failed:",t)}try{let t=window.__HANDLER_REFRESH_SCREEN_INDEX;typeof t=="function"?await t():window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}try{(e=window.refreshEditableConfigIndex)==null||e.call(window)}catch{}try{window.dispatchEvent(new CustomEvent("handler:scene-objects-refresh")),window.dispatchEvent(new CustomEvent("inspector:refresh")),window.dispatchEvent(new CustomEvent("config:changed",{detail:{action:"batch"}}))}catch{}}async initialize(e){this.container=e,this.isDevelopmentMode=typeof window!="undefined"&&document.querySelector('script[type="module"][src*="/@vite/"]')!==null,await this.loadVersionsList(),window.addEventListener("config:changed",()=>{this.refreshPanel()}),this.refreshPanel()}render(){let e=Pe(),{hasChanges:t,overrideCount:i,overrides:n}=e,a={};for(let d of n){let p=d.objectId||"Engine";a[p]||(a[p]=[]),a[p].push(d)}let r=localStorage.getItem("handler_last_applied"),o=r?new Date(parseInt(r)).toLocaleString():"Never",l=this.currentVersion?`Version: ${this.currentVersion} (Active)`:"Original",c=this.currentVersion?`Versioned (${this.currentVersion})`:"Global";return`
1864
1864
  <div class="config-persistence-panel">
1865
1865
  <!-- Status Footer (Always Visible) -->
1866
1866
  <div class="persistence-status-footer">
@@ -2024,17 +2024,17 @@ This will delete generated config JSON files in configs/objects that are not ref
2024
2024
 
2025
2025
  It will NOT touch library/base configs.
2026
2026
 
2027
- Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let m=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,f=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${m} configs, ${f} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!Pe().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
2027
+ Continue?`))try{e.textContent="\u23F3 Pruning...",e.setAttribute("disabled","true");let g=await fetch("/api/objects/prune-unused",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:!1})}),h=await g.json().catch(()=>({}));if(!g.ok||(h==null?void 0:h.success)===!1)throw new Error((h==null?void 0:h.error)||"Prune failed");await this.forceResyncAfterApply();let f=Array.isArray(h.deletedFiles)?h.deletedFiles.length:0,m=Array.isArray(h.removedAssetSlots)?h.removedAssetSlots.length:0;this.showSuccessNotification(`Pruned ${f} configs, ${m} asset slots`),this.refreshPanel()}catch(g){console.error("[ConfigPersistence] Prune unused failed:",g),alert(`\u274C Prune failed: ${g.message}`)}finally{e.textContent="\u{1F9F9} PRUNE UNUSED OBJECT CONFIGS",e.removeAttribute("disabled")}});let t=this.container.querySelector("#create-version-btn");t==null||t.addEventListener("click",async()=>{var h;if(t.getAttribute("disabled")!==null)return;if(!Pe().hasChanges){alert("No changes to save. Make some edits first.");return}if(confirm(`Save As New Version?
2028
2028
 
2029
2029
  This will:
2030
2030
  \u2022 Create a new version snapshot
2031
2031
  \u2022 Include all current changes
2032
2032
  \u2022 Clear staged overrides after save
2033
- \u2022 Set the new version as active`))try{let m=localStorage.getItem("handler_last_version_name")||"",b=((h=prompt("Version name (e.g. v1.2.0, test_2024):",m))!=null?h:"").trim();if(!b){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",b),t.textContent="\u23F3 Creating version...",t.setAttribute("disabled","true"),await mi(b),ae(),await this.forceResyncAfterApply(),this.showSuccessNotification("Version created and set as active"),await this.loadVersionsList(),this.refreshPanel()}catch(m){console.error("[ConfigPersistence] Create version failed:",m),alert(`\u274C Failed to create version: ${m.message}`),t.textContent="\u{1F4DD} SAVE AS NEW VERSION",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-current-btn");i==null||i.addEventListener("click",async()=>{if(i.getAttribute("disabled")!==null)return;let u=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
2033
+ \u2022 Set the new version as active`))try{let f=localStorage.getItem("handler_last_version_name")||"",b=((h=prompt("Version name (e.g. v1.2.0, test_2024):",f))!=null?h:"").trim();if(!b){alert("Version name is required.");return}localStorage.setItem("handler_last_version_name",b),t.textContent="\u23F3 Creating version...",t.setAttribute("disabled","true"),await fi(b),se(),await this.forceResyncAfterApply(),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}`),t.textContent="\u{1F4DD} SAVE AS NEW VERSION",t.removeAttribute("disabled")}});let i=this.container.querySelector("#apply-current-btn");i==null||i.addEventListener("click",async()=>{if(i.getAttribute("disabled")!==null)return;let u=this.currentVersion?`version "${this.currentVersion}"`:"Original configs";if(confirm(`Apply to Current Source?
2034
2034
 
2035
2035
  This will write all staged changes to ${u}.
2036
2036
 
2037
- After applying, staged overrides will be cleared.`))try{i.textContent="\u23F3 Applying...",i.setAttribute("disabled","true");let h=Be(),m={};for(let[y,v]of Object.entries(h.objects)){let S=v,C=y;/^(json\.|ui\.|effects\.|engine\.)/.test(C)||(C=`json.${y}`),S&&typeof S=="object"&&(S.identity||(S.identity={}),S.identity.id=C),m[`objects/${C}.json`]=S}h.engine&&(h.engine.runtime&&(m["engine/engine.runtime.json"]=h.engine.runtime),h.engine.assets&&(m["engine/engine.assets.json"]=h.engine.assets),h.engine.splash&&(m["engine/engine.splash.json"]=h.engine.splash),h.engine.loading&&(m["engine/engine.loading.json"]=h.engine.loading),h.engine.start&&(m["engine/engine.start.json"]=h.engine.start),h.engine.tutorial&&(m["engine/engine.tutorial.json"]=h.engine.tutorial),h.engine.endgame&&(m["engine/engine.endgame.json"]=h.engine.endgame),!h.engine.runtime&&!h.engine.assets&&(m["engine/engine.json"]=h.engine));for(let[y,v]of Object.entries(h.scenes)){let S=y.startsWith("scene.")?y:`scene.${y}`;m[`scenes/${S}.json`]=v}let f=this.currentVersion?"/api/apply-current":"/api/apply-direct",b=await fetch(f,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:m,assets:{},hadCacheAtApply:!0})});if(!b.ok){let y=await b.json();throw new Error(y.error||"Apply to current source failed")}ae(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(h){console.error("[ConfigPersistence] Apply current failed:",h),alert(`\u274C Apply to current source failed: ${h.message}`),i.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",i.removeAttribute("disabled")}});let n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
2037
+ After applying, staged overrides will be cleared.`))try{i.textContent="\u23F3 Applying...",i.setAttribute("disabled","true");let h=Be(),f={};for(let[y,v]of Object.entries(h.objects)){let x=v,L=y;/^(json\.|ui\.|effects\.|engine\.)/.test(L)||(L=`json.${y}`),x&&typeof x=="object"&&(x.identity||(x.identity={}),x.identity.id=L),f[`objects/${L}.json`]=x}h.engine&&(h.engine.runtime&&(f["engine/engine.runtime.json"]=h.engine.runtime),h.engine.assets&&(f["engine/engine.assets.json"]=h.engine.assets),h.engine.splash&&(f["engine/engine.splash.json"]=h.engine.splash),h.engine.loading&&(f["engine/engine.loading.json"]=h.engine.loading),h.engine.start&&(f["engine/engine.start.json"]=h.engine.start),h.engine.tutorial&&(f["engine/engine.tutorial.json"]=h.engine.tutorial),h.engine.endgame&&(f["engine/engine.endgame.json"]=h.engine.endgame),!h.engine.runtime&&!h.engine.assets&&(f["engine/engine.json"]=h.engine));for(let[y,v]of Object.entries(h.scenes)){let x=y.startsWith("scene.")?y:`scene.${y}`;f[`scenes/${x}.json`]=v}let m=this.currentVersion?"/api/apply-current":"/api/apply-direct",b=await fetch(m,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:f,assets:{},hadCacheAtApply:!0})});if(!b.ok){let y=await b.json();throw new Error(y.error||"Apply to current source failed")}se(),this.showSuccessNotification("Applied to current source"),await this.loadVersionsList(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(h){console.error("[ConfigPersistence] Apply current failed:",h),alert(`\u274C Apply to current source failed: ${h.message}`),i.textContent="\u{1F4BE} APPLY TO CURRENT SOURCE",i.removeAttribute("disabled")}});let n=this.container.querySelector("#apply-base-btn");n==null||n.addEventListener("click",async()=>{if(confirm(`\u26A0\uFE0F DANGER: APPLY TO BASE
2038
2038
 
2039
2039
  This will DIRECTLY MODIFY base configuration files.
2040
2040
 
@@ -2044,7 +2044,7 @@ This is ONLY for active development.
2044
2044
 
2045
2045
  Make sure your project is under Git version control.
2046
2046
 
2047
- Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Be(),h={};for(let[f,b]of Object.entries(g.objects)){let y=b,v=f;/^(json\.|ui\.|effects\.|engine\.)/.test(v)||(v=`json.${f}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=v),h[`objects/${v}.json`]=y}g.engine&&(g.engine.runtime&&(h["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(h["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(h["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(h["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(h["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(h["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(h["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(h["engine/engine.json"]=g.engine));for(let[f,b]of Object.entries(g.scenes)){let y=f.startsWith("scene.")?f:`scene.${f}`;h[`scenes/${y}.json`]=b}let m=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{}})});if(!m.ok){let f=await m.json();throw new Error(f.error||"Apply to base failed")}ae(),this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async u=>{let h=u.target.value;await this.switchVersion(h)}),this.container.querySelectorAll(".item-remove").forEach(u=>{u.addEventListener("click",()=>{let g=u.dataset.removePath,h=u.dataset.removeId;Mt(h||void 0,g)})});let o=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(ae(),jt(),this.refreshPanel())};o==null||o.addEventListener("click",c),l==null||l.addEventListener("click",c);let d=this.container.querySelector("#reset-to-applied-btn");d==null||d.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&jt()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await fi()})}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=`
2047
+ Continue?`))try{n.textContent="\u23F3 Writing to base...",n.setAttribute("disabled","true");let g=Be(),h={};for(let[m,b]of Object.entries(g.objects)){let y=b,v=m;/^(json\.|ui\.|effects\.|engine\.)/.test(v)||(v=`json.${m}`),y&&typeof y=="object"&&(y.identity||(y.identity={}),y.identity.id=v),h[`objects/${v}.json`]=y}g.engine&&(g.engine.runtime&&(h["engine/engine.runtime.json"]=g.engine.runtime),g.engine.assets&&(h["engine/engine.assets.json"]=g.engine.assets),g.engine.splash&&(h["engine/engine.splash.json"]=g.engine.splash),g.engine.loading&&(h["engine/engine.loading.json"]=g.engine.loading),g.engine.start&&(h["engine/engine.start.json"]=g.engine.start),g.engine.tutorial&&(h["engine/engine.tutorial.json"]=g.engine.tutorial),g.engine.endgame&&(h["engine/engine.endgame.json"]=g.engine.endgame),!g.engine.runtime&&!g.engine.assets&&(h["engine/engine.json"]=g.engine));for(let[m,b]of Object.entries(g.scenes)){let y=m.startsWith("scene.")?m:`scene.${m}`;h[`scenes/${y}.json`]=b}let f=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:h,assets:{}})});if(!f.ok){let m=await f.json();throw new Error(m.error||"Apply to base failed")}se(),this.showSuccessNotification(),this.refreshPanel(),await this.forceResyncAfterApply()}catch(g){console.error("[ConfigPersistence] Apply to base failed:",g),alert(`\u274C Apply to base failed: ${g.message}`),n.textContent="\u{1F527} APPLY TO BASE (No Version)",n.removeAttribute("disabled")}});let a=this.container.querySelector("#version-selector");a==null||a.addEventListener("change",async u=>{let h=u.target.value;await this.switchVersion(h)}),this.container.querySelectorAll(".item-remove").forEach(u=>{u.addEventListener("click",()=>{let g=u.dataset.removePath,h=u.dataset.removeId;Mt(h||void 0,g)})});let o=this.container.querySelector("#clear-all-overrides"),l=this.container.querySelector("#discard-all-overrides-btn"),c=()=>{confirm("Discard all staged changes? This will clear all overrides and reload from current Source.")&&(se(),jt(),this.refreshPanel())};o==null||o.addEventListener("click",c),l==null||l.addEventListener("click",c);let d=this.container.querySelector("#reset-to-applied-btn");d==null||d.addEventListener("click",()=>{confirm("Discard changes and reload last applied state?")&&jt()});let p=this.container.querySelector("#reset-to-original-btn");p==null||p.addEventListener("click",async()=>{await mi()})}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=`
2048
2048
  <div class="notify-icon">\u2705</div>
2049
2049
  <div class="notify-content">
2050
2050
  <strong>${i}</strong>
@@ -2056,13 +2056,13 @@ You have ${t.overrideCount} staged changes that will be discarded.
2056
2056
 
2057
2057
  Options:
2058
2058
  OK = Discard staged overrides and switch
2059
- 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")}ae(),localStorage.removeItem("handler_config_overrides"),localStorage.setItem("handler_preview_override_mode","false"),window.location.reload()}catch(o){alert(`\u274C Failed to switch version: ${o.message}`);let l=(r=this.container)==null?void 0:r.querySelector("#version-selector");l&&(l.value=this.currentVersion||"")}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
2059
+ 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")}se(),localStorage.removeItem("handler_config_overrides"),localStorage.setItem("handler_preview_override_mode","false"),window.location.reload()}catch(o){alert(`\u274C Failed to switch version: ${o.message}`);let l=(r=this.container)==null?void 0:r.querySelector("#version-selector");l&&(l.value=this.currentVersion||"")}}async directApply(){if(!this.isDevelopmentMode){alert("Direct Apply is only available in development mode.");return}if(confirm(`\u26A0\uFE0F WARNING: Direct Apply
2060
2060
 
2061
2061
  This will DIRECTLY MODIFY your base configuration files WITHOUT creating a snapshot.
2062
2062
 
2063
2063
  This cannot be undone unless you have git commits or backups.
2064
2064
 
2065
- Are you absolutely sure?`))try{let t=Be(),i={};for(let[a,r]of Object.entries(t.objects)){let o=r,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[a,r]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=r}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Direct apply failed")}ae(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Ft=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 Ti;this.sceneToolsPanel=new ki;this.nudgePanel=new Pi;this.inspectorPanel=new Gi;this.libraryPanel=new zt;this.libraryPanelDocked=new zt;this.brandVisionPanel=new Yi;this.customizeSettingsPanel=new Ki;this.configPersistencePanel=new sn;this.loadingScreenPanel=new Xi}applyAssetChange(e,t){return cr(this,e,t)}resetAsset(e){return dr(this,e)}applySlotAsset(e,t,i){return Vi(this,e,t,i)}resetSlotAsset(e,t,i){return pr(this,e,t,i)}startObjectVisuals(){return vr(this)}stopObjectVisuals(){return wr(this)}shouldRunObjectVisuals(){return Ji(this)}updateObjectVisuals(){return Zi(this)}getSelectedInstanceId(){return ca(this)}getDisplayObjectById(e){return da(this,e)}getSelectedObjectConfig(){return Ht(this)}getConfigAnchorWorldPoint(e){return pa(this,e)}getScreenSize(){return ua(this)}ensureBoundsGfx(){return ga(this)}ensureAnchorGfx(){return ha(this)}drawBounds(e){return ma(this,e)}drawAnchor(e){return fa(this,e)}clearBounds(){return ba(this)}clearAnchor(){return ya(this)}clearObjectVisuals(){return Dt(this)}updateObjectInfo(e){return $t(this,e)}resetDebugConfig(){return en(this)}applyDebugConfig(){return Er(this)}exportDebugConfig(){return tn(this)}loadObjectConfig(e){return Cr(this,e)}fillConfigViewer(e){return Qi(this,e)}copyConfigValues(){return Ar(this)}applyObjectConfig(e){return wa(this,e)}applyCustomizeSettings(e,t){return Lr(this,e,t)}scheduleObjectAutoApply(){return Tr(this)}setupDebugEventListeners(){return kr(this)}setupDebugInputListeners(e){return Ca(this,e)}setupPanelLayout(){return Pr(this)}setupCollapsiblePanels(e){return Aa(this,e)}setupRangeInput(e,t,i,n){return le(this,e,t,i,n)}updateWorkbenchTabs(){return Ea(this)}saveWorkbenchState(){return ct(this)}loadWorkbenchState(){return an(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let a=localStorage.getItem("preview_workbench_state");if(a){let r=JSON.parse(a);r.activeTab&&(this.activeTab=r.activeTab)}}catch(a){console.warn("[PREVIEW] Failed to load workbench tab state",a)}this.sceneObjectsPanel.initialize(e,{onSelect:a=>this.handleObjectSelect(a)}),this.libraryPanel.initialize(e,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,r,o)=>{console.log("[Inspector] Property changed:",a,r,o)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,r)=>this.applyCustomizeSettings(a,r)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:a=>{this.highlightObject=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:a=>{this.highlightAnchor=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(a,r)=>this.nudgeSelectedObject(a,r),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,r)=>{var g,h,m,f,b,y;if(!this.selectedObjectId)return;let o=this.getSelectedObjectConfig();if(!o)return;let l=(g=o.transform)==null?void 0:g.position,c=((h=l==null?void 0:l.x)!=null?h:0)+a,d=((m=l==null?void 0:l.y)!=null?m:0)+r,{applyConfigOverride:p}=await Promise.resolve().then(()=>(K(),Ie));p({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:d}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let v=window.__editableConfig,S=(y=(b=(f=v==null?void 0:v.objects)==null?void 0:f.get)==null?void 0:b.call(f,this.selectedObjectId))!=null?y:o;await u(this.selectedObjectId,S)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var p,u,g,h,m;if(!this.selectedObjectId)return;let r=this.getSelectedObjectConfig();if(!r)return;let o=(u=(p=r.transform)==null?void 0:p.scale)!=null?u:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await Promise.resolve().then(()=>(K(),Ie));c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let f=window.__editableConfig,b=(m=(h=(g=f==null?void 0:f.objects)==null?void 0:g.get)==null?void 0:h.call(g,this.selectedObjectId))!=null?m:r;await d(this.selectedObjectId,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 r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({loading:a}),typeof r.__previewUpdateLoading=="function"?r.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,r,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,r,o,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var r,o;((r=a.detail)==null?void 0:r.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,r,o)=>this.applySlotAsset(a,r,o),window.refreshAssetLibrary=()=>Promise.all([this.libraryPanel.refresh(),this.libraryPanelDocked.refresh()]),window.reRenderAssetLibrary=()=>{this.libraryPanel.reRender(),this.libraryPanelDocked.reRender()},window.getEngineSplashConfig=()=>{var r;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((r=o==null?void 0:o.engine)==null?void 0:r.splash)||null}return null},window.addAssetToRegistry=(a,r)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(d=>d.filename===r))){let d=r.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:r,displayName:d}),console.log(`[DEBUG] Added ${r} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,r)=>{this.libraryPanel.highlightSlot(a,r),this.libraryPanelDocked.highlightSlot(a,r)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
2065
+ Are you absolutely sure?`))try{let t=Be(),i={};for(let[a,r]of Object.entries(t.objects)){let o=r,l=a;/^(json\.|ui\.|effects\.|engine\.)/.test(l)||(l=`json.${a}`),o&&typeof o=="object"&&(o.identity||(o.identity={}),o.identity.id=l),i[`objects/${l}.json`]=o}t.engine&&(t.engine.runtime&&(i["engine/engine.runtime.json"]=t.engine.runtime),t.engine.assets&&(i["engine/engine.assets.json"]=t.engine.assets),t.engine.splash&&(i["engine/engine.splash.json"]=t.engine.splash),t.engine.loading&&(i["engine/engine.loading.json"]=t.engine.loading),t.engine.start&&(i["engine/engine.start.json"]=t.engine.start),t.engine.tutorial&&(i["engine/engine.tutorial.json"]=t.engine.tutorial),t.engine.endgame&&(i["engine/engine.endgame.json"]=t.engine.endgame),!t.engine.runtime&&!t.engine.assets&&(i["engine/engine.json"]=t.engine));for(let[a,r]of Object.entries(t.scenes)){let o=a.startsWith("scene.")?a:`scene.${a}`;i[`scenes/${o}.json`]=r}let n=await fetch("/api/apply-direct",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:i,assets:{}})});if(!n.ok){let a=await n.json();throw new Error(a.error||"Direct apply failed")}se(),this.showSuccessNotification(),this.refreshPanel()}catch(t){console.error("[ConfigPersistence] Direct apply failed:",t),alert(`\u274C Direct apply failed: ${t.message}`)}}};var Ft=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 Ti;this.sceneToolsPanel=new ki;this.nudgePanel=new Pi;this.inspectorPanel=new Gi;this.libraryPanel=new zt;this.libraryPanelDocked=new zt;this.brandVisionPanel=new Yi;this.customizeSettingsPanel=new Ki;this.configPersistencePanel=new sn;this.loadingScreenPanel=new Xi}applyAssetChange(e,t){return cr(this,e,t)}resetAsset(e){return dr(this,e)}applySlotAsset(e,t,i){return Vi(this,e,t,i)}resetSlotAsset(e,t,i){return pr(this,e,t,i)}startObjectVisuals(){return vr(this)}stopObjectVisuals(){return wr(this)}shouldRunObjectVisuals(){return Ji(this)}updateObjectVisuals(){return Zi(this)}getSelectedInstanceId(){return ca(this)}getDisplayObjectById(e){return da(this,e)}getSelectedObjectConfig(){return Ht(this)}getConfigAnchorWorldPoint(e){return pa(this,e)}getScreenSize(){return ua(this)}ensureBoundsGfx(){return ga(this)}ensureAnchorGfx(){return ha(this)}drawBounds(e){return fa(this,e)}drawAnchor(e){return ma(this,e)}clearBounds(){return ba(this)}clearAnchor(){return ya(this)}clearObjectVisuals(){return Dt(this)}updateObjectInfo(e){return $t(this,e)}resetDebugConfig(){return en(this)}applyDebugConfig(){return Er(this)}exportDebugConfig(){return tn(this)}loadObjectConfig(e){return Cr(this,e)}fillConfigViewer(e){return Qi(this,e)}copyConfigValues(){return Ar(this)}applyObjectConfig(e){return wa(this,e)}applyCustomizeSettings(e,t){return Lr(this,e,t)}scheduleObjectAutoApply(){return Tr(this)}setupDebugEventListeners(){return kr(this)}setupDebugInputListeners(e){return Ca(this,e)}setupPanelLayout(){return Pr(this)}setupCollapsiblePanels(e){return Aa(this,e)}setupRangeInput(e,t,i,n){return ce(this,e,t,i,n)}updateWorkbenchTabs(){return Ea(this)}saveWorkbenchState(){return ct(this)}loadWorkbenchState(){return an(this)}initialize(e){var n;this.container=e,this.debugOverlay=e.querySelector(".debug-overlay"),this.configViewer=e.querySelector("#config-viewer");try{let a=localStorage.getItem("preview_workbench_state");if(a){let r=JSON.parse(a);r.activeTab&&(this.activeTab=r.activeTab)}}catch(a){console.warn("[PREVIEW] Failed to load workbench tab state",a)}this.sceneObjectsPanel.initialize(e,{onSelect:a=>this.handleObjectSelect(a)}),this.libraryPanel.initialize(e,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)});let t=e.querySelector("#dock-library-content");t&&(t.innerHTML=this.libraryPanelDocked.render(),this.libraryPanelDocked.initialize(t,{onApply:(a,r,o)=>this.applySlotAsset(a,r,o),onReset:(a,r,o)=>this.resetSlotAsset(a,r,o)})),this.inspectorPanel.initialize(e,{onPropertyChange:(a,r,o)=>{console.log("[Inspector] Property changed:",a,r,o)}}),this.brandVisionPanel.initialize(e,()=>{this.toggleDebug(!1);let a="/dashboard";window.location.pathname!==a&&(window.location.href=a)}),this.customizeSettingsPanel.initialize(e,{onApply:(a,r)=>this.applyCustomizeSettings(a,r)}),this.sceneToolsPanel.initialize(e,{onHighlightObject:a=>{this.highlightObject=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onHighlightAnchor:a=>{this.highlightAnchor=a,a?this.selectedObjectId&&this.startObjectVisuals():this.stopObjectVisuals()},onNudge:(a,r)=>this.nudgeSelectedObject(a,r),onShowSplash:()=>{let a=window;typeof a.__previewShowSplash=="function"&&a.__previewShowSplash()},onUpdateSplash:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({splash:a})}}),this.nudgePanel.initialize(e,{onNudge:async(a,r)=>{var g,h,f,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=((h=l==null?void 0:l.x)!=null?h:0)+a,d=((f=l==null?void 0:l.y)!=null?f:0)+r,{applyConfigOverride:p}=await Promise.resolve().then(()=>(K(),Ie));p({objectId:this.selectedObjectId,path:"transform.position",value:{x:c,y:d}},{silent:!0,emitEvent:!0});let u=window.applyEditableObjectConfig;if(typeof u=="function"){let v=window.__editableConfig,x=(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,x)}window.dispatchEvent(new CustomEvent("inspector:refresh"))},onScale:async a=>{var p,u,g,h,f;if(!this.selectedObjectId)return;let r=this.getSelectedObjectConfig();if(!r)return;let o=(u=(p=r.transform)==null?void 0:p.scale)!=null?u:1,l=Math.max(.1,o+a),{applyConfigOverride:c}=await Promise.resolve().then(()=>(K(),Ie));c({objectId:this.selectedObjectId,path:"transform.scale",value:l},{silent:!0,emitEvent:!0});let d=window.applyEditableObjectConfig;if(typeof d=="function"){let m=window.__editableConfig,b=(f=(h=(g=m==null?void 0:m.objects)==null?void 0:g.get)==null?void 0:h.call(g,this.selectedObjectId))!=null?f:r;await d(this.selectedObjectId,b)}window.dispatchEvent(new CustomEvent("inspector:refresh"))}});let i=e.querySelector("#debug-nudge-enabled");i==null||i.addEventListener("change",()=>{i.checked?this.nudgePanel.show():this.nudgePanel.hide()}),this.configPersistencePanel.initialize(e),this.loadingScreenPanel.initialize(e,{onShowLoadingScreen:()=>{let a=window;typeof a.__previewShowLoading=="function"?a.__previewShowLoading():console.warn("[DEBUG] __previewShowLoading not available")},onHideLoadingScreen:()=>{let a=window;typeof a.__previewHideLoading=="function"?a.__previewHideLoading():console.warn("[DEBUG] __previewHideLoading not available")},onUpdateLoading:a=>{let r=window;typeof r.applyEditableEngineConfig=="function"&&r.applyEditableEngineConfig({loading:a}),typeof r.__previewUpdateLoading=="function"?r.__previewUpdateLoading(a):console.warn("[DEBUG] __previewUpdateLoading not available")}}),window.__openAiEditor=(a,r,o,l)=>{this.customizeSettingsPanel.openAiEditor(a,r,o,l)},this.setupPanelLayout(),this.updateWorkbenchTabs(),window.__debugContext=this,window.__updateWorkbenchTabs=()=>this.updateWorkbenchTabs(),this.isDebugOpen=!0,(n=this.debugOverlay)==null||n.classList.remove("hidden"),this.updateDebugBadge(),this.sceneObjectsPanel.refreshObjects(),window.__previewSelectObject=a=>this.selectObject(a),window.addEventListener("config:changed",a=>{var r,o;((r=a.detail)==null?void 0:r.action)!=="remove"&&((o=a.detail)==null?void 0:o.action)!=="clear_object"&&this.highlightChangesTab()}),window.applyAssetToSlot=(a,r,o)=>this.applySlotAsset(a,r,o),window.refreshAssetLibrary=()=>Promise.all([this.libraryPanel.refresh(),this.libraryPanelDocked.refresh()]),window.reRenderAssetLibrary=()=>{this.libraryPanel.reRender(),this.libraryPanelDocked.reRender()},window.getEngineSplashConfig=()=>{var r;let a=window.getActiveConfig;if(typeof a=="function"){let o=a();return((r=o==null?void 0:o.engine)==null?void 0:r.splash)||null}return null},window.addAssetToRegistry=(a,r)=>{let o=window.getEditableAssets;if(typeof o=="function"){let l=o();if(l!=null&&l.libraryAssets&&(l.libraryAssets[a]||(l.libraryAssets[a]=[]),!l.libraryAssets[a].some(d=>d.filename===r))){let d=r.replace(/\.(png|jpg|jpeg)$/i,"").replace(/_/g," ");l.libraryAssets[a].unshift({filename:r,displayName:d}),console.log(`[DEBUG] Added ${r} to registry category ${a}`)}}},window.__highlightLibrarySlot=(a,r)=>{this.libraryPanel.highlightSlot(a,r),this.libraryPanelDocked.highlightSlot(a,r)}}selectObject(e){this.handleObjectSelect(e),this.activeTab!=="inspector"&&this.activeTab!=="ai"&&this.setActiveTab("inspector")}setActiveTab(e){this.activeTab=e,this.updateWorkbenchTabs(),this.saveWorkbenchState()}highlightChangesTab(){var t;let e=(t=this.container)==null?void 0:t.querySelector('[data-tab="changes"]');e&&e.classList.add("has-pending-changes")}getDebugOverlayHTML(){return`
2066
2066
  <div class="debug-overlay hidden" id="debug-overlay">
2067
2067
  <div class="debug-workbench" id="debug-workbench">
2068
2068
  <div class="workbench-header" id="workbench-handle">
@@ -2109,7 +2109,7 @@ Are you absolutely sure?`))try{let t=Be(),i={};for(let[a,r]of Object.entries(t.o
2109
2109
  ${this.sceneToolsPanel.render()}
2110
2110
  ${this.nudgePanel.render()}
2111
2111
  </div>
2112
- `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var o,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let p=this.container.querySelector("#config-pos-x"),u=this.container.querySelector("#config-pos-y");if(p&&u){let g=Number((o=p.value)!=null?o:0),h=Number((l=u.value)!=null?l:0),m=g+e*n,f=h+t*n;p.value=String(m),u.value=String(f),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=new je;for(let p of i){let u=a(p);if(!u)continue;let g=((d=u.transform)==null?void 0:d.position)||[0,0],h=Array.isArray(g)?g[0]:g.x||0,m=Array.isArray(g)?g[1]:g.y||0,f=h+e*n,b=m+t*n;await r.updateProperty(p,"transform.position",[f,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function fl(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function bl(s){var n;let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function yl(s){return`
2112
+ `}refresh(){this.isDebugOpen&&(this.sceneObjectsPanel.refreshObjects(),this.libraryPanel.refresh(),this.libraryPanelDocked.refresh(),this.brandVisionPanel.refresh(),this.selectedObjectId&&this.handleObjectSelect(this.selectedObjectId))}toggleDebug(e){var t;this.isDebugOpen=e!=null?e:!this.isDebugOpen,(t=this.debugOverlay)==null||t.classList.toggle("hidden",!this.isDebugOpen),this.updateDebugBadge(),this.isDebugOpen?this.refresh():this.stopObjectVisuals()}updateDebugBadge(){if(!this.container)return;let e=this.container.querySelector("#debug-badge");e&&e.classList.toggle("active",this.isDebugOpen)}handleObjectSelect(e){this.selectedObjectId=e,this.sceneObjectsPanel.setSelected(e),this.inspectorPanel.loadObject(e),this.loadObjectConfig(e),this.startObjectVisuals(),window.dispatchEvent(new CustomEvent("preview:select",{detail:{objectId:e}}))}async nudgeSelectedObject(e,t){var o,l,c,d;let i=this.sceneObjectsPanel.getSelectedIds();if(i.length===0)return;let n=this.nudgePanel.getNudgeStep();if(i.length===1&&this.container){let p=this.container.querySelector("#config-pos-x"),u=this.container.querySelector("#config-pos-y");if(p&&u){let g=Number((o=p.value)!=null?o:0),h=Number((l=u.value)!=null?l:0),f=g+e*n,m=h+t*n;p.value=String(f),u.value=String(m),(c=this.configViewer)==null||c.style.setProperty("display","block"),this.scheduleObjectAutoApply();return}}let a=window.getEditableObjectConfig;if(typeof a!="function")return;let r=new je;for(let p of i){let u=a(p);if(!u)continue;let g=((d=u.transform)==null?void 0:d.position)||[0,0],h=Array.isArray(g)?g[0]:g.x||0,f=Array.isArray(g)?g[1]:g.y||0,m=h+e*n,b=f+t*n;await r.updateProperty(p,"transform.position",[m,b])}i.length===1&&this.selectedObjectId===i[0]&&window.dispatchEvent(new CustomEvent("inspector:refresh"))}};function ml(s){return new Promise((e,t)=>{let i=new FileReader;i.onerror=()=>t(new Error("FileReader failed")),i.onload=()=>e(String(i.result||"")),i.readAsDataURL(s)})}function bl(s){var n;let[e,t]=s.split(","),i=e==null?void 0:e.match(/data:(.*?);base64/);return{base64:t!=null?t:"",mimeType:(n=i==null?void 0:i[1])!=null?n:"image/png"}}function yl(s){return`
2113
2113
  Analyze these screenshots of a brand or game and extract its "Brand DNA".
2114
2114
 
2115
2115
  Provide a concise summary (2-3 sentences) covering:
@@ -2126,7 +2126,7 @@ Palette: [#RRGGBB, #RRGGBB, ...]
2126
2126
  ${s?`
2127
2127
  ADDITIONAL RULES/NOTES:
2128
2128
  ${s}`:""}
2129
- `.trim()}function Ir(){let s=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let r=await fl(a),o=bl(r),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:o.base64,mimeType:o.mimeType,dataUrl:r};s.push(l),n.push(l)}return n},getSources(){return s.slice()},async analyze(i,n,a){if(s.length===0)throw new Error("No screenshots to analyze.");let r=yl(n),o=s.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await qi(i,r,o,{model:a}),c=e,d=[],p=l.split(`
2129
+ `.trim()}function Ir(){let s=[],e="",t=null;return{async addSources(i){let n=[];for(let a of i){let r=await ml(a),o=bl(r),l={id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,name:a.name,base64:o.base64,mimeType:o.mimeType,dataUrl:r};s.push(l),n.push(l)}return n},getSources(){return s.slice()},async analyze(i,n,a){if(s.length===0)throw new Error("No screenshots to analyze.");let r=yl(n),o=s.map(u=>({base64:u.base64,mimeType:u.mimeType})),l=await qi(i,r,o,{model:a}),c=e,d=[],p=l.split(`
2130
2130
  `);for(let u of p)if(u.toLowerCase().startsWith("summary:"))c=u.slice(8).trim();else if(u.toLowerCase().includes("palette:")){let g=u.match(/#[0-9A-Fa-f]{6}/g);g&&g.forEach(h=>{d.includes(h.toUpperCase())||d.push(h.toUpperCase())})}return(!c||c===e)&&(c=l.split(`
2131
2131
  Palette:`)[0].replace(/^Summary:\s*/i,"").trim()),t={summary:c,palette:d.slice(0,10)},t},setSummary(i){e=i,t&&(t={...t,summary:i})},getResult(){return t}}}var We="handler_api_key_";var dt=class{static setKey(e,t,i){try{let n={key:this.encryptKey(t),created:Date.now(),lastUsed:Date.now(),label:i||e},a=`${We}${e}`;localStorage.setItem(a,JSON.stringify(n))}catch(n){console.error("[ApiKeyStorage] Failed to store API key:",n)}}static getKey(e){try{let t=`${We}${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=`${We}${e}`;return localStorage.getItem(t)!==null}static removeKey(e){try{let t=`${We}${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(We)){let n=i.substring(We.length),a=localStorage.getItem(i);if(a){let r=JSON.parse(a);e.push({service:n,label:r.label,created:r.created,lastUsed:r.lastUsed})}}}}catch(t){console.error("[ApiKeyStorage] Failed to get stored services:",t)}return e.sort((t,i)=>i.lastUsed-t.lastUsed)}static clearAll(){try{let e=[];for(let t=0;t<localStorage.length;t++){let i=localStorage.key(t);i&&i.startsWith(We)&&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}}},La=()=>dt.getKey("gemini"),Ta=(s,e)=>dt.setKey("gemini",s,e),vl=()=>dt.hasKey("gemini");window.ApiKeyStorage=dt;window.getGeminiApiKey=La;window.setGeminiApiKey=Ta;window.hasGeminiApiKey=vl;var Pa=class{constructor(){this.modal=null;this.options=null;this.analyzer=Ir();this.currentPrompt="";this.isGenerating=!1;this.generatedImages=[];this.selectedImageIndex=-1;this.promptInput=null;this.generateBtn=null;this.loadingEl=null;this.galleryEl=null;this.previewEl=null}open(e){this.options=e,this.currentPrompt=e.initialPrompt||"",this.generatedImages=[],this.selectedImageIndex=-1,this.isGenerating=!1,this.createModal(),document.body.appendChild(this.modal),setTimeout(()=>{var t,i;(t=this.promptInput)==null||t.focus(),(i=this.promptInput)==null||i.select()},100)}createModal(){var t;let e=document.createElement("div");e.className="ai-modal",e.innerHTML=`
2132
2132
  <div class="ai-modal-card">
@@ -2292,7 +2292,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2292
2292
  <button class="asset-crop-apply primary" data-action="apply">Apply Crop</button>
2293
2293
  </div>
2294
2294
  </div>
2295
- `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,r=Math.min(n,a),o=this.cropWidth*r,l=this.cropHeight*r,c=(i-o)/2,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(s){new _a().open(s)};K();var $=require("pixi.js");K();var rn=class{constructor(e){this.app=null;this.camera=new $.Container;this.mainContainer=new $.Container;this.uiContainer=new $.Container;this.gizmoLayer=new $.Container;this.screenFrame=new $.Graphics;this.gameFrame=new $.Graphics;this.gridLayer=new $.Graphics;this.spawnPointLayer=new $.Container;this.objectMap=new Map;this.selectedId=null;this.dragMode=null;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotation=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.dragContainer=null;this.spawnPointDrag=null;this.lastGameFrameSize=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.screenSyncRaf=null;this.gizmoOutline=new $.Graphics;this.moveHandle=new $.Graphics;this.scaleHandle=new $.Graphics;this.rotateHandle=new $.Graphics;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.gridEnabled=!1;this.gridGap=50;this.gridAlpha=.25;this.lastPickPoint=null;this.lastPickIds=[];this.lastPickIndex=0;this.lastPickTime=0;this.playModeEnabled=!1;this.runtimeLayoutActive=!1;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.hasUserCamera=!1,this.updateLayout({width:t,height:i}),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid(),this.schedulePostScreenSync({width:t,height:i}))};this.handleActiveScreenChanged=()=>{this.isVisible&&this.syncFromConfig()};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout(),this.updateGrid();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.objectId,n=t.objectIds;if(i){this.syncFromConfig([i]);return}if(Array.isArray(n)&&n.length>0){this.syncFromConfig(n);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handleAssetUpdated=e=>{var l;let t=(l=e==null?void 0:e.detail)!=null?l:{},i=t.objectId,n=t.texture;if(!i||!n)return;let a=this.objectMap.get(i);if(!a)return;let r=a.displayObject;if(r!=null&&r.texture)r.texture=n;else if(r!=null&&r.children){let c=r.children.find(d=>d==null?void 0:d.texture);c&&(c.texture=n)}let o=this.getEditableObjectConfig(i);o&&(a.assetKey=this.getAssetKey(o))};this.handleLayoutApplied=e=>{var r;if(!this.isVisible)return;let t=(r=e==null?void 0:e.detail)!=null?r:{},i=Number(t.width),n=Number(t.height),a=Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:this.getScreen();this.updateLayout(a),this.hasUserCamera||this.centerCamera(),this.syncFromConfig().then(()=>{this.playModeEnabled&&this.syncFromGameObjectsInternal(!0),this.updateGizmos(),this.updateGrid()})};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onStagePointerDown=e=>{if(!this.app||!this.isVisible||this.getPointerButton(e)!==0||this.isGizmoTarget(e==null?void 0:e.target))return;let i=this.getEventGlobalPoint(e);if(!i)return;let n=new $.Point(i.x,i.y),a=this.getPickCandidates(n);if(a.length===0){this.setSelected(null),this.lastPickIds=[],this.lastPickIndex=0,this.lastPickPoint=n,this.lastPickTime=performance.now();return}let r=performance.now(),o=this.areSameIds(a,this.lastPickIds),l=this.lastPickPoint&&this.distance(n,this.lastPickPoint)<=6,c=r-this.lastPickTime<1200,d=o&&l&&c?(this.lastPickIndex+1)%a.length:0,p=a[d];this.lastPickIds=a,this.lastPickIndex=d,this.lastPickPoint=n,this.lastPickTime=r,this.setSelected(p),this.playModeEnabled||this.startDrag("move",e)};this.handleGridSettings=e=>{var a,r,o;let t=(a=e==null?void 0:e.detail)==null?void 0:a.enabled,i=(r=e==null?void 0:e.detail)==null?void 0:r.gap,n=(o=e==null?void 0:e.detail)==null?void 0:o.alpha;typeof t=="boolean"&&(this.gridEnabled=t),typeof i=="number"&&Number.isFinite(i)&&i>2&&(this.gridGap=i),typeof n=="number"&&Number.isFinite(n)&&n>=0&&n<=1&&(this.gridAlpha=n),this.updateGrid()};this.handlePlayMode=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;typeof t=="boolean"&&this.setPlayMode(t)};this.syncFromGameObjects=()=>{this.syncFromGameObjectsInternal(!1)};this.onSpawnPointDragMove=e=>{if(!this.spawnPointDrag)return;let t=this.getPointerInContainer(e.clientX,e.clientY,this.mainContainer);if(!t)return;let i=t.x+this.spawnPointDrag.offset.x,n=t.y+this.spawnPointDrag.offset.y;this.updateLiveSpawnPoint(this.spawnPointDrag.objectId,this.spawnPointDrag.index,i,n)};this.onSpawnPointDragEnd=()=>{if(!this.spawnPointDrag)return;let{objectId:e,startPoints:t}=this.spawnPointDrag,i=this.getEditableObjectConfig(e),n=i?this.getSpawnPoints(i):null;i&&n&&(this.setNestedValue(i,"logic.props.spawnPoints",t),Q({objectId:e,path:"logic.props.spawnPoints",value:n},{persist:!0,emitEvent:!0,trackHistory:!0}),this.queueLiveApply(e)),this.spawnPointDrag=null,window.dispatchEvent(new CustomEvent("inspector:refresh")),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd)};this.onDragMove=e=>{var a;if(!this.dragMode||!this.selectedId||!this.app||this.playModeEnabled)return;let t=this.objectMap.get(this.selectedId);if(!t)return;let i=(a=this.dragContainer)!=null?a:this.mainContainer,n=this.getPointerInContainer(e.clientX,e.clientY,i);if(!(!n||!this.dragStartPointer||!this.dragStartPos)){if(this.dragMode==="move"){let r=n.x-this.dragStartPointer.x,o=n.y-this.dragStartPointer.y,l=this.dragStartPos.x+r,c=this.dragStartPos.y+o;t.displayObject.position.set(l,c),this.updateLiveConfigPosition(l,c)}else if(this.dragMode==="scale"){let r=new $.Point(this.dragStartPos.x,this.dragStartPos.y),o=Math.max(1,this.distance(n,r)),l=Math.max(.05,this.dragStartScale*(o/this.dragStartDistance));t.displayObject.scale.set(l),this.updateLiveConfigScale(l)}else if(this.dragMode==="rotate"){let r=new $.Point(this.dragStartPos.x,this.dragStartPos.y),l=Math.atan2(n.y-r.y,n.x-r.x)-this.dragStartAngle,c=this.dragStartRotation+l;t.displayObject.rotation=c,this.updateLiveConfigRotation(c)}this.updateGizmos(),this.queueLiveApply(this.selectedId)}};this.onDragEnd=()=>{var i,n,a,r,o,l,c;if(!this.dragMode||!this.selectedId)return;let e=this.selectedId,t=this.getEditableObjectConfig(e);if(t){let d=(i=t.transform)!=null?i:{};if(t.transform||(t.transform=d),this.dragMode==="move"&&this.dragStartValue){let p=d.position,u=Array.isArray(p)?[Number((n=p[0])!=null?n:0),Number((a=p[1])!=null?a:0)]:{x:Number((r=p==null?void 0:p.x)!=null?r:0),y:Number((o=p==null?void 0:p.y)!=null?o:0)};this.applyFinalOverride(e,"transform.position",u,this.dragStartValue)}else this.dragMode==="scale"?this.applyFinalOverride(e,"transform.scale",(l=d.scale)!=null?l:1,this.dragStartValue):this.dragMode==="rotate"&&this.applyFinalOverride(e,"transform.rotation",(c=d.rotation)!=null?c:0,this.dragStartValue);this.queueLiveApply(e)}window.dispatchEvent(new CustomEvent("inspector:refresh")),this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,this.dragContainer=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd)};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i)),a=new $.Point(this.app.renderer.width/2,this.app.renderer.height/2),r=this.camera.toLocal(a);this.cameraScale=n,this.camera.scale.set(n);let o=this.camera.toGlobal(r);this.camera.position.set(this.camera.position.x+(a.x-o.x),this.camera.position.y+(a.y-o.y)),this.hasUserCamera=!0,this.updateGizmos(),this.updateGrid()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(!this.isPanning||!this.panStart||!this.panStartCamera)return;let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i),this.updateGrid()};this.onPanEnd=()=>{this.isPanning=!1,this.panStart=null,this.panStartCamera=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new $.Application,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.uiContainer.sortableChildren=!0,this.spawnPointLayer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.screenFrame),this.camera.addChild(this.mainContainer),this.camera.addChild(this.gridLayer),this.camera.addChild(this.uiContainer),this.camera.addChild(this.spawnPointLayer),this.camera.addChild(this.gameFrame),this.camera.addChild(this.gizmoLayer),this.screenFrame.zIndex=-1,this.screenFrame.eventMode="none",this.mainContainer.zIndex=0,this.gridLayer.zIndex=2e4,this.gridLayer.eventMode="none",this.gridLayer.visible=!0,this.uiContainer.zIndex=5e4,this.spawnPointLayer.zIndex=8e4,this.spawnPointLayer.eventMode="passive",this.gameFrame.zIndex=85e3,this.gameFrame.eventMode="none",this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.gizmoOutline.eventMode="none",this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.restoreScenePreferences(),this.refresh(),!this.isVisible&&this.app.ticker&&this.app.ticker.stop())}destroy(){var e;this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.screenSyncRaf&&(cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("handler:layout-applied",this.handleLayoutApplied),window.removeEventListener("preview:select",this.handlePreviewSelect),window.removeEventListener("scene-editor:grid",this.handleGridSettings),window.removeEventListener("scene-editor:play-mode",this.handlePlayMode),window.removeEventListener("scene-editor:asset-updated",this.handleAssetUpdated),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd),this.app&&((e=this.app.ticker)==null||e.remove(this.syncFromGameObjects),this.app.stage.off("pointerdown",this.onStagePointerDown),this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,!(!this.app||!this.app.ticker)&&(e?(this.app.ticker.start(),this.refresh(),this.updateGrid()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("handler:layout-applied",this.handleLayoutApplied),window.addEventListener("preview:select",this.handlePreviewSelect),window.addEventListener("scene-editor:grid",this.handleGridSettings),window.addEventListener("scene-editor:play-mode",this.handlePlayMode),window.addEventListener("scene-editor:asset-updated",this.handleAssetUpdated),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.app.stage.on("pointerdown",this.onStagePointerDown),this.moveHandle.eventMode="static",this.moveHandle.cursor="move",this.scaleHandle.eventMode="static",this.scaleHandle.cursor="nwse-resize",this.rotateHandle.eventMode="static",this.rotateHandle.cursor="crosshair",this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t))}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid())}getPickCandidates(e){var i;let t=[];for(let[n,a]of this.objectMap.entries()){let r=a.displayObject;if(!r||r.visible===!1)continue;let o=(i=r.getBounds)==null?void 0:i.call(r);if(!o||o.width<=0||o.height<=0||e.x<o.x||e.x>o.x+o.width||e.y<o.y||e.y>o.y+o.height)continue;let l=r.parent,c=typeof(l==null?void 0:l.zIndex)=="number"?l.zIndex:0,d=typeof r.zIndex=="number"?r.zIndex:0,p=typeof(l==null?void 0:l.getChildIndex)=="function"?l.getChildIndex(r):0,u=c*1e6+d*1e3+p;t.push({id:n,order:u})}return t.sort((n,a)=>a.order-n.order),t.map(n=>n.id)}areSameIds(e,t){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i+=1)if(e[i]!==t[i])return!1;return!0}isGizmoTarget(e){return e&&this.spawnPointLayer.children.indexOf(e)!==-1?!0:e===this.moveHandle||e===this.scaleHandle||e===this.rotateHandle||e===this.gizmoOutline}restoreScenePreferences(){if(typeof window!="undefined"){try{let e=window.localStorage.getItem(this.getSceneStorageKey("grid_enabled")),t=window.localStorage.getItem(this.getSceneStorageKey("grid_gap")),i=window.localStorage.getItem(this.getSceneStorageKey("grid_alpha")),n=window.localStorage.getItem(this.getSceneStorageKey("play_mode"));if(e!==null&&(this.gridEnabled=e==="true"),t!==null){let a=Number(t);Number.isFinite(a)&&a>2&&(this.gridGap=a)}if(i!==null){let a=Number(i);Number.isFinite(a)&&a>=0&&a<=1&&(this.gridAlpha=a)}n!==null&&this.setPlayMode(n==="true")}catch{}this.updateGrid()}}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}schedulePostScreenSync(e){this.screenSyncRaf&&cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=requestAnimationFrame(()=>{this.runPostScreenSync(e)})}async runPostScreenSync(e){this.screenSyncRaf=null,this.isVisible&&(this.updateLayout(e),this.hasUserCamera||this.centerCamera(),await this.syncFromConfig(),this.playModeEnabled&&this.syncFromGameObjectsInternal(!0),this.updateGizmos(),this.updateGrid())}getRuntimeScreenSize(){var a,r,o,l,c,d,p;let e=window.gameApp;if(e!=null&&e.renderer){let u=e.renderer.screen,g=Number((a=u==null?void 0:u.width)!=null?a:0),h=Number((r=u==null?void 0:u.height)!=null?r:0);if(Number.isFinite(g)&&g>0&&Number.isFinite(h)&&h>0)return{width:g,height:h};let m=Number((o=e.renderer.resolution)!=null?o:1)||1,f=Number((l=e.renderer.width)!=null?l:0)/m,b=Number((c=e.renderer.height)!=null?c:0)/m;if(Number.isFinite(f)&&f>0&&Number.isFinite(b)&&b>0)return{width:f,height:b}}let t=document.querySelector(".game-container"),i=Number((d=t==null?void 0:t.dataset)==null?void 0:d.screenWidth),n=Number((p=t==null?void 0:t.dataset)==null?void 0:p.screenHeight);return Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:null}getRuntimeLayoutReference(){var i;let e=window.__mainContainer;if(e)return e;let t=window.gameApp;return(i=t==null?void 0:t.stage)!=null?i:null}getRuntimeParentContainer(e){var l,c;let t=window.gameObjectManager;if(!(t!=null&&t.get))return null;let i=t.get(e),n=((l=i==null?void 0:i.getDisplayObject)==null?void 0:l.call(i))||(i==null?void 0:i.pixiObject)||i,a=n==null?void 0:n.parent;if(!a)return null;let r=this.getRuntimeLayoutReference(),o=(c=window.gameApp)==null?void 0:c.stage;return r&&o&&r===o?this.mainContainer:r&&typeof r.contains=="function"&&r.contains(a)?this.mainContainer:a===r||a===o?this.mainContainer:this.uiContainer}applyRuntimeTransform(e){var r,o,l,c,d,p,u,g,h,m,f,b,y,v;if(!e)return!1;let t=Number((o=(r=e.scale)==null?void 0:r.x)!=null?o:1),i=Number((c=(l=e.scale)==null?void 0:l.y)!=null?c:t),n=Number((p=(d=e.position)==null?void 0:d.x)!=null?p:0),a=Number((g=(u=e.position)==null?void 0:u.y)!=null?g:0);if(!Number.isFinite(t)||!Number.isFinite(i)||!Number.isFinite(n)||!Number.isFinite(a))return!1;if(this.mainContainer.scale.set(t,i),this.uiContainer.scale.set(t,i),this.mainContainer.position.set(n,a),this.uiContainer.position.set(n,a),e.pivot&&((h=this.mainContainer.pivot)!=null&&h.set)&&((m=this.uiContainer.pivot)!=null&&m.set)){let S=Number((b=(f=e.pivot)==null?void 0:f.x)!=null?b:0),C=Number((v=(y=e.pivot)==null?void 0:y.y)!=null?v:0);Number.isFinite(S)&&Number.isFinite(C)&&(this.mainContainer.pivot.set(S,C),this.uiContainer.pivot.set(S,C))}return typeof e.rotation=="number"&&(this.mainContainer.rotation=e.rotation,this.uiContainer.rotation=e.rotation),!0}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let r=this.getEditableObjectConfig(a);if(!r){this.removeObject(a);continue}await this.upsertObject(a,r)}this.updateGizmos(),this.updateSpawnPointHandles(),this.updateGameFrame(this.getScreen())}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e),a=this.isUiConfig(e,t),r=this.getRuntimeParentContainer(e),o=a?this.uiContainer:this.mainContainer,l=r!=null?r:o;if(!n||n.assetKey!==i||n.isUi!==a){n&&this.removeObject(e);let d=await this.createDisplayObject(e,t);if(!d)return;l.addChild(d),this.objectMap.set(e,{id:e,displayObject:d,assetKey:i,isUi:a}),this.attachObjectInteraction(d,e)}let c=this.objectMap.get(e);c&&(c.displayObject.parent!==l&&l.addChild(c.displayObject),this.applyVisualConfig(c.displayObject,t),this.updateObjectTransform(c.displayObject,t))}async createDisplayObject(e,t){var o,l,c,d,p,u,g,h,m,f,b,y,v,S,C;if((o=t==null?void 0:t.render)!=null&&o.asset)try{if(((c=(l=t==null?void 0:t.render)==null?void 0:l.asset)==null?void 0:c.type)!=="json"){let O=await pe.create(e,t,this.app);if(O instanceof $.Container)return O}}catch(I){console.warn("[SceneEditor] ObjectFactory failed for",e,I)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let I=this.getScreen(),O=(p=I==null?void 0:I.width)!=null?p:0,w=(u=I==null?void 0:I.height)!=null?u:0,T=new $.Graphics,j=this.parseColor(n.background_color,0),A=typeof n.background_alpha=="number"?n.background_alpha:1;O>0&&w>0&&T.rect(0,0,O,w).fill({color:j,alpha:A});let k=new $.Container;return k.addChild(T),k}if(a){let I=(h=(g=i==null?void 0:i.color)!=null?g:n==null?void 0:n.tint)!=null?h:"#ffffff",O=new $.TextStyle({fontFamily:"Arial, sans-serif",fontSize:(m=i==null?void 0:i.fontSize)!=null?m:16,fill:I,align:(f=i==null?void 0:i.align)!=null?f:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new $.Text({text:(y=i==null?void 0:i.text)!=null?y:"",style:O})}if((v=t==null?void 0:t.effects)!=null&&v.width||(S=t==null?void 0:t.effects)!=null&&S.height){let I=new $.Graphics,O=typeof t.effects.width=="number"?t.effects.width:100,w=typeof t.effects.height=="number"?t.effects.height:100,T=(C=t.effects.fill_color)!=null?C:"#ffffff",j=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,A=Number.parseInt(String(T).replace("#",""),16);return I.rect(0,0,O,w).fill({color:Number.isFinite(A)?A:16777215,alpha:j}),I}return new $.Container}attachObjectInteraction(e,t){if(e&&(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function")){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=new $.Rectangle(i.x,i.y,i.width,i.height))}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}isUiConfig(e,t){var a,r;let i=(((a=t==null?void 0:t.identity)==null?void 0:a.category)||"").toString().toLowerCase(),n=(((r=t==null?void 0:t.identity)==null?void 0:r.id)||e||"").toString().toLowerCase();return i.includes("ui")||n.startsWith("ui")||n.includes("label")}applyVisualConfig(e,t){var r,o,l,c,d,p,u;if(!e)return;let i=(r=t==null?void 0:t.render)!=null?r:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n=(d=(c=(o=t==null?void 0:t.render)==null?void 0:o.anchor)!=null?c:(l=t==null?void 0:t.transform)==null?void 0:l.anchor)!=null?d:"center",a=at(n,{x:.5,y:.5});if((p=e.anchor)!=null&&p.set)e.anchor.set(a.x,a.y);else if(e.pivot){let g=(u=e.getLocalBounds)==null?void 0:u.call(e);g&&e.pivot.set(g.width*a.x,g.height*a.y)}}updateObjectTransform(e,t){var d;if(!e||this.playModeEnabled)return;let i=(d=t==null?void 0:t.transform)!=null?d:{},n=e.parent===this.uiContainer?this.uiContainer:this.mainContainer,a=this.getAnchorLocalPoint(i,n),r=this.getPositionOffset(i),o=this.getDynamicScaleMultiplier();a&&e.position.set(a.x+r.x,a.y+r.y);let l=typeof i.scale=="number"?i.scale:void 0;typeof l=="number"&&e.scale&&e.scale.set(l*o);let c=this.toRadians(typeof i.rotation=="number"?i.rotation:0);typeof e.rotation=="number"&&(e.rotation=c)}getAnchorLocalPoint(e,t=this.mainContainer){var r;let i=this.getScreen();if(!(i!=null&&i.width)||!(i!=null&&i.height))return null;let n=(e==null?void 0:e.position_ratio)!=null?kt(i.width,i.height,e.position_ratio):Tt(i.width,i.height,(r=e==null?void 0:e.anchor)!=null?r:"center"),a=new $.Point;return t.toLocal(new $.Point(n.x,n.y),this.camera,a),a}getPositionOffset(e){var l,c,d,p,u,g,h,m;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset,n=Array.isArray(t)?Number((l=t[0])!=null?l:0):Number((c=t==null?void 0:t.x)!=null?c:0),a=Array.isArray(t)?Number((d=t[1])!=null?d:0):Number((p=t==null?void 0:t.y)!=null?p:0),r=Array.isArray(i)?Number((u=i[0])!=null?u:0):Number((g=i==null?void 0:i.x)!=null?g:0),o=Array.isArray(i)?Number((h=i[1])!=null?h:0):Number((m=i==null?void 0:i.y)!=null?m:0);return{x:n+r,y:a+o}}updateLayout(e){var a,r,o,l,c,d,p,u;let t=e!=null?e:this.getScreen();if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let i=this.getRuntimeLayoutReference(),n=this.applyRuntimeTransform(i);if(this.runtimeLayoutActive=n,!n){let h=(((r=(a=this.getEditableConfig())==null?void 0:a.engine)==null?void 0:r.runtime)||{}).layout||{},m=t.width*((o=ge.layout.screen_scale_x)!=null?o:1),f=h.design_width_portrait||400,b=m/f;b=Math.min(b,1.15);let y=b*((l=ge.engine.scale)!=null?l:1);this.mainContainer.scale.set(y),this.uiContainer.scale.set(y);let v=(c=h.main_container_anchor)!=null?c:"center",S=(d=h.main_container_position_ratio)!=null?d:{x:.5,y:.5},C=(p=h.main_container_offset)!=null?p:{x:0,y:0},I=h.main_container_position_ratio?kt(t.width,t.height,S):Tt(t.width,t.height,v),O=I.x+C.x+ge.layout.position_offset.x,w=I.y+C.y+ge.layout.position_offset.y;this.mainContainer.position.set(O,w),this.uiContainer.position.set(O,w)}this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),this.updateGameFrame(t),(u=this.app)!=null&&u.stage&&(this.app.stage.hitArea=new $.Rectangle(0,0,this.app.renderer.width,this.app.renderer.height)),this.updateSpawnPointHandles()}getDynamicScaleMultiplier(){var t,i,n,a;if(this.runtimeLayoutActive)return 1;let e=Number((a=(n=(t=nt)==null?void 0:t.scale)!=null?n:(i=oe)==null?void 0:i.scaleFactor)!=null?a:1);return Number.isFinite(e)&&e>0?e:1}updateGrid(){if(!this.app)return;if(!this.gridEnabled){this.gridLayer.clear(),this.gridLayer.visible=!0;return}let e=Math.max(4,this.gridGap),t=this.app.renderer,i=this.camera.toLocal(new $.Point(0,0)),n=this.camera.toLocal(new $.Point(t.width,t.height)),a=Math.min(i.x,n.x),r=Math.max(i.x,n.x),o=Math.min(i.y,n.y),l=Math.max(i.y,n.y),c=400,d=Math.ceil((r-a)/e),p=Math.ceil((l-o)/e),u=e*Math.max(1,Math.ceil(d/c)),g=e*Math.max(1,Math.ceil(p/c)),h=Math.floor(a/u)*u,m=Math.floor(o/g)*g;this.gridLayer.clear(),this.gridLayer.visible=!0;for(let f=h;f<=r;f+=u)this.gridLayer.moveTo(f,o),this.gridLayer.lineTo(f,l);for(let f=m;f<=l;f+=g)this.gridLayer.moveTo(a,f),this.gridLayer.lineTo(r,f);this.gridLayer.stroke({width:1,color:16777215,alpha:this.gridAlpha})}updateGameFrame(e){var i;let t=(i=this.getRuntimeScreenSize())!=null?i:e;!(t!=null&&t.width)||!(t!=null&&t.height)||this.lastGameFrameSize&&this.lastGameFrameSize.width===t.width&&this.lastGameFrameSize.height===t.height||(this.lastGameFrameSize={width:t.width,height:t.height},this.gameFrame.clear(),this.gameFrame.rect(0,0,t.width,t.height),this.gameFrame.stroke({width:2,color:6333946,alpha:.35}))}setPlayMode(e){var t;this.playModeEnabled!==e&&(this.playModeEnabled=e,(t=this.app)!=null&&t.ticker&&(this.app.ticker.remove(this.syncFromGameObjects),e&&this.app.ticker.add(this.syncFromGameObjects)),e?(this.moveHandle.eventMode="none",this.scaleHandle.eventMode="none",this.rotateHandle.eventMode="none",this.syncFromGameObjectsInternal(!0)):(this.moveHandle.eventMode="static",this.scaleHandle.eventMode="static",this.rotateHandle.eventMode="static",this.syncFromConfig()),this.updateGizmos(),this.updateSpawnPointHandles())}syncFromGameObjectsInternal(e){var n,a,r,o,l,c,d,p;if(!this.app||!this.isVisible||!this.playModeEnabled&&!e)return;let t=window.gameObjectManager;if(!(t!=null&&t.get))return;let i=this.dragMode?this.selectedId:null;for(let[u,g]of this.objectMap.entries()){if(i&&u===i)continue;let h=t.get(u),m=((n=h==null?void 0:h.getDisplayObject)==null?void 0:n.call(h))||(h==null?void 0:h.pixiObject)||h;if(!m)continue;let f=(r=(a=g.displayObject)==null?void 0:a.parent)!=null?r:this.mainContainer,b=new $.Point;if(typeof m.getGlobalPosition=="function"){m.getGlobalPosition(b);let I=f.toLocal(b,this.camera);g.displayObject.position.set(I.x,I.y)}else if(m.worldTransform){b.set(m.worldTransform.tx,m.worldTransform.ty);let I=f.toLocal(b,this.camera);g.displayObject.position.set(I.x,I.y)}let y=this.getWorldScale(m);if(y){let I=Number((l=(o=f.scale)==null?void 0:o.x)!=null?l:1)||1,O=Number((d=(c=f.scale)==null?void 0:c.y)!=null?d:1)||1,w=y.x/I,T=y.y/O;(p=g.displayObject.scale)!=null&&p.set?g.displayObject.scale.set(w,T):g.displayObject.scale&&(g.displayObject.scale.x=w,g.displayObject.scale.y=T)}let v=this.getWorldRotation(m);if(typeof v=="number"){let I=f?f.rotation:0;g.displayObject.rotation=v-I}let S=m.parent,C=typeof(S==null?void 0:S.getChildIndex)=="function"?S.getChildIndex(m):0;typeof m.zIndex=="number"?g.displayObject.zIndex=m.zIndex:Number.isFinite(C)&&(g.displayObject.zIndex=C)}this.updateGizmos()}getWorldScale(e){var a,r;let t=(r=e==null?void 0:e.worldTransform)!=null?r:(a=e==null?void 0:e.transform)==null?void 0:a.worldTransform;if(!t)return null;let i=Math.sqrt(t.a*t.a+t.b*t.b),n=Math.sqrt(t.c*t.c+t.d*t.d);return!Number.isFinite(i)||!Number.isFinite(n)?null:{x:i,y:n}}getWorldRotation(e){var i,n;let t=(n=e==null?void 0:e.worldTransform)!=null?n:(i=e==null?void 0:e.transform)==null?void 0:i.worldTransform;if(t){let a=Math.atan2(t.b,t.a);return Number.isFinite(a)?a:null}return typeof(e==null?void 0:e.rotation)=="number"?e.rotation:null}centerCamera(){var a;if(!this.app)return;let e=(a=this.getRuntimeScreenSize())!=null?a:this.getScreen();if(!(e!=null&&e.width)||!(e!=null&&e.height))return;let t=this.app.renderer.width,i=this.app.renderer.height,n=Math.max(.01,Math.min(t/e.width,i/e.height));this.cameraScale=n,this.camera.scale.set(n),this.camera.position.set((t-e.width*n)/2,(i-e.height*n)/2)}updateGizmos(){var d,p;if(!this.selectedId||!this.isVisible){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(p=(d=e.displayObject).getBounds)==null?void 0:p.call(d);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new $.Point(t.x,t.y)),n=this.camera.toLocal(new $.Point(t.x+t.width,t.y+t.height)),a=n.x-i.x,r=n.y-i.y,o=i.x+a/2,l=i.y+r/2;if(this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,r),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9}),this.playModeEnabled){this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear();return}let c=10;this.moveHandle.clear(),this.moveHandle.circle(0,0,c/2),this.moveHandle.fill({color:16752394,alpha:.9}),this.moveHandle.position.set(o,l),this.scaleHandle.clear(),this.scaleHandle.rect(-c/2,-c/2,c,c),this.scaleHandle.fill({color:3900150,alpha:.9}),this.scaleHandle.position.set(n.x,n.y),this.rotateHandle.clear(),this.rotateHandle.circle(0,0,c/2),this.rotateHandle.fill({color:1096065,alpha:.9}),this.rotateHandle.position.set(o,i.y-20)}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}updateSpawnPointHandles(){if(this.clearSpawnPointHandles(),!this.selectedId)return;let e=this.getEditableObjectConfig(this.selectedId);if(!e||!this.isSpawnerConfig(e))return;let t=this.getSpawnPoints(e);!t||t.length===0||t.forEach((i,n)=>{let a=new $.Graphics;a.circle(0,0,5).fill({color:16096779,alpha:.9}),a.circle(0,0,9).stroke({width:1,color:16096779,alpha:.45});let r=this.toCameraFromMain(i);a.position.set(r.x,r.y),a.cursor="move",a.eventMode=this.playModeEnabled?"none":"static",a.on("pointerdown",o=>this.startSpawnPointDrag(n,o)),this.spawnPointLayer.addChild(a)})}clearSpawnPointHandles(){this.spawnPointLayer.removeChildren().forEach(t=>{var i;(i=t.destroy)==null||i.call(t)})}isSpawnerConfig(e){var i,n;return((i=e==null?void 0:e.logic)==null?void 0:i.id)==="Spawner"?!0:String(((n=e==null?void 0:e.identity)==null?void 0:n.system_role)||"").toLowerCase().includes("spawner")}getSpawnPoints(e){var i,n;let t=(n=(i=e==null?void 0:e.logic)==null?void 0:i.props)==null?void 0:n.spawnPoints;return Array.isArray(t)?t.map(a=>{var r,o;return{x:Number((r=a==null?void 0:a.x)!=null?r:0),y:Number((o=a==null?void 0:a.y)!=null?o:0)}}):null}toCameraFromMain(e){let t=this.mainContainer.toGlobal(new $.Point(e.x,e.y)),i=new $.Point;return this.camera.toLocal(t,void 0,i),i}startSpawnPointDrag(e,t){var o,l;if(!this.selectedId||this.playModeEnabled)return;let i=this.getEditableObjectConfig(this.selectedId);if(!i)return;let n=this.getSpawnPoints(i);if(!n||!n[e])return;(o=t==null?void 0:t.stopPropagation)==null||o.call(t),(l=t==null?void 0:t.stopImmediatePropagation)==null||l.call(t);let a=this.getEventLocalPoint(t,this.mainContainer);if(!a)return;let r=n[e];this.spawnPointDrag={objectId:this.selectedId,index:e,offset:new $.Point(r.x-a.x,r.y-a.y),startPoints:n.map(c=>({x:c.x,y:c.y}))},window.addEventListener("pointermove",this.onSpawnPointDragMove),window.addEventListener("pointerup",this.onSpawnPointDragEnd)}updateLiveSpawnPoint(e,t,i,n){let a=this.getEditableObjectConfig(e);if(!a)return;let r=this.getSpawnPoints(a);if(!r||!r[t])return;let o=r.map((l,c)=>c===t?{x:i,y:n}:{x:l.x,y:l.y});this.setNestedValue(a,"logic.props.spawnPoints",o),this.queueLiveApply(e),this.updateSpawnPointHandles()}setSelected(e,t={}){if(this.selectedId!==e&&(this.selectedId=e,this.updateGizmos(),this.updateSpawnPointHandles(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var d,p,u,g;if(!this.selectedId||!e||!this.app||this.playModeEnabled||this.getPointerButton(t)!==0)return;let n=this.objectMap.get(this.selectedId);if(!n)return;this.dragContainer=(p=(d=n.displayObject)==null?void 0:d.parent)!=null?p:this.mainContainer;let a=this.getEventLocalPoint(t,this.dragContainer);if(!a)return;let r=n.displayObject;this.dragMode=e,this.dragStartPointer=new $.Point(a.x,a.y),this.dragStartPos=new $.Point(r.position.x,r.position.y),this.dragStartScale=typeof((u=r.scale)==null?void 0:u.x)=="number"?r.scale.x:1;let o=this.getEditableObjectConfig(this.selectedId),l=(g=o==null?void 0:o.transform)!=null?g:{};this.dragStartRotation=this.toRadians(typeof l.rotation=="number"?l.rotation:0),this.dragAnchorLocal=this.getAnchorLocalPoint(l,this.dragContainer),this.dragStartValue=this.getDragStartValue(e,l);let c=new $.Point(r.position.x,r.position.y);this.dragStartAngle=Math.atan2(a.y-c.y,a.x-c.x),this.dragStartDistance=Math.max(1,this.distance(a,c)),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPosition(e,t){var p,u,g,h,m,f;if(!this.selectedId||!this.dragAnchorLocal)return;let i=e-this.dragAnchorLocal.x,n=t-this.dragAnchorLocal.y,a=this.getEditableObjectConfig(this.selectedId);if(!a)return;let r=(p=a.transform)!=null?p:{};a.transform||(a.transform=r);let o=(u=r.offset)!=null?u:{x:0,y:0},l=Array.isArray(o)?Number((g=o[0])!=null?g:0):Number((h=o==null?void 0:o.x)!=null?h:0),c=Array.isArray(o)?Number((m=o[1])!=null?m:0):Number((f=o==null?void 0:o.y)!=null?f:0),d=this.buildPositionValue(r,{x:i-l,y:n-c});this.setNestedValue(r,"position",d)}updateLiveConfigScale(e){var r;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(r=t.transform)!=null?r:{};t.transform||(t.transform=i);let n=this.getDynamicScaleMultiplier(),a=n>0?e/n:e;i.scale=Math.round(a*100)/100}updateLiveConfigRotation(e){var r;if(!this.selectedId)return;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return;let i=(r=t.transform)!=null?r:{};t.transform||(t.transform=i);let n=this.toDegrees(e),a=typeof i.rotation=="number"?i.rotation:0;Math.abs(n-a)>.01&&(i.rotation=Math.round(n*100)/100)}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),Q({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&n(t,i)}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let r=0;r<n.length-1;r+=1){let o=n[r];(!a[o]||typeof a[o]!="object")&&(a[o]={}),a=a[o]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position,n=Math.round(t.x*100)/100,a=Math.round(t.y*100)/100;return Array.isArray(i)?[n,a]:{x:n,y:a}}toRadians(e){return e*Math.PI/180}toDegrees(e){return e*180/Math.PI}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerButton(e){var t,i,n;return typeof(e==null?void 0:e.button)=="number"?e.button:typeof((t=e==null?void 0:e.data)==null?void 0:t.button)=="number"?e.data.button:typeof((n=(i=e==null?void 0:e.data)==null?void 0:i.originalEvent)==null?void 0:n.button)=="number"?e.data.originalEvent.button:0}getEventGlobalPoint(e){var l,c;let t=(c=e==null?void 0:e.global)!=null?c:(l=e==null?void 0:e.data)==null?void 0:l.global;if(t)return new $.Point(t.x,t.y);if(!this.app)return null;let i=e==null?void 0:e.clientX,n=e==null?void 0:e.clientY;if(typeof i!="number"||typeof n!="number")return null;let a=this.app.canvas.getBoundingClientRect(),r=(i-a.left)*(this.app.renderer.width/a.width),o=(n-a.top)*(this.app.renderer.height/a.height);return new $.Point(r,o)}getEventLocalPoint(e,t=this.mainContainer){var a,r;if(!this.app)return null;if(typeof(e==null?void 0:e.getLocalPosition)=="function"){let o=e.getLocalPosition(t);return new $.Point(o.x,o.y)}let i=(r=e==null?void 0:e.global)!=null?r:(a=e==null?void 0:e.data)==null?void 0:a.global;if(!i)return null;let n=new $.Point;return t.toLocal(new $.Point(i.x,i.y),void 0,n),n}getPointerInContainer(e,t,i){if(!this.app)return null;let n=this.app.canvas.getBoundingClientRect(),a=(e-n.left)*(this.app.renderer.width/n.width),r=(t-n.top)*(this.app.renderer.height/n.height),o=new $.Point;return i.toLocal(new $.Point(a,r),void 0,o),o}parseColor(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let i=e.trim().replace("#",""),n=Number.parseInt(i,16);if(Number.isFinite(n))return n}return t}};var on=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[qe("playable-portrait"),qe("iphone-14"),qe("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.hasForceSynced=!1;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=qe(e.defaultDevice||Si.id),this.debugPanel=new Ft,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let i=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=i===null?!0:i==="true"}catch{}let t="dark";try{let i=window.localStorage.getItem(this.getThemeStorageKey());(i==="light"||i==="dark")&&(t=i)}catch{}this.setTheme(t),this.sceneEditor=new rn({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0,this.scheduleForceSync()}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}scheduleForceSync(){this.hasForceSynced||(this.hasForceSynced=!0,window.setTimeout(()=>{let e=window.__HANDLER_ACTIVE_SCREEN;fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"})}).catch(i=>{console.warn("[PreviewShell] Force sync on refresh failed:",i)})},250))}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=qe(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier: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");try{window.localStorage.setItem(this.getThemeStorageKey(),e)}catch{}let t=this.container.querySelector("#theme-select");t&&(t.value=e),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),this.updateSceneVisibility(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let d=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:d})},r=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",r),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",r),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,r=()=>{let c=this.container.querySelector(".preview-main");if(!c)return 600;let p=c.getBoundingClientRect().width,u=i==="left"?this.container.querySelector(".debug-workbench"):this.container.querySelector(".scene-panel.scene-objects"),g=u?u.offsetWidth:i==="left"?350:300,m=p-g-200;return Math.max(200,m)},o=c=>{let d=i==="left"?c.clientX-n:n-c.clientX,p=r(),u=Math.max(200,Math.min(p,a+d));e.style.width=`${u}px`;let g=this.container.querySelector(".preview-main");if(g){let m=i==="left"?`${u}px`:g.style.gridTemplateColumns.split(" ")[0]||"300px",f=i==="right"?`${u}px`:g.style.gridTemplateColumns.split(" ")[2]||"350px",b=400;g.style.gridTemplateColumns=`${m} minmax(${b}px, 1fr) ${f}`}let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},l=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",l),e.classList.remove("resizing")};t.addEventListener("pointerdown",c=>{c.preventDefault(),n=c.clientX,a=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",l),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getThemeStorageKey(){return`handler_preview_theme::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&Ve(this.scenePane,e,i!=null?i:this.previewContainer),t&&nn(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let r=a.clientX,o=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=p=>{let u=p.clientX-r,g=Math.max(240,Math.min(l,o+u));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
2295
+ `,this.modal=e,this.attachEventListeners(),this.initializeCanvas()}initializeCanvas(){this.modal&&(this.canvas=this.modal.querySelector(".asset-crop-canvas"),this.canvas&&(this.ctx=this.canvas.getContext("2d"),this.canvas.width=400,this.canvas.height=300))}loadImage(){this.options&&(this.image=new Image,this.image.crossOrigin="anonymous",this.image.onload=()=>{this.initializeCrop(),this.render()},this.image.src=this.options.imageSrc)}initializeCrop(){var i;if(!this.image||!this.canvas)return;let e=this.image.width/this.image.height,t=this.canvas.width/this.canvas.height;e>t?(this.cropHeight=this.image.height,this.cropWidth=this.cropHeight*t,this.cropX=(this.image.width-this.cropWidth)/2,this.cropY=0):(this.cropWidth=this.image.width,this.cropHeight=this.cropWidth/t,this.cropX=0,this.cropY=(this.image.height-this.cropHeight)/2),(i=this.options)!=null&&i.aspectRatio&&this.applyAspectRatio(this.options.aspectRatio),this.fitToCanvas()}applyAspectRatio(e){if(!this.image)return;let t=this.image.width/this.image.height,i=this.cropX+this.cropWidth/2,n=this.cropY+this.cropHeight/2;e>t?(this.cropWidth=Math.min(this.image.width,this.cropHeight*e),this.cropHeight=this.cropWidth/e):(this.cropHeight=Math.min(this.image.height,this.cropWidth/e),this.cropWidth=this.cropHeight*e),this.cropX=Math.max(0,Math.min(this.image.width-this.cropWidth,i-this.cropWidth/2)),this.cropY=Math.max(0,Math.min(this.image.height-this.cropHeight,n-this.cropHeight/2))}fitToCanvas(){if(!this.image||!this.canvas)return;let e=this.canvas.width/this.cropWidth,t=this.canvas.height/this.cropHeight;this.scale=Math.min(e,t)*.9,this.panX=(this.canvas.width-this.cropWidth*this.scale)/2,this.panY=(this.canvas.height-this.cropHeight*this.scale)/2}render(){!this.ctx||!this.image||!this.canvas||(this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.save(),this.ctx.translate(this.panX,this.panY),this.ctx.scale(this.scale,this.scale),this.ctx.drawImage(this.image,-this.cropX,-this.cropY,this.image.width,this.image.height),this.ctx.restore(),this.drawCropOverlay(),this.updatePreview())}drawCropOverlay(){if(!this.ctx||!this.canvas)return;let e=this.panX,t=this.panY,i=this.cropWidth*this.scale,n=this.cropHeight*this.scale;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.clearRect(e,t,i,n),this.ctx.strokeStyle="#ffffff",this.ctx.lineWidth=2,this.ctx.strokeRect(e,t,i,n),this.ctx.fillStyle="#ffffff";let a=8;[[e,t],[e+i-a,t],[e,t+n-a],[e+i-a,t+n-a]].forEach(([o,l])=>{var c;(c=this.ctx)==null||c.fillRect(o,l,a,a)})}updatePreview(){if(!this.modal||!this.image)return;let e=this.modal.querySelector(".asset-crop-preview-canvas");if(!e)return;let t=e.getContext("2d");if(!t)return;let i=150;e.width=i,e.height=i;let n=i/this.cropWidth,a=i/this.cropHeight,r=Math.min(n,a),o=this.cropWidth*r,l=this.cropHeight*r,c=(i-o)/2,d=(i-l)/2;t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,c,d,o,l)}attachEventListeners(){if(!this.modal||!this.canvas)return;this.canvas.addEventListener("mousedown",this.handleMouseDown.bind(this)),this.canvas.addEventListener("mousemove",this.handleMouseMove.bind(this)),this.canvas.addEventListener("mouseup",this.handleMouseUp.bind(this)),this.canvas.addEventListener("wheel",this.handleWheel.bind(this)),this.canvas.addEventListener("touchstart",this.handleTouchStart.bind(this)),this.canvas.addEventListener("touchmove",this.handleTouchMove.bind(this)),this.canvas.addEventListener("touchend",this.handleTouchEnd.bind(this));let e=this.modal.querySelector(".asset-crop-zoom-slider");e==null||e.addEventListener("input",i=>{let n=parseFloat(i.target.value);this.setZoom(n)});let t=this.modal.querySelector(".asset-crop-aspect-select");t==null||t.addEventListener("change",i=>{let n=i.target.value;this.setAspectRatio(n)}),this.modal.addEventListener("click",i=>{switch(i.target.dataset.action){case"reset":this.reset();break;case"apply":this.applyCrop();break;case"cancel":case"close":this.close();break}}),this.modal.addEventListener("click",i=>{i.target===this.modal&&this.close()})}handleMouseDown(e){this.isDragging=!0,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.lastPanX=this.panX,this.lastPanY=this.panY,this.canvas.style.cursor="grabbing"}handleMouseMove(e){if(!this.isDragging)return;let t=e.clientX-this.dragStartX,i=e.clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleMouseUp(){this.isDragging=!1,this.canvas.style.cursor="grab"}handleWheel(e){e.preventDefault();let t=e.deltaY>0?.9:1.1;this.setZoom(this.scale*t)}handleTouchStart(e){e.touches.length===1&&(this.isDragging=!0,this.dragStartX=e.touches[0].clientX,this.dragStartY=e.touches[0].clientY,this.lastPanX=this.panX,this.lastPanY=this.panY)}handleTouchMove(e){if(!this.isDragging||e.touches.length!==1)return;e.preventDefault();let t=e.touches[0].clientX-this.dragStartX,i=e.touches[0].clientY-this.dragStartY;this.panX=this.lastPanX+t,this.panY=this.lastPanY+i,this.constrainPan(),this.render()}handleTouchEnd(){this.isDragging=!1}setZoom(e){this.scale=Math.max(.1,Math.min(3,e)),this.updateZoomUI(),this.constrainPan(),this.render()}setAspectRatio(e){let t;switch(e){case"1:1":t=1;break;case"4:3":t=4/3;break;case"16:9":t=16/9;break;case"3:2":t=3/2;break;default:t=void 0}t&&this.applyAspectRatio(t),this.fitToCanvas(),this.render()}updateZoomUI(){if(!this.modal)return;let e=this.modal.querySelector(".asset-crop-zoom-value"),t=this.modal.querySelector(".asset-crop-zoom-slider");e&&(e.textContent=`${this.scale.toFixed(1)}x`),t&&(t.value=this.scale.toString())}constrainPan(){if(!this.canvas)return;let e=this.cropWidth*this.scale,t=this.cropHeight*this.scale;this.panX=Math.max(this.canvas.width-e,Math.min(0,this.panX)),this.panY=Math.max(this.canvas.height-t,Math.min(0,this.panY))}reset(){this.initializeCrop(),this.render()}applyCrop(){var n;if(!this.image||!((n=this.options)!=null&&n.onCrop))return;let e=document.createElement("canvas"),t=e.getContext("2d");if(!t)return;e.width=this.cropWidth,e.height=this.cropHeight,t.drawImage(this.image,this.cropX,this.cropY,this.cropWidth,this.cropHeight,0,0,this.cropWidth,this.cropHeight);let i=e.toDataURL("image/png");this.options.onCrop(i),this.close()}close(){this.modal&&this.modal.parentNode&&this.modal.parentNode.removeChild(this.modal);let e=this.options;this.modal=null,this.canvas=null,this.ctx=null,this.image=null,this.options=null,e!=null&&e.onCancel&&e.onCancel()}};window.openAssetCrop=function(s){new _a().open(s)};K();var $=require("pixi.js");K();var rn=class{constructor(e){this.app=null;this.camera=new $.Container;this.mainContainer=new $.Container;this.uiContainer=new $.Container;this.gizmoLayer=new $.Container;this.screenFrame=new $.Graphics;this.gameFrame=new $.Graphics;this.gridLayer=new $.Graphics;this.spawnPointLayer=new $.Container;this.objectMap=new Map;this.selectedId=null;this.dragMode=null;this.dragStartPointer=null;this.dragStartPos=null;this.dragStartScale=1;this.dragStartRotation=0;this.dragStartAngle=0;this.dragStartDistance=1;this.dragAnchorLocal=null;this.dragStartValue=null;this.dragContainer=null;this.spawnPointDrag=null;this.lastGameFrameSize=null;this.cameraScale=1;this.isPanning=!1;this.panStart=null;this.panStartCamera=null;this.hasUserCamera=!1;this.resizeObserver=null;this.screenSyncRaf=null;this.gizmoOutline=new $.Graphics;this.moveHandle=new $.Graphics;this.scaleHandle=new $.Graphics;this.rotateHandle=new $.Graphics;this.isVisible=!0;this.applyQueued=!1;this.applyQueuedId=null;this.gridEnabled=!1;this.gridGap=50;this.gridAlpha=.25;this.lastPickPoint=null;this.lastPickIds=[];this.lastPickIndex=0;this.lastPickTime=0;this.playModeEnabled=!1;this.runtimeLayoutActive=!1;this.handleScreenChange=e=>{if(!(e!=null&&e.detail))return;let{width:t,height:i}=e.detail;!t||!i||(this.hasUserCamera=!1,this.updateLayout({width:t,height:i}),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid(),this.schedulePostScreenSync({width:t,height:i}))};this.handleActiveScreenChanged=()=>{this.isVisible&&this.syncFromConfig()};this.handleConfigChanged=e=>{if(!this.isVisible)return;this.updateLayout(),this.updateGrid();let t=e==null?void 0:e.detail;if(!t){this.syncFromConfig();return}let i=t.objectId,n=t.objectIds;if(i){this.syncFromConfig([i]);return}if(Array.isArray(n)&&n.length>0){this.syncFromConfig(n);return}this.syncFromConfig()};this.handleSceneRefresh=()=>{this.isVisible&&this.syncFromConfig()};this.handleAssetUpdated=e=>{var l;let t=(l=e==null?void 0:e.detail)!=null?l:{},i=t.objectId,n=t.texture;if(!i||!n)return;let a=this.objectMap.get(i);if(!a)return;let r=a.displayObject;if(r!=null&&r.texture)r.texture=n;else if(r!=null&&r.children){let c=r.children.find(d=>d==null?void 0:d.texture);c&&(c.texture=n)}let o=this.getEditableObjectConfig(i);o&&(a.assetKey=this.getAssetKey(o))};this.handleLayoutApplied=e=>{var r;if(!this.isVisible)return;let t=(r=e==null?void 0:e.detail)!=null?r:{},i=Number(t.width),n=Number(t.height),a=Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:this.getScreen();this.updateLayout(a),this.hasUserCamera||this.centerCamera(),this.syncFromConfig().then(()=>{this.playModeEnabled&&this.syncFromGameObjectsInternal(!0),this.updateGizmos(),this.updateGrid()})};this.handlePreviewSelect=e=>{var i,n;let t=(n=(i=e==null?void 0:e.detail)==null?void 0:i.objectId)!=null?n:null;this.setSelected(t,{silent:!0})};this.onStagePointerDown=e=>{if(!this.app||!this.isVisible||this.getPointerButton(e)!==0||this.isGizmoTarget(e==null?void 0:e.target))return;let i=this.getEventGlobalPoint(e);if(!i)return;let n=new $.Point(i.x,i.y),a=this.getPickCandidates(n);if(a.length===0){this.setSelected(null),this.lastPickIds=[],this.lastPickIndex=0,this.lastPickPoint=n,this.lastPickTime=performance.now();return}let r=performance.now(),o=this.areSameIds(a,this.lastPickIds),l=this.lastPickPoint&&this.distance(n,this.lastPickPoint)<=6,c=r-this.lastPickTime<1200,d=o&&l&&c?(this.lastPickIndex+1)%a.length:0,p=a[d];this.lastPickIds=a,this.lastPickIndex=d,this.lastPickPoint=n,this.lastPickTime=r,this.setSelected(p),this.playModeEnabled||this.startDrag("move",e)};this.handleGridSettings=e=>{var a,r,o;let t=(a=e==null?void 0:e.detail)==null?void 0:a.enabled,i=(r=e==null?void 0:e.detail)==null?void 0:r.gap,n=(o=e==null?void 0:e.detail)==null?void 0:o.alpha;typeof t=="boolean"&&(this.gridEnabled=t),typeof i=="number"&&Number.isFinite(i)&&i>2&&(this.gridGap=i),typeof n=="number"&&Number.isFinite(n)&&n>=0&&n<=1&&(this.gridAlpha=n),this.updateGrid()};this.handlePlayMode=e=>{var i;let t=(i=e==null?void 0:e.detail)==null?void 0:i.enabled;typeof t=="boolean"&&this.setPlayMode(t)};this.syncFromGameObjects=()=>{this.syncFromGameObjectsInternal(!1)};this.onSpawnPointDragMove=e=>{if(!this.spawnPointDrag)return;let t=this.getPointerInContainer(e.clientX,e.clientY,this.mainContainer);if(!t)return;let i=t.x+this.spawnPointDrag.offset.x,n=t.y+this.spawnPointDrag.offset.y;this.updateLiveSpawnPoint(this.spawnPointDrag.objectId,this.spawnPointDrag.index,i,n)};this.onSpawnPointDragEnd=()=>{if(!this.spawnPointDrag)return;let{objectId:e,startPoints:t}=this.spawnPointDrag,i=this.getEditableObjectConfig(e),n=i?this.getSpawnPoints(i):null;i&&n&&(this.setNestedValue(i,"logic.props.spawnPoints",t),ee({objectId:e,path:"logic.props.spawnPoints",value:n},{persist:!0,emitEvent:!0,trackHistory:!0}),this.queueLiveApply(e)),this.spawnPointDrag=null,window.dispatchEvent(new CustomEvent("inspector:refresh")),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd)};this.onDragMove=e=>{var r;if(!this.dragMode||!this.selectedId||!this.app||this.playModeEnabled)return;let t=this.objectMap.get(this.selectedId);if(!t)return;let i=(r=this.dragContainer)!=null?r:this.mainContainer,n=this.getPointerInContainer(e.clientX,e.clientY,i);if(!n||!this.dragStartPointer||!this.dragStartPos)return;let a=!1;if(this.dragMode==="move"){let o=n.x-this.dragStartPointer.x,l=n.y-this.dragStartPointer.y,c=this.dragStartPos.x+o,d=this.dragStartPos.y+l;t.displayObject.position.set(c,d),a=this.updateLiveConfigPosition(c,d)}else if(this.dragMode==="scale"){let o=new $.Point(this.dragStartPos.x,this.dragStartPos.y),l=Math.max(1,this.distance(n,o)),c=Math.max(.05,this.dragStartScale*(l/this.dragStartDistance));t.displayObject.scale.set(c),a=this.updateLiveConfigScale(c)}else if(this.dragMode==="rotate"){let o=new $.Point(this.dragStartPos.x,this.dragStartPos.y),c=Math.atan2(n.y-o.y,n.x-o.x)-this.dragStartAngle,d=this.dragStartRotation+c;t.displayObject.rotation=d,a=this.updateLiveConfigRotation(d)}this.updateGizmos(),a&&this.queueLiveApply(this.selectedId)};this.onDragEnd=()=>{var i,n,a,r,o,l,c;if(!this.dragMode||!this.selectedId)return;let e=this.selectedId,t=this.getEditableObjectConfig(e);if(t){let d=(i=t.transform)!=null?i:{};if(t.transform||(t.transform=d),this.dragMode==="move"&&this.dragStartValue){let p=d.position,u=Array.isArray(p)?[Number((n=p[0])!=null?n:0),Number((a=p[1])!=null?a:0)]:{x:Number((r=p==null?void 0:p.x)!=null?r:0),y:Number((o=p==null?void 0:p.y)!=null?o:0)};this.applyFinalOverride(e,"transform.position",u,this.dragStartValue)}else this.dragMode==="scale"?this.applyFinalOverride(e,"transform.scale",(l=d.scale)!=null?l:1,this.dragStartValue):this.dragMode==="rotate"&&this.applyFinalOverride(e,"transform.rotation",(c=d.rotation)!=null?c:0,this.dragStartValue);this.queueLiveApply(e)}window.dispatchEvent(new CustomEvent("inspector:refresh")),this.dragMode=null,this.dragStartPointer=null,this.dragStartPos=null,this.dragAnchorLocal=null,this.dragStartValue=null,this.dragContainer=null,window.removeEventListener("pointermove",this.onDragMove),window.removeEventListener("pointerup",this.onDragEnd)};this.onWheel=e=>{if(!this.app||!this.isVisible)return;e.preventDefault();let i=Math.sign(e.deltaY)<0?1.1:.9,n=Math.min(6,Math.max(.1,this.cameraScale*i)),a=new $.Point(this.app.renderer.width/2,this.app.renderer.height/2),r=this.camera.toLocal(a);this.cameraScale=n,this.camera.scale.set(n);let o=this.camera.toGlobal(r);this.camera.position.set(this.camera.position.x+(a.x-o.x),this.camera.position.y+(a.y-o.y)),this.hasUserCamera=!0,this.updateGizmos(),this.updateGrid()};this.onPanStart=e=>{e.button===2&&(this.isPanning=!0,this.panStart={x:e.clientX,y:e.clientY},this.panStartCamera={x:this.camera.position.x,y:this.camera.position.y},this.hasUserCamera=!0)};this.onPanMove=e=>{if(!this.isPanning||!this.panStart||!this.panStartCamera)return;let t=e.clientX-this.panStart.x,i=e.clientY-this.panStart.y;this.camera.position.set(this.panStartCamera.x+t,this.panStartCamera.y+i),this.updateGrid()};this.onPanEnd=()=>{this.isPanning=!1,this.panStart=null,this.panStartCamera=null};this.root=e.root,this.getScreen=e.getScreen}async mount(){this.app||(this.app=new $.Application,await this.app.init({resizeTo:this.root,autoDensity:!0,resolution:window.devicePixelRatio||1,antialias:!0,backgroundAlpha:0}),this.root.innerHTML="",this.root.appendChild(this.app.canvas),this.root.style.position="relative",this.root.style.overflow="hidden",this.app.stage.sortableChildren=!0,this.app.stage.eventMode="static",this.camera.sortableChildren=!0,this.mainContainer.sortableChildren=!0,this.uiContainer.sortableChildren=!0,this.spawnPointLayer.sortableChildren=!0,this.gizmoLayer.sortableChildren=!0,this.app.stage.addChild(this.camera),this.camera.addChild(this.screenFrame),this.camera.addChild(this.mainContainer),this.camera.addChild(this.gridLayer),this.camera.addChild(this.uiContainer),this.camera.addChild(this.spawnPointLayer),this.camera.addChild(this.gameFrame),this.camera.addChild(this.gizmoLayer),this.screenFrame.zIndex=-1,this.screenFrame.eventMode="none",this.mainContainer.zIndex=0,this.gridLayer.zIndex=2e4,this.gridLayer.eventMode="none",this.gridLayer.visible=!0,this.uiContainer.zIndex=5e4,this.spawnPointLayer.zIndex=8e4,this.spawnPointLayer.eventMode="passive",this.gameFrame.zIndex=85e3,this.gameFrame.eventMode="none",this.gizmoLayer.zIndex=1e5,this.gizmoLayer.addChild(this.gizmoOutline),this.gizmoLayer.addChild(this.moveHandle),this.gizmoLayer.addChild(this.scaleHandle),this.gizmoLayer.addChild(this.rotateHandle),this.gizmoOutline.eventMode="none",this.setupInteractions(),this.setupObservers(),this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.restoreScenePreferences(),this.refresh(),!this.isVisible&&this.app.ticker&&this.app.ticker.stop())}destroy(){var e;this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null),this.screenSyncRaf&&(cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=null),window.removeEventListener("handler-preview:screen",this.handleScreenChange),window.removeEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.removeEventListener("config:changed",this.handleConfigChanged),window.removeEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.removeEventListener("handler:layout-applied",this.handleLayoutApplied),window.removeEventListener("preview:select",this.handlePreviewSelect),window.removeEventListener("scene-editor:grid",this.handleGridSettings),window.removeEventListener("scene-editor:play-mode",this.handlePlayMode),window.removeEventListener("scene-editor:asset-updated",this.handleAssetUpdated),window.removeEventListener("pointermove",this.onSpawnPointDragMove),window.removeEventListener("pointerup",this.onSpawnPointDragEnd),this.app&&((e=this.app.ticker)==null||e.remove(this.syncFromGameObjects),this.app.stage.off("pointerdown",this.onStagePointerDown),this.app.destroy(!0),this.app=null)}setVisible(e){this.isVisible=e,!(!this.app||!this.app.ticker)&&(e?(this.app.ticker.start(),this.refresh(),this.updateGrid()):this.app.ticker.stop())}refresh(){this.syncFromConfig()}setupObservers(){window.addEventListener("handler-preview:screen",this.handleScreenChange),window.addEventListener("handler:active-screen-changed",this.handleActiveScreenChanged),window.addEventListener("config:changed",this.handleConfigChanged),window.addEventListener("handler:scene-objects-refresh",this.handleSceneRefresh),window.addEventListener("handler:layout-applied",this.handleLayoutApplied),window.addEventListener("preview:select",this.handlePreviewSelect),window.addEventListener("scene-editor:grid",this.handleGridSettings),window.addEventListener("scene-editor:play-mode",this.handlePlayMode),window.addEventListener("scene-editor:asset-updated",this.handleAssetUpdated),this.resizeObserver=new ResizeObserver(()=>{this.handleResize()}),this.resizeObserver.observe(this.root)}setupInteractions(){if(!this.app)return;let e=this.app.canvas;e.addEventListener("contextmenu",t=>t.preventDefault()),e.addEventListener("wheel",this.onWheel,{passive:!1}),e.addEventListener("pointerdown",this.onPanStart),window.addEventListener("pointermove",this.onPanMove),window.addEventListener("pointerup",this.onPanEnd),this.app.stage.on("pointerdown",this.onStagePointerDown),this.moveHandle.eventMode="static",this.moveHandle.cursor="move",this.scaleHandle.eventMode="static",this.scaleHandle.cursor="nwse-resize",this.rotateHandle.eventMode="static",this.rotateHandle.cursor="crosshair",this.moveHandle.on("pointerdown",t=>this.startDrag("move",t)),this.scaleHandle.on("pointerdown",t=>this.startDrag("scale",t)),this.rotateHandle.on("pointerdown",t=>this.startDrag("rotate",t))}handleResize(){this.app&&(this.updateLayout(),this.hasUserCamera||this.centerCamera(),this.updateGizmos(),this.updateGrid())}getPickCandidates(e){var i;let t=[];for(let[n,a]of this.objectMap.entries()){let r=a.displayObject;if(!r||r.visible===!1)continue;let o=(i=r.getBounds)==null?void 0:i.call(r);if(!o||o.width<=0||o.height<=0||e.x<o.x||e.x>o.x+o.width||e.y<o.y||e.y>o.y+o.height)continue;let l=r.parent,c=typeof(l==null?void 0:l.zIndex)=="number"?l.zIndex:0,d=typeof r.zIndex=="number"?r.zIndex:0,p=typeof(l==null?void 0:l.getChildIndex)=="function"?l.getChildIndex(r):0,u=c*1e6+d*1e3+p;t.push({id:n,order:u})}return t.sort((n,a)=>a.order-n.order),t.map(n=>n.id)}areSameIds(e,t){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i+=1)if(e[i]!==t[i])return!1;return!0}isGizmoTarget(e){return e&&this.spawnPointLayer.children.indexOf(e)!==-1?!0:e===this.moveHandle||e===this.scaleHandle||e===this.rotateHandle||e===this.gizmoOutline}restoreScenePreferences(){if(typeof window!="undefined"){try{let e=window.localStorage.getItem(this.getSceneStorageKey("grid_enabled")),t=window.localStorage.getItem(this.getSceneStorageKey("grid_gap")),i=window.localStorage.getItem(this.getSceneStorageKey("grid_alpha")),n=window.localStorage.getItem(this.getSceneStorageKey("play_mode"));if(e!==null&&(this.gridEnabled=e==="true"),t!==null){let a=Number(t);Number.isFinite(a)&&a>2&&(this.gridGap=a)}if(i!==null){let a=Number(i);Number.isFinite(a)&&a>=0&&a<=1&&(this.gridAlpha=a)}n!==null&&this.setPlayMode(n==="true")}catch{}this.updateGrid()}}getSceneStorageKey(e){let t=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${e}::${t}`}schedulePostScreenSync(e){this.screenSyncRaf&&cancelAnimationFrame(this.screenSyncRaf),this.screenSyncRaf=requestAnimationFrame(()=>{this.runPostScreenSync(e)})}async runPostScreenSync(e){this.screenSyncRaf=null,this.isVisible&&(this.updateLayout(e),this.hasUserCamera||this.centerCamera(),await this.syncFromConfig(),this.playModeEnabled&&this.syncFromGameObjectsInternal(!0),this.updateGizmos(),this.updateGrid())}getRuntimeScreenSize(){var a,r,o,l,c,d,p;let e=window.gameApp;if(e!=null&&e.renderer){let u=e.renderer.screen,g=Number((a=u==null?void 0:u.width)!=null?a:0),h=Number((r=u==null?void 0:u.height)!=null?r:0);if(Number.isFinite(g)&&g>0&&Number.isFinite(h)&&h>0)return{width:g,height:h};let f=Number((o=e.renderer.resolution)!=null?o:1)||1,m=Number((l=e.renderer.width)!=null?l:0)/f,b=Number((c=e.renderer.height)!=null?c:0)/f;if(Number.isFinite(m)&&m>0&&Number.isFinite(b)&&b>0)return{width:m,height:b}}let t=document.querySelector(".game-container"),i=Number((d=t==null?void 0:t.dataset)==null?void 0:d.screenWidth),n=Number((p=t==null?void 0:t.dataset)==null?void 0:p.screenHeight);return Number.isFinite(i)&&i>0&&Number.isFinite(n)&&n>0?{width:i,height:n}:null}getRuntimeLayoutReference(){var i;let e=window.__mainContainer;if(e)return e;let t=window.gameApp;return(i=t==null?void 0:t.stage)!=null?i:null}getRuntimeParentContainer(e){var l,c;let t=window.gameObjectManager;if(!(t!=null&&t.get))return null;let i=t.get(e),n=((l=i==null?void 0:i.getDisplayObject)==null?void 0:l.call(i))||(i==null?void 0:i.pixiObject)||i,a=n==null?void 0:n.parent;if(!a)return null;let r=this.getRuntimeLayoutReference(),o=(c=window.gameApp)==null?void 0:c.stage;return r&&o&&r===o?this.mainContainer:r&&typeof r.contains=="function"&&r.contains(a)?this.mainContainer:a===r||a===o?this.mainContainer:this.uiContainer}applyRuntimeTransform(e){var r,o,l,c,d,p,u,g,h,f,m,b,y,v;if(!e)return!1;let t=Number((o=(r=e.scale)==null?void 0:r.x)!=null?o:1),i=Number((c=(l=e.scale)==null?void 0:l.y)!=null?c:t),n=Number((p=(d=e.position)==null?void 0:d.x)!=null?p:0),a=Number((g=(u=e.position)==null?void 0:u.y)!=null?g:0);if(!Number.isFinite(t)||!Number.isFinite(i)||!Number.isFinite(n)||!Number.isFinite(a))return!1;if(this.mainContainer.scale.set(t,i),this.uiContainer.scale.set(t,i),this.mainContainer.position.set(n,a),this.uiContainer.position.set(n,a),e.pivot&&((h=this.mainContainer.pivot)!=null&&h.set)&&((f=this.uiContainer.pivot)!=null&&f.set)){let x=Number((b=(m=e.pivot)==null?void 0:m.x)!=null?b:0),L=Number((v=(y=e.pivot)==null?void 0:y.y)!=null?v:0);Number.isFinite(x)&&Number.isFinite(L)&&(this.mainContainer.pivot.set(x,L),this.uiContainer.pivot.set(x,L))}return typeof e.rotation=="number"&&(this.mainContainer.rotation=e.rotation,this.uiContainer.rotation=e.rotation),!0}getEditableConfig(){return window.__editableConfig||null}getEditableObjectConfig(e){var n,a;let t=window.getEditableObjectConfig;if(typeof t=="function")return t(e);let i=this.getEditableConfig();return i!=null&&i.objects?typeof i.objects.get=="function"?(n=i.objects.get(e))!=null?n:null:(a=i.objects[e])!=null?a:null:null}getEditableObjectIds(){let e=window.getEditableObjectList;if(typeof e=="function"){let i=e();if(Array.isArray(i))return i}let t=this.getEditableConfig();return t!=null&&t.objects?typeof t.objects.keys=="function"?Array.from(t.objects.keys()):Object.keys(t.objects):[]}async syncFromConfig(e){if(!this.app)return;let t=this.getEditableConfig();if(!(t!=null&&t.objects))return;let i=e!=null&&e.length?e:this.getEditableObjectIds(),n=new Set(i);if(!e)for(let a of Array.from(this.objectMap.keys()))n.has(a)||this.removeObject(a);for(let a of i){let r=this.getEditableObjectConfig(a);if(!r){this.removeObject(a);continue}await this.upsertObject(a,r)}this.updateGizmos(),this.updateSpawnPointHandles(),this.updateGameFrame(this.getScreen())}removeObject(e){var i,n;let t=this.objectMap.get(e);if(t){try{(n=(i=t.displayObject)==null?void 0:i.destroy)==null||n.call(i)}catch{}this.objectMap.delete(e),this.selectedId===e&&this.setSelected(null,{silent:!0})}}async upsertObject(e,t){let i=this.getAssetKey(t),n=this.objectMap.get(e),a=this.isUiConfig(e,t),r=this.getRuntimeParentContainer(e),o=a?this.uiContainer:this.mainContainer,l=r!=null?r:o;if(!n||n.assetKey!==i||n.isUi!==a){n&&this.removeObject(e);let d=await this.createDisplayObject(e,t);if(!d)return;l.addChild(d),this.objectMap.set(e,{id:e,displayObject:d,assetKey:i,isUi:a}),this.attachObjectInteraction(d,e)}let c=this.objectMap.get(e);c&&(c.displayObject.parent!==l&&l.addChild(c.displayObject),this.applyVisualConfig(c.displayObject,t),this.updateObjectTransform(c.displayObject,t))}async createDisplayObject(e,t){var o,l,c,d,p,u,g,h,f,m,b,y,v,x,L;if((o=t==null?void 0:t.render)!=null&&o.asset)try{if(((c=(l=t==null?void 0:t.render)==null?void 0:l.asset)==null?void 0:c.type)!=="json"){let O=await ue.create(e,t,this.app);if(O instanceof $.Container)return O}}catch(P){console.warn("[SceneEditor] ObjectFactory failed for",e,P)}let i=t==null?void 0:t.ui,n=(d=t==null?void 0:t.render)!=null?d:{},a=(i==null?void 0:i.text)||(i==null?void 0:i.kind)==="text";if(!!n.background_color){let P=this.getScreen(),O=(p=P==null?void 0:P.width)!=null?p:0,w=(u=P==null?void 0:P.height)!=null?u:0,k=new $.Graphics,j=this.parseColor(n.background_color,0),C=typeof n.background_alpha=="number"?n.background_alpha:1;O>0&&w>0&&k.rect(0,0,O,w).fill({color:j,alpha:C});let A=new $.Container;return A.addChild(k),A}if(a){let P=(h=(g=i==null?void 0:i.color)!=null?g:n==null?void 0:n.tint)!=null?h:"#ffffff",O=new $.TextStyle({fontFamily:"Arial, sans-serif",fontSize:(f=i==null?void 0:i.fontSize)!=null?f:16,fill:P,align:(m=i==null?void 0:i.align)!=null?m:"center",letterSpacing:(b=i==null?void 0:i.letterSpacing)!=null?b:0});return new $.Text({text:(y=i==null?void 0:i.text)!=null?y:"",style:O})}if((v=t==null?void 0:t.effects)!=null&&v.width||(x=t==null?void 0:t.effects)!=null&&x.height){let P=new $.Graphics,O=typeof t.effects.width=="number"?t.effects.width:100,w=typeof t.effects.height=="number"?t.effects.height:100,k=(L=t.effects.fill_color)!=null?L:"#ffffff",j=typeof t.effects.fill_alpha=="number"?t.effects.fill_alpha:1,C=Number.parseInt(String(k).replace("#",""),16);return P.rect(0,0,O,w).fill({color:Number.isFinite(C)?C:16777215,alpha:j}),P}return new $.Container}attachObjectInteraction(e,t){if(e&&(e.eventMode="static",e.cursor="pointer",!e.hitArea&&typeof e.getLocalBounds=="function")){let i=e.getLocalBounds();i&&i.width>0&&i.height>0&&(e.hitArea=new $.Rectangle(i.x,i.y,i.width,i.height))}}getAssetKey(e){var i;let t=(i=e==null?void 0:e.render)==null?void 0:i.asset;return t?`${t.type||"asset"}::${t.path||""}`:null}isUiConfig(e,t){var a,r;let i=(((a=t==null?void 0:t.identity)==null?void 0:a.category)||"").toString().toLowerCase(),n=(((r=t==null?void 0:t.identity)==null?void 0:r.id)||e||"").toString().toLowerCase();return i.includes("ui")||n.startsWith("ui")||n.includes("label")}applyVisualConfig(e,t){var r,o,l,c,d,p,u;if(!e)return;let i=(r=t==null?void 0:t.render)!=null?r:{};typeof i.alpha=="number"&&(e.alpha=i.alpha),e.visible=i.visible!==!1,e.zIndex=typeof i.z_index=="number"?i.z_index:0;let n=(d=(c=(o=t==null?void 0:t.render)==null?void 0:o.anchor)!=null?c:(l=t==null?void 0:t.transform)==null?void 0:l.anchor)!=null?d:"center",a=at(n,{x:.5,y:.5});if((p=e.anchor)!=null&&p.set)e.anchor.set(a.x,a.y);else if(e.pivot){let g=(u=e.getLocalBounds)==null?void 0:u.call(e);g&&e.pivot.set(g.width*a.x,g.height*a.y)}}updateObjectTransform(e,t){var d;if(!e||this.playModeEnabled)return;let i=(d=t==null?void 0:t.transform)!=null?d:{},n=e.parent===this.uiContainer?this.uiContainer:this.mainContainer,a=this.getAnchorLocalPoint(i,n),r=this.getPositionOffset(i),o=this.getDynamicScaleMultiplier();a&&e.position.set(a.x+r.x,a.y+r.y);let l=typeof i.scale=="number"?i.scale:void 0;typeof l=="number"&&e.scale&&e.scale.set(l*o);let c=this.toRadians(typeof i.rotation=="number"?i.rotation:0);typeof e.rotation=="number"&&(e.rotation=c)}getAnchorLocalPoint(e,t=this.mainContainer){var r;let i=this.getScreen();if(!(i!=null&&i.width)||!(i!=null&&i.height))return null;let n=(e==null?void 0:e.position_ratio)!=null?kt(i.width,i.height,e.position_ratio):Tt(i.width,i.height,(r=e==null?void 0:e.anchor)!=null?r:"center"),a=new $.Point;return t.toLocal(new $.Point(n.x,n.y),this.camera,a),a}getPositionOffset(e){var l,c,d,p,u,g,h,f;let t=e==null?void 0:e.position,i=e==null?void 0:e.offset,n=Array.isArray(t)?Number((l=t[0])!=null?l:0):Number((c=t==null?void 0:t.x)!=null?c:0),a=Array.isArray(t)?Number((d=t[1])!=null?d:0):Number((p=t==null?void 0:t.y)!=null?p:0),r=Array.isArray(i)?Number((u=i[0])!=null?u:0):Number((g=i==null?void 0:i.x)!=null?g:0),o=Array.isArray(i)?Number((h=i[1])!=null?h:0):Number((f=i==null?void 0:i.y)!=null?f:0);return{x:n+r,y:a+o}}updateLayout(e){var a,r,o,l,c,d,p,u;let t=e!=null?e:this.getScreen();if(!(t!=null&&t.width)||!(t!=null&&t.height))return;let i=this.getRuntimeLayoutReference(),n=this.applyRuntimeTransform(i);if(this.runtimeLayoutActive=n,!n){let h=(((r=(a=this.getEditableConfig())==null?void 0:a.engine)==null?void 0:r.runtime)||{}).layout||{},f=t.width*((o=he.layout.screen_scale_x)!=null?o:1),m=h.design_width_portrait||400,b=f/m;b=Math.min(b,1.15);let y=b*((l=he.engine.scale)!=null?l:1);this.mainContainer.scale.set(y),this.uiContainer.scale.set(y);let v=(c=h.main_container_anchor)!=null?c:"center",x=(d=h.main_container_position_ratio)!=null?d:{x:.5,y:.5},L=(p=h.main_container_offset)!=null?p:{x:0,y:0},P=h.main_container_position_ratio?kt(t.width,t.height,x):Tt(t.width,t.height,v),O=P.x+L.x+he.layout.position_offset.x,w=P.y+L.y+he.layout.position_offset.y;this.mainContainer.position.set(O,w),this.uiContainer.position.set(O,w)}this.screenFrame.clear(),this.screenFrame.rect(0,0,t.width,t.height),this.screenFrame.stroke({width:2,color:2894892,alpha:.5}),this.updateGameFrame(t),(u=this.app)!=null&&u.stage&&(this.app.stage.hitArea=new $.Rectangle(0,0,this.app.renderer.width,this.app.renderer.height)),this.updateSpawnPointHandles()}getDynamicScaleMultiplier(){var t,i,n,a;if(this.runtimeLayoutActive)return 1;let e=Number((a=(n=(t=nt)==null?void 0:t.scale)!=null?n:(i=le)==null?void 0:i.scaleFactor)!=null?a:1);return Number.isFinite(e)&&e>0?e:1}updateGrid(){if(!this.app)return;if(!this.gridEnabled){this.gridLayer.clear(),this.gridLayer.visible=!0;return}let e=Math.max(4,this.gridGap),t=this.app.renderer,i=this.camera.toLocal(new $.Point(0,0)),n=this.camera.toLocal(new $.Point(t.width,t.height)),a=Math.min(i.x,n.x),r=Math.max(i.x,n.x),o=Math.min(i.y,n.y),l=Math.max(i.y,n.y),c=400,d=Math.ceil((r-a)/e),p=Math.ceil((l-o)/e),u=e*Math.max(1,Math.ceil(d/c)),g=e*Math.max(1,Math.ceil(p/c)),h=Math.floor(a/u)*u,f=Math.floor(o/g)*g;this.gridLayer.clear(),this.gridLayer.visible=!0;for(let m=h;m<=r;m+=u)this.gridLayer.moveTo(m,o),this.gridLayer.lineTo(m,l);for(let m=f;m<=l;m+=g)this.gridLayer.moveTo(a,m),this.gridLayer.lineTo(r,m);this.gridLayer.stroke({width:1,color:16777215,alpha:this.gridAlpha})}updateGameFrame(e){var i;let t=(i=this.getRuntimeScreenSize())!=null?i:e;!(t!=null&&t.width)||!(t!=null&&t.height)||this.lastGameFrameSize&&this.lastGameFrameSize.width===t.width&&this.lastGameFrameSize.height===t.height||(this.lastGameFrameSize={width:t.width,height:t.height},this.gameFrame.clear(),this.gameFrame.rect(0,0,t.width,t.height),this.gameFrame.stroke({width:2,color:6333946,alpha:.35}))}setPlayMode(e){var t;this.playModeEnabled!==e&&(this.playModeEnabled=e,(t=this.app)!=null&&t.ticker&&(this.app.ticker.remove(this.syncFromGameObjects),e&&this.app.ticker.add(this.syncFromGameObjects)),e?(this.moveHandle.eventMode="none",this.scaleHandle.eventMode="none",this.rotateHandle.eventMode="none",this.syncFromGameObjectsInternal(!0)):(this.moveHandle.eventMode="static",this.scaleHandle.eventMode="static",this.rotateHandle.eventMode="static",this.syncFromConfig()),this.updateGizmos(),this.updateSpawnPointHandles())}syncFromGameObjectsInternal(e){var n,a,r,o,l,c,d,p;if(!this.app||!this.isVisible||!this.playModeEnabled&&!e)return;let t=window.gameObjectManager;if(!(t!=null&&t.get))return;let i=this.dragMode?this.selectedId:null;for(let[u,g]of this.objectMap.entries()){if(i&&u===i)continue;let h=t.get(u),f=((n=h==null?void 0:h.getDisplayObject)==null?void 0:n.call(h))||(h==null?void 0:h.pixiObject)||h;if(!f)continue;let m=(r=(a=g.displayObject)==null?void 0:a.parent)!=null?r:this.mainContainer,b=new $.Point;if(typeof f.getGlobalPosition=="function"){f.getGlobalPosition(b);let P=m.toLocal(b,this.camera);g.displayObject.position.set(P.x,P.y)}else if(f.worldTransform){b.set(f.worldTransform.tx,f.worldTransform.ty);let P=m.toLocal(b,this.camera);g.displayObject.position.set(P.x,P.y)}let y=this.getWorldScale(f);if(y){let P=Number((l=(o=m.scale)==null?void 0:o.x)!=null?l:1)||1,O=Number((d=(c=m.scale)==null?void 0:c.y)!=null?d:1)||1,w=y.x/P,k=y.y/O;(p=g.displayObject.scale)!=null&&p.set?g.displayObject.scale.set(w,k):g.displayObject.scale&&(g.displayObject.scale.x=w,g.displayObject.scale.y=k)}let v=this.getWorldRotation(f);if(typeof v=="number"){let P=m?m.rotation:0;g.displayObject.rotation=v-P}let x=f.parent,L=typeof(x==null?void 0:x.getChildIndex)=="function"?x.getChildIndex(f):0;typeof f.zIndex=="number"?g.displayObject.zIndex=f.zIndex:Number.isFinite(L)&&(g.displayObject.zIndex=L)}this.updateGizmos()}getWorldScale(e){var a,r;let t=(r=e==null?void 0:e.worldTransform)!=null?r:(a=e==null?void 0:e.transform)==null?void 0:a.worldTransform;if(!t)return null;let i=Math.sqrt(t.a*t.a+t.b*t.b),n=Math.sqrt(t.c*t.c+t.d*t.d);return!Number.isFinite(i)||!Number.isFinite(n)?null:{x:i,y:n}}getWorldRotation(e){var i,n;let t=(n=e==null?void 0:e.worldTransform)!=null?n:(i=e==null?void 0:e.transform)==null?void 0:i.worldTransform;if(t){let a=Math.atan2(t.b,t.a);return Number.isFinite(a)?a:null}return typeof(e==null?void 0:e.rotation)=="number"?e.rotation:null}centerCamera(){var a;if(!this.app)return;let e=(a=this.getRuntimeScreenSize())!=null?a:this.getScreen();if(!(e!=null&&e.width)||!(e!=null&&e.height))return;let t=this.app.renderer.width,i=this.app.renderer.height,n=Math.max(.01,Math.min(t/e.width,i/e.height));this.cameraScale=n,this.camera.scale.set(n),this.camera.position.set((t-e.width*n)/2,(i-e.height*n)/2)}updateGizmos(){var d,p;if(!this.selectedId||!this.isVisible){this.clearGizmos();return}let e=this.objectMap.get(this.selectedId);if(!(e!=null&&e.displayObject)){this.clearGizmos();return}let t=(p=(d=e.displayObject).getBounds)==null?void 0:p.call(d);if(!t||t.width<=0||t.height<=0){this.clearGizmos();return}let i=this.camera.toLocal(new $.Point(t.x,t.y)),n=this.camera.toLocal(new $.Point(t.x+t.width,t.y+t.height)),a=n.x-i.x,r=n.y-i.y,o=i.x+a/2,l=i.y+r/2;if(this.gizmoOutline.clear(),this.gizmoOutline.rect(i.x,i.y,a,r),this.gizmoOutline.stroke({width:2,color:16752394,alpha:.9}),this.playModeEnabled){this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear();return}let c=10;this.moveHandle.clear(),this.moveHandle.circle(0,0,c/2),this.moveHandle.fill({color:16752394,alpha:.9}),this.moveHandle.position.set(o,l),this.scaleHandle.clear(),this.scaleHandle.rect(-c/2,-c/2,c,c),this.scaleHandle.fill({color:3900150,alpha:.9}),this.scaleHandle.position.set(n.x,n.y),this.rotateHandle.clear(),this.rotateHandle.circle(0,0,c/2),this.rotateHandle.fill({color:1096065,alpha:.9}),this.rotateHandle.position.set(o,i.y-20)}clearGizmos(){this.gizmoOutline.clear(),this.moveHandle.clear(),this.scaleHandle.clear(),this.rotateHandle.clear()}updateSpawnPointHandles(){if(this.clearSpawnPointHandles(),!this.selectedId)return;let e=this.getEditableObjectConfig(this.selectedId);if(!e||!this.isSpawnerConfig(e))return;let t=this.getSpawnPoints(e);!t||t.length===0||t.forEach((i,n)=>{let a=new $.Graphics;a.circle(0,0,5).fill({color:16096779,alpha:.9}),a.circle(0,0,9).stroke({width:1,color:16096779,alpha:.45});let r=this.toCameraFromMain(i);a.position.set(r.x,r.y),a.cursor="move",a.eventMode=this.playModeEnabled?"none":"static",a.on("pointerdown",o=>this.startSpawnPointDrag(n,o)),this.spawnPointLayer.addChild(a)})}clearSpawnPointHandles(){this.spawnPointLayer.removeChildren().forEach(t=>{var i;(i=t.destroy)==null||i.call(t)})}isSpawnerConfig(e){var i,n;return((i=e==null?void 0:e.logic)==null?void 0:i.id)==="Spawner"?!0:String(((n=e==null?void 0:e.identity)==null?void 0:n.system_role)||"").toLowerCase().includes("spawner")}getSpawnPoints(e){var i,n;let t=(n=(i=e==null?void 0:e.logic)==null?void 0:i.props)==null?void 0:n.spawnPoints;return Array.isArray(t)?t.map(a=>{var r,o;return{x:Number((r=a==null?void 0:a.x)!=null?r:0),y:Number((o=a==null?void 0:a.y)!=null?o:0)}}):null}toCameraFromMain(e){let t=this.mainContainer.toGlobal(new $.Point(e.x,e.y)),i=new $.Point;return this.camera.toLocal(t,void 0,i),i}startSpawnPointDrag(e,t){var o,l;if(!this.selectedId||this.playModeEnabled)return;let i=this.getEditableObjectConfig(this.selectedId);if(!i)return;let n=this.getSpawnPoints(i);if(!n||!n[e])return;(o=t==null?void 0:t.stopPropagation)==null||o.call(t),(l=t==null?void 0:t.stopImmediatePropagation)==null||l.call(t);let a=this.getEventLocalPoint(t,this.mainContainer);if(!a)return;let r=n[e];this.spawnPointDrag={objectId:this.selectedId,index:e,offset:new $.Point(r.x-a.x,r.y-a.y),startPoints:n.map(c=>({x:c.x,y:c.y}))},window.addEventListener("pointermove",this.onSpawnPointDragMove),window.addEventListener("pointerup",this.onSpawnPointDragEnd)}updateLiveSpawnPoint(e,t,i,n){let a=this.getEditableObjectConfig(e);if(!a)return;let r=this.getSpawnPoints(a);if(!r||!r[t])return;let o=r.map((l,c)=>c===t?{x:i,y:n}:{x:l.x,y:l.y});this.setNestedValue(a,"logic.props.spawnPoints",o),this.queueLiveApply(e),this.updateSpawnPointHandles()}setSelected(e,t={}){if(this.selectedId!==e&&(this.selectedId=e,this.updateGizmos(),this.updateSpawnPointHandles(),!t.silent&&e)){let i=window.__previewSelectObject;typeof i=="function"&&i(e)}}startDrag(e,t){var d,p,u,g;if(!this.selectedId||!e||!this.app||this.playModeEnabled||this.getPointerButton(t)!==0)return;let n=this.objectMap.get(this.selectedId);if(!n)return;this.dragContainer=(p=(d=n.displayObject)==null?void 0:d.parent)!=null?p:this.mainContainer;let a=this.getEventLocalPoint(t,this.dragContainer);if(!a)return;let r=n.displayObject;this.dragMode=e,this.dragStartPointer=new $.Point(a.x,a.y),this.dragStartPos=new $.Point(r.position.x,r.position.y),this.dragStartScale=typeof((u=r.scale)==null?void 0:u.x)=="number"?r.scale.x:1;let o=this.getEditableObjectConfig(this.selectedId),l=(g=o==null?void 0:o.transform)!=null?g:{};this.dragStartRotation=this.toRadians(typeof l.rotation=="number"?l.rotation:0),this.dragAnchorLocal=this.getAnchorLocalPoint(l,this.dragContainer),this.dragStartValue=this.getDragStartValue(e,l);let c=new $.Point(r.position.x,r.position.y);this.dragStartAngle=Math.atan2(a.y-c.y,a.x-c.x),this.dragStartDistance=Math.max(1,this.distance(a,c)),window.addEventListener("pointermove",this.onDragMove),window.addEventListener("pointerup",this.onDragEnd)}getDragStartValue(e,t){var i,n,a;return e==="move"?(i=t==null?void 0:t.position)!=null?i:{x:0,y:0}:e==="scale"?(n=t==null?void 0:t.scale)!=null?n:1:e==="rotate"?(a=t==null?void 0:t.rotation)!=null?a:0:null}updateLiveConfigPosition(e,t){var g,h,f,m,b,y;if(!this.selectedId||!this.dragAnchorLocal)return!1;let i=e-this.dragAnchorLocal.x,n=t-this.dragAnchorLocal.y,a=this.getEditableObjectConfig(this.selectedId);if(!a)return!1;let r=(g=a.transform)!=null?g:{};a.transform||(a.transform=r);let o=(h=r.offset)!=null?h:{x:0,y:0},l=Array.isArray(o)?Number((f=o[0])!=null?f:0):Number((m=o==null?void 0:o.x)!=null?m:0),c=Array.isArray(o)?Number((b=o[1])!=null?b:0):Number((y=o==null?void 0:o.y)!=null?y:0),d=this.buildPositionValue(r,{x:i-l,y:n-c}),p=r.position;return(Array.isArray(d)?d[0]!==(p==null?void 0:p[0])||d[1]!==(p==null?void 0:p[1]):d.x!==(p==null?void 0:p.x)||d.y!==(p==null?void 0:p.y))?(this.setNestedValue(r,"position",d),!0):!1}updateLiveConfigScale(e){var o;if(!this.selectedId)return!1;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return!1;let i=(o=t.transform)!=null?o:{};t.transform||(t.transform=i);let n=this.getDynamicScaleMultiplier(),a=n>0?e/n:e,r=Math.round(a*100)/100;return i.scale!==r?(i.scale=r,!0):!1}updateLiveConfigRotation(e){var r;if(!this.selectedId)return!1;let t=this.getEditableObjectConfig(this.selectedId);if(!t)return!1;let i=(r=t.transform)!=null?r:{};t.transform||(t.transform=i);let n=this.toDegrees(e),a=typeof i.rotation=="number"?i.rotation:0;return Math.abs(n-a)>.01?(i.rotation=Math.round(n*100)/100,!0):!1}applyFinalOverride(e,t,i,n){let a=this.getEditableObjectConfig(e);a!=null&&a.transform&&this.setNestedValue(a.transform,t.replace("transform.",""),n),ee({objectId:e,path:t,value:i},{persist:!0,emitEvent:!0,trackHistory:!0})}queueLiveApply(e){this.applyQueuedId=e,!this.applyQueued&&(this.applyQueued=!0,requestAnimationFrame(()=>{this.applyQueued=!1;let t=this.applyQueuedId;if(!t)return;let i=this.getEditableObjectConfig(t),n=window.applyEditableObjectConfig;typeof n=="function"&&i&&n(t,i)}))}setNestedValue(e,t,i){let n=t.split("."),a=e;for(let r=0;r<n.length-1;r+=1){let o=n[r];(!a[o]||typeof a[o]!="object")&&(a[o]={}),a=a[o]}a[n[n.length-1]]=i}buildPositionValue(e,t){let i=e==null?void 0:e.position,n=Math.round(t.x*100)/100,a=Math.round(t.y*100)/100;return Array.isArray(i)?[n,a]:{x:n,y:a}}toRadians(e){return e*Math.PI/180}toDegrees(e){return e*180/Math.PI}distance(e,t){let i=e.x-t.x,n=e.y-t.y;return Math.sqrt(i*i+n*n)}getPointerButton(e){var t,i,n;return typeof(e==null?void 0:e.button)=="number"?e.button:typeof((t=e==null?void 0:e.data)==null?void 0:t.button)=="number"?e.data.button:typeof((n=(i=e==null?void 0:e.data)==null?void 0:i.originalEvent)==null?void 0:n.button)=="number"?e.data.originalEvent.button:0}getEventGlobalPoint(e){var l,c;let t=(c=e==null?void 0:e.global)!=null?c:(l=e==null?void 0:e.data)==null?void 0:l.global;if(t)return new $.Point(t.x,t.y);if(!this.app)return null;let i=e==null?void 0:e.clientX,n=e==null?void 0:e.clientY;if(typeof i!="number"||typeof n!="number")return null;let a=this.app.canvas.getBoundingClientRect(),r=(i-a.left)*(this.app.renderer.width/a.width),o=(n-a.top)*(this.app.renderer.height/a.height);return new $.Point(r,o)}getEventLocalPoint(e,t=this.mainContainer){var a,r;if(!this.app)return null;if(typeof(e==null?void 0:e.getLocalPosition)=="function"){let o=e.getLocalPosition(t);return new $.Point(o.x,o.y)}let i=(r=e==null?void 0:e.global)!=null?r:(a=e==null?void 0:e.data)==null?void 0:a.global;if(!i)return null;let n=new $.Point;return t.toLocal(new $.Point(i.x,i.y),void 0,n),n}getPointerInContainer(e,t,i){if(!this.app)return null;let n=this.app.canvas.getBoundingClientRect(),a=(e-n.left)*(this.app.renderer.width/n.width),r=(t-n.top)*(this.app.renderer.height/n.height),o=new $.Point;return i.toLocal(new $.Point(a,r),void 0,o),o}parseColor(e,t){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let i=e.trim().replace("#",""),n=Number.parseInt(i,16);if(Number.isFinite(n))return n}return t}};var on=class{constructor(e={}){this.isLandscape=!1;this.autoScale=1;this.userScaleMultiplier=1;this.viewMode="single";this.layoutMode="fixed";this.comparePresets=[qe("playable-portrait"),qe("iphone-14"),qe("ipad-mini")];this.activeCompareId="playable-portrait";this.compareViewports=new Map;this.resizeObserver=null;this.rafFitHandle=null;this.ignoreNextWindowResize=!1;this.frameDragOffsetX=0;this.frameDragOffsetY=0;this.frameDragActive=!1;this.frameDragStartX=0;this.frameDragStartY=0;this.frameDragOriginX=0;this.frameDragOriginY=0;this.isSpaceKeyPressed=!1;this.consolePanel=null;this.consoleMessages=[];this.isConsoleOpen=!1;this.originalConsole={log:console.log.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),info:console.info.bind(console)};this.sceneEditor=null;this.sceneVisiblePreference=!0;this.sceneVisible=!0;this.hasInitialFit=!1;this.isMounted=!1;this.isInitialized=!1;this.gameReady=!1;this.resizeListenersDisabled=!1;this.compareSnapshotTimer=null;this.hasUnsavedChanges=!1;this.hasForceSynced=!1;this.onWindowResize=e=>{if(this.ignoreNextWindowResize){this.ignoreNextWindowResize=!1;return}this.resizeListenersDisabled||!this.gameReady||this.scheduleFit()};this.onFrameDragMove=e=>{if(!this.frameDragActive)return;let t=e.clientX-this.frameDragStartX,i=e.clientY-this.frameDragStartY;this.frameDragOffsetX=this.frameDragOriginX+t,this.frameDragOffsetY=this.frameDragOriginY+i,this.applyFrameDrag(),this.updateDragCursor()};this.onFrameDragEnd=()=>{this.frameDragActive&&(this.frameDragActive=!1,window.removeEventListener("pointermove",this.onFrameDragMove),window.removeEventListener("pointerup",this.onFrameDragEnd),this.updateDragCursor())};this.options=e,this.currentPreset=qe(e.defaultDevice||Si.id),this.debugPanel=new Ft,this.container=this.createShell(),this.previewContainer=this.mustQuery(".preview-container"),this.singleStage=this.mustQuery('[data-preview-stage="single"]'),this.compareStage=this.mustQuery('[data-preview-stage="compare"]'),this.frameDragger=this.mustQuery(".frame-dragger"),this.frameWrapper=this.mustQuery(".frame-wrapper"),this.deviceFrame=this.mustQuery(".device-frame"),this.gameContainer=this.mustQuery(".game-container"),this.scenePane=this.mustQuery("[data-scene-pane]"),this.sceneRoot=this.mustQuery("#scene-editor-root"),this.sceneSplitter=this.mustQuery("[data-scene-splitter]"),this.gameViewPane=this.mustQuery("[data-game-pane]"),this.lastSinglePresetId=this.currentPreset.id,this.consolePanel=this.container.querySelector(".console-panel"),this.debugPanel.initialize(this.container),this.debugPanel.setupDebugEventListeners();try{let i=window.localStorage.getItem(this.getSceneVisibilityStorageKey());this.sceneVisiblePreference=i===null?!0:i==="true"}catch{}let t="dark";try{let i=window.localStorage.getItem(this.getThemeStorageKey());(i==="light"||i==="dark")&&(t=i)}catch{}this.setTheme(t),this.sceneEditor=new rn({root:this.sceneRoot,getScreen:()=>this.getScreen()}),this.sceneEditor.mount(),this.applyDeviceFrameStyles(),this.setupCompareViewports(),this.setupConsoleInterceptor(),this.setupObserversAndListeners(),this.setupFrameDragging(),this.setupSpaceKeyListener(),this.setupShortcutListeners(),this.setupUnsavedChangesIndicator(),this.setupScenePaneInteractions(),this.updateSceneVisibility(),this.setDevice(this.currentPreset.id,{suppressCallback:!0}),this.updateDockState(),this.isInitialized=!0,this.scheduleForceSync()}getShortcutKey(){return typeof navigator!="undefined"&&navigator.platform.toUpperCase().indexOf("MAC")>=0?"CMD":"CTRL"}mount(e=document.body){e.innerHTML="",e.appendChild(this.container),this.isMounted=!0,this.scheduleFit()}scheduleForceSync(){this.hasForceSynced||(this.hasForceSynced=!0,window.setTimeout(()=>{let e=window.__HANDLER_ACTIVE_SCREEN;fetch("/api/sync-screens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({force:!0,screenId:e==="loading"||e==="start"||e==="gameplay"||e==="tutorial"||e==="endgame"?e:"gameplay"})}).catch(i=>{console.warn("[PreviewShell] Force sync on refresh failed:",i)})},250))}destroy(){if(this.disableResizeListeners(),this.resizeObserver){try{this.resizeObserver.disconnect()}catch{}this.resizeObserver=null}window.removeEventListener("resize",this.onWindowResize),this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null),this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null),this.gameReady=!1,this.sceneEditor&&(this.sceneEditor.destroy(),this.sceneEditor=null)}getGameContainer(){return this.gameContainer}getScreen(){let e=this.getEffectivePreset();return{width:e.width,height:e.height}}getEffectivePreset(){var e;return this.isLandscape?{...this.currentPreset,width:this.currentPreset.height,height:this.currentPreset.width,ratio:((e=this.currentPreset.ratio)==null?void 0:e.split(":").reverse().join(":"))||this.currentPreset.ratio}:this.currentPreset}notifyGameLoaded(){var e;this.gameReady=!0,this.enableResizeListeners(),this.scheduleFit(),this.debugPanel.refresh(),(e=this.sceneEditor)==null||e.refresh(),requestAnimationFrame(()=>this.updatePanelPositions())}notifyGameDestroyed(){this.gameReady=!1,this.disableResizeListeners()}disableResizeListeners(){this.resizeListenersDisabled=!0,this.rafFitHandle&&(cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=null)}enableResizeListeners(){this.resizeListenersDisabled=!1}refresh(){this.options.onRefresh?this.options.onRefresh():window.location.reload()}setDevice(e,t={}){var n,a;let i=this.userScaleMultiplier;this.isLandscape=!1,this.currentPreset=qe(e),this.viewMode==="single"&&(this.lastSinglePresetId=this.currentPreset.id),this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier: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");try{window.localStorage.setItem(this.getThemeStorageKey(),e)}catch{}let t=this.container.querySelector("#theme-select");t&&(t.value=e),requestAnimationFrame(()=>this.updatePanelPositions())}setLayoutMode(e){if(this.layoutMode===e)return;this.layoutMode=e,this.container.classList.toggle("layout-fixed",e==="fixed"),this.container.classList.toggle("layout-draggable",e==="draggable"),Array.from(this.container.querySelectorAll("[data-layout-toggle]")).forEach(n=>n.classList.toggle("active",n.dataset.layoutToggle===e)),Array.from(this.container.querySelectorAll(".debug-workbench, .scene-panel")).forEach(n=>{n.style.left="",n.style.top="",n.style.width="",n.style.height="",n.style.zIndex=""}),this.scheduleFit(),this.updateDockState(),this.updatePanelPositions(),this.updateSceneVisibility(),window.dispatchEvent(new CustomEvent("inspector:refresh"))}updateDockState(){let e=this.container.querySelector("#bottom-dock");e==null||e.classList.remove("hidden");let t=this.container.querySelector("#console-messages"),i=this.container.querySelector("#dock-console-content");t&&i&&t.parentElement!==i&&i.appendChild(t)}makeBottomDockResizable(e,t){let i,n,a=o=>{let l=o.clientY-i,c=Math.max(100,Math.min(800,n-l));e.style.height=`${c}px`;let d=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:d})},r=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",r),e.classList.remove("resizing")};t.addEventListener("pointerdown",o=>{o.preventDefault(),i=o.clientY,n=e.offsetHeight,document.addEventListener("pointermove",a),document.addEventListener("pointerup",r),e.classList.add("resizing")})}makeSidebarResizable(e,t,i){let n,a,r=()=>{let c=this.container.querySelector(".preview-main");if(!c)return 600;let p=c.getBoundingClientRect().width,u=i==="left"?this.container.querySelector(".debug-workbench"):this.container.querySelector(".scene-panel.scene-objects"),g=u?u.offsetWidth:i==="left"?350:300,f=p-g-200;return Math.max(200,f)},o=c=>{let d=i==="left"?c.clientX-n:n-c.clientX,p=r(),u=Math.max(200,Math.min(p,a+d));e.style.width=`${u}px`;let g=this.container.querySelector(".preview-main");if(g){let f=i==="left"?`${u}px`:g.style.gridTemplateColumns.split(" ")[0]||"300px",m=i==="right"?`${u}px`:g.style.gridTemplateColumns.split(" ")[2]||"350px",b=400;g.style.gridTemplateColumns=`${f} minmax(${b}px, 1fr) ${m}`}let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},l=()=>{document.removeEventListener("pointermove",o),document.removeEventListener("pointerup",l),e.classList.remove("resizing")};t.addEventListener("pointerdown",c=>{c.preventDefault(),n=c.clientX,a=e.offsetWidth,document.addEventListener("pointermove",o),document.addEventListener("pointerup",l),e.classList.add("resizing")})}getSceneVisibilityStorageKey(){return`handler_preview_scene_visible::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getSceneWidthStorageKey(){return`handler_preview_scene_width::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}getThemeStorageKey(){return`handler_preview_theme::${typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default"}`}setupScenePaneInteractions(){let e=this.scenePane.querySelector("[data-scene-drag-handle]"),t=this.scenePane.querySelector("[data-scene-resize]"),i=this.container.querySelector("[data-preview-split]");e&&Ve(this.scenePane,e,i!=null?i:this.previewContainer),t&&nn(this.scenePane,t,void 0,260,200);let n=this.getStoredSceneWidth();n&&(this.scenePane.style.width=`${n}px`),this.sceneSplitter.addEventListener("pointerdown",a=>{if(this.layoutMode!=="fixed"||!this.sceneVisible)return;a.preventDefault();let r=a.clientX,o=this.scenePane.offsetWidth,l=Math.max(260,Math.min(720,this.previewContainer.clientWidth*.6)),c=p=>{let u=p.clientX-r,g=Math.max(240,Math.min(l,o+u));this.scenePane.style.width=`${g}px`;let h=this.autoScale*this.userScaleMultiplier;this.fitToScreen({keepVisibleScale:h})},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.storeSceneWidth(this.scenePane.offsetWidth)};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d)})}storeSceneWidth(e){try{window.localStorage.setItem(this.getSceneWidthStorageKey(),String(e))}catch{}}getStoredSceneWidth(){try{let e=window.localStorage.getItem(this.getSceneWidthStorageKey()),t=e?Number(e):null;return Number.isFinite(t)&&t?t:null}catch{return null}}updateSceneVisibility(){let e=this.viewMode==="single"&&this.sceneVisiblePreference;this.setSceneVisible(e,{persist:!1});let t=this.container.querySelector("#scene-toggle");t&&(t.classList.toggle("active",this.sceneVisiblePreference),t.setAttribute("aria-pressed",String(this.sceneVisiblePreference)))}setSceneVisible(e,t={}){var i;if(this.sceneVisible=e,this.container.classList.toggle("scene-hidden",!e),(i=this.sceneEditor)==null||i.setVisible(e),t.persist!==!1){this.sceneVisiblePreference=e;try{window.localStorage.setItem(this.getSceneVisibilityStorageKey(),String(e))}catch{}}this.scheduleFit()}createShell(){var t;let e=document.createElement("div");return e.className="preview-shell layout-fixed",e.innerHTML=`
2296
2296
  <div class="preview-toolbar">
2297
2297
  <div class="preview-toolbar-left">
2298
2298
  <span class="preview-logo">PREVIEWER</span>
@@ -2484,7 +2484,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2484
2484
  </div>
2485
2485
 
2486
2486
  </div>
2487
- `,this.setupEventListeners(e),e}setupEventListeners(e){var I,O,w,T,j,A,k,M;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",L=>{if(this.viewMode==="compare")return;let E=L.target.value;this.setDevice(E)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",L=>{let E=L.target.value;this.setTheme(E)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(L=>{L.addEventListener("click",()=>{let E=L.dataset.viewToggle;E&&this.setViewMode(E)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(L=>{L.addEventListener("click",()=>{let E=L.dataset.layoutToggle;E&&this.setLayoutMode(E)})});let r=e.querySelector("#scene-toggle");r==null||r.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let o=e.querySelector("#scene-hide-btn");o==null||o.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())});let l=L=>{let E=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${L}::${E}`},c=e.querySelector("#scene-grid-btn"),d=e.querySelector("#scene-play-btn"),p=(L,E,x)=>{L&&(L.textContent=E?`${x} On`:`${x} Off`,L.setAttribute("aria-pressed",E?"true":"false"))},u=()=>{let L=window.localStorage.getItem(l("grid_gap")),E=Number(L!=null?L:50);return Number.isFinite(E)?E:50},g=L=>{try{window.localStorage.setItem(l("grid_enabled"),L?"true":"false")}catch{}p(c,L,"Grid");let E=u();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:L,gap:E}}))},h=L=>{try{window.localStorage.setItem(l("play_mode"),L?"true":"false")}catch{}p(d,L,"Play"),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:L}}))};try{let L=window.localStorage.getItem(l("grid_enabled"))==="true",E=window.localStorage.getItem(l("play_mode"))==="true";if(p(c,L,"Grid"),p(d,E,"Play"),c){let x=u();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:L,gap:x}}))}d&&window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:E}}))}catch{}c==null||c.addEventListener("click",()=>{let L=c.getAttribute("aria-pressed")==="true";g(!L)}),d==null||d.addEventListener("click",()=>{let L=d.getAttribute("aria-pressed")==="true";h(!L)}),(I=e.querySelector("#rotate-btn"))==null||I.addEventListener("click",()=>this.toggleRotation()),(O=e.querySelector("#zoom-in-btn"))==null||O.addEventListener("click",()=>this.adjustUserZoom(.1)),(w=e.querySelector("#zoom-out-btn"))==null||w.addEventListener("click",()=>this.adjustUserZoom(-.1)),(T=e.querySelector("#refresh-btn"))==null||T.addEventListener("click",()=>this.refresh());let m=e.querySelector("#bottom-dock"),f=e.querySelector("#bottom-dock-resize");m&&f&&this.makeBottomDockResizable(m,f);let b=Array.from(e.querySelectorAll(".bottom-dock-tab"));b.forEach(L=>{L.addEventListener("click",()=>{let E=L.dataset.dockTab;if(!E)return;b.forEach(_=>_.classList.remove("active")),L.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(_=>{let P=_.dataset.dockPanel;_.classList.toggle("active",P===E)})})}),(j=e.querySelector("#console-clear"))==null||j.addEventListener("click",()=>this.clearConsole()),(A=e.querySelector("#corner-zoom-in-btn"))==null||A.addEventListener("click",()=>this.adjustUserZoom(.1)),(k=e.querySelector("#corner-zoom-out-btn"))==null||k.addEventListener("click",()=>this.adjustUserZoom(-.1)),(M=e.querySelector("#corner-grab-btn"))==null||M.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let y=e.querySelector(".scene-panel.scene-objects"),v=y==null?void 0:y.querySelector("[data-panel-resize-v]");y&&v&&this.makeSidebarResizable(y,v,"left");let S=e.querySelector(".debug-workbench"),C=S==null?void 0:S.querySelector("#workbench-resize-v");S&&C&&this.makeSidebarResizable(S,C,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let r=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(r,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}(e==null?void 0:e.keepUserScaleMultiplier)!==void 0&&e.keepUserScaleMultiplier>0?this.userScaleMultiplier=e.keepUserScaleMultiplier:e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.gameViewPane||this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),gi();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),hi();return}})}setupUnsavedChangesIndicator(){let e=this.container.querySelector("#preview-save-shortcut-text");e&&(e.textContent=`(${this.getShortcutKey()} + S)`),window.addEventListener("config:changed",()=>{this.updateUnsavedChangesIndicator()}),this.updateUnsavedChangesIndicator();let t=this.container.querySelector("#preview-save-btn");t==null||t.addEventListener("click",()=>{let i=document.querySelector("#apply-current-btn");i&&i.getAttribute("disabled")===null&&i.click()})}updateUnsavedChangesIndicator(){let t=Pe().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.container.querySelector("#preview-unsaved-star"),n=this.container.querySelector("#preview-save-btn");i&&(i.style.display=t?"inline-block":"none"),n&&(n.style.display=t?"inline-flex":"none")}}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(r=>typeof r=="object"?this.safeStringify(r):String(r)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let r=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=r>0?`${r}!`:"0",a.classList.toggle("has-errors",r>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(p=>p.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),r=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!a||!r||!o||!l||(t.addEventListener("click",p=>{let u=p.target;if(u!=null&&u.closest("[data-compare-focus]")){p.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:r,wrapper:o,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,r;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(r=(a=this.options).onDeviceChange)==null||r.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,r=n/e.preset.height,o=Math.max(.01,Math.min(a,r));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,r=t.canvas.height,o=Math.min(a/i.width,r/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,p=(r-c)/2;n.clearRect(0,0,a,r),n.drawImage(i,d,p,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.clientHeight-40}}let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function Oa(s={}){let e=new on(s);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function Ra(s){try{if(s&&typeof s.keys=="function")return Array.from(s.keys())}catch{}return[]}function jr(s){var e;return s?((e=s.getDisplayObject)==null?void 0:e.call(s))||s.pixiObject||s:null}function wl(s,e){if(!s||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);s.eventMode=i?"static":"none",s.interactive=i,i&&(s.cursor=t.draggable?"move":"pointer")}function _r(s,e){var l,c,d;if(!s||!e)return;let t=e.transform||{};wl(s,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),r=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=s.position)!=null&&l.set?s.position.set(a,r):(typeof s.x=="number"&&(s.x=a),typeof s.y=="number"&&(s.y=r)),typeof t.scale=="number"&&((c=s.scale)!=null&&c.set?s.scale.set(t.scale):s.scale&&(s.scale.x=t.scale,s.scale.y=t.scale));let o=t.anchor;if(o&&((d=s.anchor)!=null&&d.set)){let p=null;typeof window!="undefined"&&window.resolveAnchorVec2?p=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?p=o:Array.isArray(o)&&o.length===2&&(p={x:o[0],y:o[1]}),p&&typeof p.x=="number"&&typeof p.y=="number"&&s.anchor.set(p.x,p.y)}}function Or(s){if(typeof window=="undefined")return;let e=s==null?void 0:s.objects,t=Ra(e),i=a=>{try{let r=window.__HANDLER_ACTIVE_SCREEN;if(!r||r==="all")return a;let o=window.__HANDLER_SCREEN_INDEX,l=o==null?void 0:o.instanceToScreen;return l?a.filter(c=>l[c]===r):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Or(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Ra((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Ra((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var d,p,u,g,h;let r=(g=(u=(p=(d=window.__editableConfig)==null?void 0:d.objects)==null?void 0:p.get)==null?void 0:u.call(p,a))!=null?g:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let l=window.__HANDLER_SCREEN_INDEX,c=(h=l==null?void 0:l.instanceToScreen)==null?void 0:h[a];return c&&c===o?r:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let r={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(r.assets||{})),r}return a}}function xl(){if(typeof window=="undefined")return;let s=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,r,o;let n=s(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(it(),Ps))]),d=Date.now(),p=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),u=await l.load(p);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let h=window.gameObjectManager,m=(r=h==null?void 0:h.get)==null?void 0:r.call(h,t);if(m){let f=((o=m.getDisplayObject)==null?void 0:o.call(m))||m.pixiObject||m.pixi||m;if(f!=null&&f.texture)f.texture=u;else if(f!=null&&f.children){let b=f.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=Z();Array.isArray(i)&&i.length&&(window.__editableConfig=t,ke(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Z();Array.isArray(i)&&i.length&&(window.__editableConfig=t,ke(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,r]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:r});if(t.assets)for(let[a,r]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:r}),typeof r=="string"&&e(a,r);if(t.splash)for(let[a,r]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:r});if(t.loading)for(let[a,r]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:r});if(t.start)for(let[a,r]of Object.entries(t.start))n.push({path:`start.${a}`,value:r});n.length&&ke(n,{silent:!0,persist:!0,emitEvent:!0})}}function ln(s){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=s;t&&(t.onObjectRebuildRequired=async(a,r)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let p=window.gameApp,u=await pe.create(a,r,p);c&&(d!==void 0&&d!==-1?c.addChildAt(u,d):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(xl(),window.applyEditableObjectConfig=(a,r)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(a,r),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let p=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!p),p&&(console.log("[LIVE-EDIT] gameObject type:",(c=p.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof p.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof p.onConfigUpdate=="function")),p&&typeof p.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),p.updateConfig(r);else if(p&&typeof p.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),p.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=jr(p);_r(u,r)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,r){var d,p;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(a,r),console.log("[BRIDGE] \u2705 Updated config"));let l=(p=t==null?void 0:t.get)==null?void 0:p.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(r);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=jr(l);_r(u,r)}let c=[a];i==null||i(a,r,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,Or(a))}};return n.rebuildIndexes(),n}K();var $r=Ze(require("lottie-web"),1);Tn(An);typeof window!="undefined"&&!window.lottie&&(window.lottie=$r.default);var pt=null,Sl=async()=>{if(!pt){let s=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(s==null?void 0:s["handler.config"])||(s==null?void 0:s["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);pt=JSON.parse(i)}else pt=JSON.parse(e);return pt}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}pt=await(await fetch("./handler.config.json")).json()}return pt},Da,Ut,Dr,ut,za,$a;function El(s){Da=s.initGame,Ut=s.CustomAssets,Dr=s.updateScreenState,ut=s.globalResponsiveMultipliers,za=s.layout,$a=s.clearResponsiveElements}var cn="web_embed",Gt="https://example.com",Rr={profile_id:cn},Re=null,he=null,Bt={width:0,height:0},Cl=!0,Al=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let s=await Sl();Rr={...s.ids||{},profile_id:cn},Gt=s.destination_url||((d=(c=s.export_profiles)==null?void 0:c[cn])==null?void 0:d.destination_url)||Gt,De.init({ids:Rr,profile:cn,destinationUrl:Gt});let e=De.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),he=Oa({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),zr()},onRefresh:zr});let g=he.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var v,S,C,I,O,w,T,j,A,k,M,L,E;let m=window.gameApp,f=window.gameObjectManager,{width:b,height:y}=h.detail;if(Bt.width=b,Bt.height=y,Dr(b,y),!(!m||!m.renderer)){f&&o(m,f);try{m.renderer.resize(b,y);let x=m.view;x&&(x.style.width="100%",x.style.height="100%",x.style.display="block")}catch(x){console.warn("[SCREEN] Error resizing renderer:",x);return}if(t&&f&&za)try{let x=(v=window.__mainContainer)!=null?v:m.stage,_=(T=(w=(I=window.__tutorialLabel)!=null?I:(C=(S=f.get("label_1"))==null?void 0:S.getDisplayObject)==null?void 0:C.call(S))!=null?w:(O=f.get("label_1"))==null?void 0:O.pixiObject)!=null?T:f.get("label_1"),P=f.get("background_1"),R=(M=(k=(A=window.__background)!=null?A:(j=P==null?void 0:P.getDisplayObject)==null?void 0:j.call(P))!=null?k:P==null?void 0:P.pixiObject)!=null?M:P;if(x){let z=x===m.stage;za({mainContainer:x,label:_,background:R,backgroundTexture:(R==null?void 0:R.texture)||null,app:m},t,0,Bt,f,{skipMainContainerTransform:z}),window.dispatchEvent(new CustomEvent("handler:layout-applied",{detail:{width:Bt.width,height:Bt.height,presetId:(E=(L=h.detail)==null?void 0:L.presetId)!=null?E:null}}))}}catch(x){console.warn("[SCREEN] Error in layout:",x)}}})}let t=await Se("scene.main");window.__editableConfig=t,r(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Y(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(p=t.engine.runtime)==null?void 0:p.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Se("scene.main"));let i=await Da(e,t,Gt,he);Re=i.app;let n=i.gameObjectManager;window.gameApp=Re,window.gameObjectManager=n;try{window.__liveEditBridge=ln({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Ut})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}he&&he.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(ut.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(Re,n);async function r(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,S=await fetch(v,{cache:"no-cache"});if(!S.ok)return null;let C=await S.text();try{return JSON.parse(C)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let m=h.screens;if(!m||typeof m!="object")return;let f={},b={};for(let[y,v]of Object.entries(m)){let S=v==null?void 0:v.source;if(typeof S!="string")continue;let C=await g(S),I=C==null?void 0:C.elements;if(!Array.isArray(I))continue;let O=I.map(w=>w==null?void 0:w.instance_id).filter(w=>typeof w=="string");f[y]=O;for(let w of O)b[w]||(b[w]=y)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:f,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,h){if(Cl){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${ut.scale.toFixed(3)}`),g.stage){let f=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((S,C)=>{if(S&&S.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(S&&S.scale){let I=S.scale.x||1,O=S.scale.y||1;S.__originalScale||(S.__originalScale={x:I,y:O},console.log(`${v}[RESPONSIVE] Stored original scale for child[${C}]: ${I.toFixed(3)}, ${O.toFixed(3)}`));let w=S.__originalScale.x*ut.scale,T=S.__originalScale.y*ut.scale;typeof S.scale.set=="function"?S.scale.set(w,T):(S.scale.x=w,S.scale.y=T),console.log(`${v}[RESPONSIVE] Child[${C}] scale: ${I.toFixed(3)}\u2192${S.scale.x.toFixed(3)} (type: ${S.constructor.name})`),f(S,y+1)}else S&&console.log(`${v}[RESPONSIVE] Child[${C}] has no scale (type: ${S.constructor.name})`)})};var m=f;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),f(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){ut.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,m=window.gameObjectManager;h&&m?(o(h,m),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!m}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,De.start()},zr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let s=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(s){let a=((t=s.getDisplayObject)==null?void 0:t.call(s))||s;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(he){he.notifyGameDestroyed();try{$a&&$a()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=he.getGameContainer(),r=window.gameObjectManager;if(r&&typeof r.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),r.clear()),Re){try{Re.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}Re=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof Ut.resetScene=="function"&&Ut.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Se("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Y(o)),Da(a,o,Gt).then(l=>{Re=l.app,window.gameApp=Re,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=ln({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Ut})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}he&&he.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{De.start()}catch{}})})},100)},1e3)}};xi();K();var me={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Nr=1.25,Hr={fontFamily:"Inter, system-ui, sans-serif"};var dn=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=`
2487
+ `,this.setupEventListeners(e),e}setupEventListeners(e){var P,O,w,k,j,C,A,M;let t=e.querySelector("#device-select");t==null||t.addEventListener("change",T=>{if(this.viewMode==="compare")return;let E=T.target.value;this.setDevice(E)});let i=e.querySelector("#theme-select");i==null||i.addEventListener("change",T=>{let E=T.target.value;this.setTheme(E)}),Array.from(e.querySelectorAll("[data-view-toggle]")).forEach(T=>{T.addEventListener("click",()=>{let E=T.dataset.viewToggle;E&&this.setViewMode(E)})}),Array.from(e.querySelectorAll("[data-layout-toggle]")).forEach(T=>{T.addEventListener("click",()=>{let E=T.dataset.layoutToggle;E&&this.setLayoutMode(E)})});let r=e.querySelector("#scene-toggle");r==null||r.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!this.sceneVisiblePreference),this.updateSceneVisibility())});let o=e.querySelector("#scene-hide-btn");o==null||o.addEventListener("click",()=>{this.viewMode!=="compare"&&(this.setSceneVisible(!1),this.updateSceneVisibility())});let l=T=>{let E=typeof window!="undefined"&&window.__HANDLER_PROJECT_ID||"default";return`handler_preview_scene_${T}::${E}`},c=e.querySelector("#scene-grid-btn"),d=e.querySelector("#scene-play-btn"),p=(T,E,S)=>{T&&(T.textContent=E?`${S} On`:`${S} Off`,T.setAttribute("aria-pressed",E?"true":"false"))},u=()=>{let T=window.localStorage.getItem(l("grid_gap")),E=Number(T!=null?T:50);return Number.isFinite(E)?E:50},g=T=>{try{window.localStorage.setItem(l("grid_enabled"),T?"true":"false")}catch{}p(c,T,"Grid");let E=u();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:T,gap:E}}))},h=T=>{try{window.localStorage.setItem(l("play_mode"),T?"true":"false")}catch{}p(d,T,"Play"),window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:T}}))};try{let T=window.localStorage.getItem(l("grid_enabled"))==="true",E=window.localStorage.getItem(l("play_mode"))==="true";if(p(c,T,"Grid"),p(d,E,"Play"),c){let S=u();window.dispatchEvent(new CustomEvent("scene-editor:grid",{detail:{enabled:T,gap:S}}))}d&&window.dispatchEvent(new CustomEvent("scene-editor:play-mode",{detail:{enabled:E}}))}catch{}c==null||c.addEventListener("click",()=>{let T=c.getAttribute("aria-pressed")==="true";g(!T)}),d==null||d.addEventListener("click",()=>{let T=d.getAttribute("aria-pressed")==="true";h(!T)}),(P=e.querySelector("#rotate-btn"))==null||P.addEventListener("click",()=>this.toggleRotation()),(O=e.querySelector("#zoom-in-btn"))==null||O.addEventListener("click",()=>this.adjustUserZoom(.1)),(w=e.querySelector("#zoom-out-btn"))==null||w.addEventListener("click",()=>this.adjustUserZoom(-.1)),(k=e.querySelector("#refresh-btn"))==null||k.addEventListener("click",()=>this.refresh());let f=e.querySelector("#bottom-dock"),m=e.querySelector("#bottom-dock-resize");f&&m&&this.makeBottomDockResizable(f,m);let b=Array.from(e.querySelectorAll(".bottom-dock-tab"));b.forEach(T=>{T.addEventListener("click",()=>{let E=T.dataset.dockTab;if(!E)return;b.forEach(_=>_.classList.remove("active")),T.classList.add("active"),Array.from(e.querySelectorAll(".bottom-dock-panel")).forEach(_=>{let I=_.dataset.dockPanel;_.classList.toggle("active",I===E)})})}),(j=e.querySelector("#console-clear"))==null||j.addEventListener("click",()=>this.clearConsole()),(C=e.querySelector("#corner-zoom-in-btn"))==null||C.addEventListener("click",()=>this.adjustUserZoom(.1)),(A=e.querySelector("#corner-zoom-out-btn"))==null||A.addEventListener("click",()=>this.adjustUserZoom(-.1)),(M=e.querySelector("#corner-grab-btn"))==null||M.addEventListener("click",()=>{this.frameDragger.style.cursor="grab",setTimeout(()=>{this.isSpaceKeyPressed||(this.frameDragger.style.cursor="")},1e3)});let y=e.querySelector(".scene-panel.scene-objects"),v=y==null?void 0:y.querySelector("[data-panel-resize-v]");y&&v&&this.makeSidebarResizable(y,v,"left");let x=e.querySelector(".debug-workbench"),L=x==null?void 0:x.querySelector("#workbench-resize-v");x&&L&&this.makeSidebarResizable(x,L,"right")}applyDeviceFrameStyles(){Object.assign(this.frameDragger.style,{display:"flex",justifyContent:"center",alignItems:"center",transform:"translate(0px, 0px)",touchAction:"none"}),Object.assign(this.frameWrapper.style,{display:"flex",justifyContent:"center",alignItems:"center",transformOrigin:"center center",transition:"transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)",boxShadow:"var(--ui-shadow-strong)",borderRadius:"0px",willChange:"transform"}),Object.assign(this.deviceFrame.style,{overflow:"hidden",position:"relative",borderRadius:"0px"}),Object.assign(this.gameContainer.style,{position:"relative",overflow:"hidden",minWidth:"0px",minHeight:"0px"})}setupObserversAndListeners(){this.resizeObserver=new ResizeObserver(()=>{this.resizeListenersDisabled||this.scheduleFit()}),this.resizeObserver.observe(this.previewContainer),window.addEventListener("resize",this.onWindowResize,{passive:!0})}scheduleFit(){this.rafFitHandle&&cancelAnimationFrame(this.rafFitHandle),this.rafFitHandle=requestAnimationFrame(()=>{this.rafFitHandle=null,this.fitToScreen()})}applyPresetDimensions(){let e=this.getEffectivePreset(),t=`${e.width}px`,i=`${e.height}px`;this.deviceFrame.style.width=t,this.deviceFrame.style.height=i,this.gameContainer.style.width=t,this.gameContainer.style.height=i,this.gameContainer.style.maxWidth=t,this.gameContainer.style.maxHeight=i,this.gameContainer.style.minWidth=t,this.gameContainer.style.minHeight=i,this.gameContainer.dataset.screenWidth=String(e.width),this.gameContainer.dataset.screenHeight=String(e.height),this.container.style.setProperty("--preview-screen-width",String(e.width)),this.container.style.setProperty("--preview-screen-height",String(e.height))}fitToScreen(e){if(!this.previewContainer)return;let t=this.getEffectivePreset(),i=this.getFitBounds(),n=Math.max(0,i.width),a=Math.max(0,i.height);if(n<=0||a<=0)return;this.applyPresetDimensions(),this.viewMode==="compare"&&this.applyCompareDimensions();let r=n/t.width,o=a/t.height;if(this.autoScale=Math.max(.01,Math.min(r,o)),!this.hasInitialFit){this.hasInitialFit=!0;let l=.6;this.userScaleMultiplier=l/this.autoScale}(e==null?void 0:e.keepUserScaleMultiplier)!==void 0&&e.keepUserScaleMultiplier>0?this.userScaleMultiplier=e.keepUserScaleMultiplier:e!=null&&e.keepVisibleScale&&e.keepVisibleScale>0&&(this.userScaleMultiplier=e.keepVisibleScale/this.autoScale),this.applyTransform(),this.viewMode==="compare"&&this.fitCompareGhosts(),requestAnimationFrame(()=>this.updatePanelPositions()),this.emitScreenChange()}applyTransform(){let e=this.autoScale*this.userScaleMultiplier;this.frameWrapper.style.transform=`scale(${e})`;let t=this.container.querySelector("#zoom-label");t&&(t.textContent=`${Math.round(e*100)}%`),requestAnimationFrame(()=>this.updatePanelPositions())}applyFrameDrag(){this.frameDragger.style.transform=`translate(${this.frameDragOffsetX}px, ${this.frameDragOffsetY}px)`,requestAnimationFrame(()=>this.updatePanelPositions())}updatePanelPositions(){if(!this.gameReady||this.viewMode==="compare")return;let e=this.container.querySelector('[data-panel="scene-tools-corner"]'),t=this.container.querySelector('[data-panel="nudge-panel"]');if(this.layoutMode==="fixed"){let i=this.gameViewPane||this.container.querySelector(".preview-container");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}else{let i=this.container.querySelector(".preview-main");i&&(e&&e.parentElement!==i&&i.appendChild(e),t&&t.parentElement!==i&&i.appendChild(t))}e&&(e.style.zIndex="100"),t&&(t.style.position="absolute",t.style.left="50%",t.style.top="16px",t.style.transform="translateX(calc(-50% + 200px))",t.style.zIndex="100")}setupFrameDragging(){this.frameDragger.addEventListener("pointerdown",e=>{let t=!this.gameContainer.contains(e.target);!this.isSpaceKeyPressed&&!t||e.button===0&&(e.preventDefault(),this.frameDragActive=!0,this.frameDragStartX=e.clientX,this.frameDragStartY=e.clientY,this.frameDragOriginX=this.frameDragOffsetX,this.frameDragOriginY=this.frameDragOffsetY,window.addEventListener("pointermove",this.onFrameDragMove),window.addEventListener("pointerup",this.onFrameDragEnd))})}setupSpaceKeyListener(){window.addEventListener("keydown",e=>{e.code==="Space"&&!this.isInputFocused()&&(this.isSpaceKeyPressed||(this.isSpaceKeyPressed=!0,this.updateDragCursor(),e.preventDefault()))}),window.addEventListener("keyup",e=>{e.code==="Space"&&(this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd())}),window.addEventListener("blur",()=>{this.isSpaceKeyPressed=!1,this.updateDragCursor(),this.frameDragActive&&this.onFrameDragEnd()})}isInputFocused(){let e=document.activeElement;if(!e)return!1;let t=e.tagName.toLowerCase();return t==="input"||t==="textarea"||t==="select"||e.isContentEditable}setupShortcutListeners(){window.addEventListener("keydown",e=>{if(this.isInputFocused())return;let t=navigator.platform.toUpperCase().indexOf("MAC")>=0,i=e.ctrlKey||e.metaKey,n=e.shiftKey;if(i&&e.key==="s"&&!n){e.preventDefault();let a=document.querySelector("#apply-current-btn");a&&a.getAttribute("disabled")===null&&a.click();return}if(i&&e.key==="z"&&!n){e.preventDefault(),gi();return}if(i&&(e.key==="z"&&n||e.key==="y"&&!n)){e.preventDefault(),hi();return}})}setupUnsavedChangesIndicator(){let e=this.container.querySelector("#preview-save-shortcut-text");e&&(e.textContent=`(${this.getShortcutKey()} + S)`),window.addEventListener("config:changed",()=>{this.updateUnsavedChangesIndicator()}),this.updateUnsavedChangesIndicator();let t=this.container.querySelector("#preview-save-btn");t==null||t.addEventListener("click",()=>{let i=document.querySelector("#apply-current-btn");i&&i.getAttribute("disabled")===null&&i.click()})}updateUnsavedChangesIndicator(){let t=Pe().hasChanges;if(t!==this.hasUnsavedChanges){this.hasUnsavedChanges=t;let i=this.container.querySelector("#preview-unsaved-star"),n=this.container.querySelector("#preview-save-btn");i&&(i.style.display=t?"inline-block":"none"),n&&(n.style.display=t?"inline-flex":"none")}}updateDragCursor(){this.isSpaceKeyPressed?(this.frameDragger.style.cursor="grab",this.frameDragActive&&(this.frameDragger.style.cursor="grabbing")):this.frameDragger.style.cursor=""}adjustUserZoom(e){this.userScaleMultiplier=Math.max(.1,Math.min(6,this.userScaleMultiplier+e)),this.applyTransform(),this.emitScreenChange()}toggleRotation(){var t,i;if(this.viewMode==="compare")return;let e=this.userScaleMultiplier;this.isLandscape=!this.isLandscape,this.applyPresetDimensions(),this.fitToScreen({keepUserScaleMultiplier:e}),(i=(t=this.options).onDeviceChange)==null||i.call(t,this.getEffectivePreset()),this.emitScreenChange()}emitScreenChange(){if(!this.gameReady)return;let e=this.getEffectivePreset(),t={width:e.width,height:e.height,dpr:Math.max(1,Math.floor(window.devicePixelRatio||1)),presetId:e.id,isLandscape:this.isLandscape};if(window.dispatchEvent(new CustomEvent("handler-preview:screen",{detail:t})),this.viewMode==="compare"&&this.refreshCompareSnapshots(),this.isInitialized&&this.isMounted&&this.gameReady){let i=window.gameApp;if(!(i!=null&&i.renderer))return;this.ignoreNextWindowResize=!0,window.dispatchEvent(new Event("resize"))}}safeStringify(e){var i;let t=new WeakSet;try{return JSON.stringify(e,(n,a)=>{if(typeof a=="object"&&a!==null){if(t.has(a))return"[Circular]";t.add(a)}return a},2)}catch{try{if(e&&((i=e.constructor)!=null&&i.name))return`[object ${e.constructor.name}]`}catch{}return String(e)}}setupConsoleInterceptor(){let e=(t,...i)=>{let n=i.map(r=>typeof r=="object"?this.safeStringify(r):String(r)).join(" ");this.consoleMessages.push({type:t,message:n,timestamp:new Date}),this.appendConsoleMessage(this.consoleMessages[this.consoleMessages.length-1]);let a=this.container.querySelector("#console-badge");if(a){let r=this.consoleMessages.filter(o=>o.type==="error").length;a.textContent=r>0?`${r}!`:"0",a.classList.toggle("has-errors",r>0)}};console.log=(...t)=>{this.originalConsole.log(...t),e("log",...t)},console.warn=(...t)=>{this.originalConsole.warn(...t),e("warn",...t)},console.error=(...t)=>{this.originalConsole.error(...t),e("error",...t)},console.info=(...t)=>{this.originalConsole.info(...t),e("info",...t)}}appendConsoleMessage(e){let t=this.container.querySelector("#console-messages");if(!t)return;let i=document.createElement("div");i.className=`console-msg type-${e.type}`;let n=e.timestamp.toLocaleTimeString();i.innerHTML=`<span class="time">${this.escapeHtml(n)}</span> <pre>${this.escapeHtml(e.message)}</pre>`,t.appendChild(i),t.scrollTop=t.scrollHeight}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}toggleConsole(e){var t;if(this.layoutMode==="fixed"){let i=this.container.querySelector('[data-dock-tab="console"]');if(i){i.click();let n=this.container.querySelector("#bottom-dock");n==null||n.classList.remove("hidden")}return}this.isConsoleOpen=e!=null?e:!this.isConsoleOpen,(t=this.consolePanel)==null||t.classList.toggle("closed",!this.isConsoleOpen)}clearConsole(){this.consoleMessages=[];let e=this.container.querySelector("#console-messages");e&&(e.innerHTML="");let t=this.container.querySelector("#console-badge");t&&(t.textContent="0")}setupCompareViewports(){Array.from(this.container.querySelectorAll("[data-viewport]")).forEach(t=>{let i=t.dataset.viewport;if(!i)return;let n=this.comparePresets.find(p=>p.id===i);if(!n)return;let a=t.querySelector("[data-compare-slot]"),r=t.querySelector("[data-compare-ghost]"),o=t.querySelector("[data-compare-wrapper]"),l=t.querySelector("[data-compare-frame]"),c=t.querySelector("[data-compare-snapshot]"),d=t.querySelector("[data-compare-focus]");!a||!r||!o||!l||(t.addEventListener("click",p=>{let u=p.target;if(u!=null&&u.closest("[data-compare-focus]")){p.preventDefault(),this.activateCompareViewport(i);return}t.classList.contains("is-active")||this.activateCompareViewport(i)}),this.compareViewports.set(i,{preset:n,root:t,slot:a,ghost:r,wrapper:o,frame:l,canvas:c,focus:d}))})}setViewMode(e){if(this.viewMode===e)return;this.viewMode=e,this.container.classList.toggle("compare-mode",e==="compare"),this.singleStage.classList.toggle("hidden",e!=="single"),this.compareStage.classList.toggle("hidden",e!=="compare");let t=this.container.querySelector("#device-select");t&&(t.disabled=e==="compare");let i=this.container.querySelector("#rotate-btn");i&&(i.disabled=e==="compare");let n=this.container.querySelector("#scene-toggle");if(n&&(n.disabled=e==="compare"),this.updateViewToggleUI(),e==="compare"){this.lastSinglePresetId=this.currentPreset.id,this.activateCompareViewport(this.activeCompareId),this.refreshCompareSnapshots(),this.startCompareSnapshots(),this.updateSceneVisibility();return}this.stopCompareSnapshots(),this.singleStage.appendChild(this.frameDragger),this.setDevice(this.lastSinglePresetId,{suppressCallback:!0}),this.fitToScreen(),this.updateSceneVisibility()}updateViewToggleUI(){Array.from(this.container.querySelectorAll("[data-view-toggle]")).forEach(t=>{t.classList.toggle("active",t.dataset.viewToggle===this.viewMode)})}activateCompareViewport(e){var a,r;let t=this.compareViewports.get(e);if(!t)return;let i=this.autoScale*this.userScaleMultiplier,n=this.activeCompareId;n&&n!==e&&this.captureCompareSnapshot(n),this.activeCompareId=e,this.currentPreset=t.preset,this.isLandscape=!1,t.slot.appendChild(this.frameDragger),this.frameDragOffsetX=0,this.frameDragOffsetY=0,this.applyFrameDrag(),this.compareViewports.forEach((o,l)=>{o.root.classList.toggle("is-active",l===e),o.ghost.classList.toggle("hidden",l===e),o.focus&&(o.focus.textContent=l===e?"Live":"Focus")}),this.applyPresetDimensions(),this.applyCompareDimensions(),this.fitToScreen({keepVisibleScale:i}),(r=(a=this.options).onDeviceChange)==null||r.call(a,this.getEffectivePreset())}applyCompareDimensions(){this.compareViewports.forEach(e=>{let t=e.preset,i=`${t.width}px`,n=`${t.height}px`;e.frame.style.width=i,e.frame.style.height=n,e.canvas&&(e.canvas.width=t.width,e.canvas.height=t.height)})}fitCompareGhosts(){this.compareViewports.forEach(e=>{let t=e.root.querySelector(".compare-body");if(!t)return;let i=Math.max(0,t.clientWidth-24),n=Math.max(0,t.clientHeight-24);if(i<=0||n<=0)return;let a=i/e.preset.width,r=n/e.preset.height,o=Math.max(.01,Math.min(a,r));e.wrapper.style.transform=`scale(${o})`})}captureCompareSnapshot(e){let t=this.compareViewports.get(e);if(!(t!=null&&t.canvas))return;let i=this.gameContainer.querySelector("canvas");if(!i)return;let n=t.canvas.getContext("2d");if(!n)return;let a=t.canvas.width,r=t.canvas.height,o=Math.min(a/i.width,r/i.height),l=i.width*o,c=i.height*o,d=(a-l)/2,p=(r-c)/2;n.clearRect(0,0,a,r),n.drawImage(i,d,p,l,c)}refreshCompareSnapshots(){this.compareViewports.forEach((e,t)=>{t!==this.activeCompareId&&this.captureCompareSnapshot(t)})}startCompareSnapshots(){this.compareSnapshotTimer||(this.compareSnapshotTimer=window.setInterval(()=>{this.viewMode==="compare"&&this.refreshCompareSnapshots()},500))}stopCompareSnapshots(){this.compareSnapshotTimer&&(window.clearInterval(this.compareSnapshotTimer),this.compareSnapshotTimer=null)}getFitBounds(){if(this.viewMode!=="compare"){let i=this.gameViewPane||this.previewContainer;return{width:i.clientWidth-40,height:i.clientHeight-40}}let e=this.compareViewports.get(this.activeCompareId),t=e==null?void 0:e.root.querySelector(".compare-body");return t?{width:t.clientWidth-24,height:t.clientHeight-24}:{width:this.previewContainer.clientWidth-40,height:this.previewContainer.clientHeight-40}}mustQuery(e){let t=this.container.querySelector(e);if(!t)throw new Error(`PreviewShell missing element: ${e}`);return t}};function Oa(s={}){let e=new on(s);return typeof window!="undefined"&&(window.__previewShell=e),e.mount(),e}K();function Ra(s){try{if(s&&typeof s.keys=="function")return Array.from(s.keys())}catch{}return[]}function jr(s){var e;return s?((e=s.getDisplayObject)==null?void 0:e.call(s))||s.pixiObject||s:null}function wl(s,e){if(!s||!(e!=null&&e.interaction))return;let t=e.interaction,i=t.enabled!==!1&&(t.draggable===!0||t.clickable===!0);s.eventMode=i?"static":"none",s.interactive=i,i&&(s.cursor=t.draggable?"move":"pointer")}function _r(s,e){var l,c,d;if(!s||!e)return;let t=e.transform||{};wl(s,e);let i=t.position||{},n=t.offset||{},a=(typeof i.x=="number"?i.x:0)+(typeof n.x=="number"?n.x:0),r=(typeof i.y=="number"?i.y:0)+(typeof n.y=="number"?n.y:0);(l=s.position)!=null&&l.set?s.position.set(a,r):(typeof s.x=="number"&&(s.x=a),typeof s.y=="number"&&(s.y=r)),typeof t.scale=="number"&&((c=s.scale)!=null&&c.set?s.scale.set(t.scale):s.scale&&(s.scale.x=t.scale,s.scale.y=t.scale));let o=t.anchor;if(o&&((d=s.anchor)!=null&&d.set)){let p=null;typeof window!="undefined"&&window.resolveAnchorVec2?p=window.resolveAnchorVec2(o):typeof o=="object"&&o.x!==void 0&&o.y!==void 0?p=o:Array.isArray(o)&&o.length===2&&(p={x:o[0],y:o[1]}),p&&typeof p.x=="number"&&typeof p.y=="number"&&s.anchor.set(p.x,p.y)}}function Or(s){if(typeof window=="undefined")return;let e=s==null?void 0:s.objects,t=Ra(e),i=a=>{var r;try{let o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return a;let l=window.__HANDLER_SCREEN_INDEX,c=(r=l==null?void 0:l.screenToInstances)==null?void 0:r[o];if(Array.isArray(c)&&c.length>0){let p=new Set(c);return a.filter(u=>p.has(u))}let d=l==null?void 0:l.instanceToScreen;return d?a.filter(p=>d[p]===o):a}catch{return a}};window.__editableObjectConfigs=e;let n=new Map;t.forEach(a=>n.set(a,[a])),window.__editableObjectInstances=n,window.refreshEditableConfigIndex=()=>Or(window.__editableConfig),window.getEditableObjectList=()=>{var a;return i(Ra((a=window.__editableConfig)==null?void 0:a.objects))},window.getEditableObjectListAll=()=>{var a;return Ra((a=window.__editableConfig)==null?void 0:a.objects)},window.getEditableObjectConfig=a=>{var p,u,g,h,f,m;let r=(h=(g=(u=(p=window.__editableConfig)==null?void 0:p.objects)==null?void 0:u.get)==null?void 0:g.call(u,a))!=null?h:null,o=window.__HANDLER_ACTIVE_SCREEN;if(!o||o==="all")return r;let l=window.__HANDLER_SCREEN_INDEX,c=(f=l==null?void 0:l.screenToInstances)==null?void 0:f[o];if(Array.isArray(c))return c.includes(a)?r:null;let d=(m=l==null?void 0:l.instanceToScreen)==null?void 0:m[a];return d&&d===o?r:null},window.getEditableEngineConfig=()=>{let a=window.__editableConfig;if(console.log("[BRIDGE] getEditableEngineConfig called, cfg present:",!!a),!a)return null;if(a.engine&&a.objects instanceof Map){console.log("[BRIDGE] Detected ObjectCentricConfig, flattening...");let r={...a.engine,objects:a.objects,scene:a.scene};return console.log("[BRIDGE] Returned assets:",Object.keys(r.assets||{})),r}return a}}function xl(){if(typeof window=="undefined")return;let s=t=>{let i=String(t||"").trim();return i?/^(data:|blob:|https?:)/.test(i)||i.startsWith("/")?i:`/${i.replace(/^\.\//,"")}`:""},e=async(t,i)=>{var a,r,o;let n=s(i);if(n)try{let[{Assets:l},{AssetTextures:c}]=await Promise.all([import("pixi.js"),Promise.resolve().then(()=>(it(),Ps))]),d=Date.now(),p=/^(data:|blob:)/.test(n)?n:n+(n.includes("?")?`&t=${d}`:`?t=${d}`),u=await l.load(p);if(!u)return;c[t]=u;let g=window.CustomAssets;(a=g==null?void 0:g[t])!=null&&a.texture&&(g[t].texture=u);let h=window.gameObjectManager,f=(r=h==null?void 0:h.get)==null?void 0:r.call(h,t);if(f){let m=((o=f.getDisplayObject)==null?void 0:o.call(f))||f.pixiObject||f.pixi||f;if(m!=null&&m.texture)m.texture=u;else if(m!=null&&m.children){let b=m.children.find(y=>y==null?void 0:y.texture);b!=null&&b.texture&&(b.texture=u)}}}catch(l){console.warn("[LIVE-EDIT] Failed to reload Pixi texture for",t,l)}};window.applyLiveEditOverrides=t=>{try{let i=Z();Array.isArray(i)&&i.length&&(window.__editableConfig=t,ke(i,{silent:!0,persist:!1}))}catch{}},window.applyEngineOverrides=t=>{try{let i=Z();Array.isArray(i)&&i.length&&(window.__editableConfig=t,ke(i,{silent:!0,persist:!1}))}catch{}},window.applyEditableEngineConfig=t=>{let i=window.__editableConfig;if(!(i!=null&&i.engine))return;let n=[];if(t.runtime)for(let[a,r]of Object.entries(t.runtime))n.push({path:`runtime.${a}`,value:r});if(t.assets)for(let[a,r]of Object.entries(t.assets))n.push({path:`assets.${a}`,value:r}),typeof r=="string"&&e(a,r);if(t.splash)for(let[a,r]of Object.entries(t.splash))n.push({path:`splash.${a}`,value:r});if(t.loading)for(let[a,r]of Object.entries(t.loading))n.push({path:`loading.${a}`,value:r});if(t.start)for(let[a,r]of Object.entries(t.start))n.push({path:`start.${a}`,value:r});n.length&&ke(n,{silent:!0,persist:!0,emitEvent:!0})}}function ln(s){let{getConfig:e,gameObjectManager:t,onObjectConfigApplied:i}=s;t&&(t.onObjectRebuildRequired=async(a,r)=>{console.log(`[LIVE-EDIT] \u{1F3D7}\uFE0F Rebuilding object ${a} due to type change...`);let o=t.get(a),l=o==null?void 0:o.pixiObject,c=l==null?void 0:l.parent,d=c==null?void 0:c.children.indexOf(l);o?t.remove(a):l&&l.destroy();let p=window.gameApp,u=await ue.create(a,r,p);c&&(d!==void 0&&d!==-1?c.addChildAt(u,d):c.addChild(u));let g=t.create(a,u);return console.log(`[LIVE-EDIT] \u2705 Rebuild complete for ${a}`),g}),typeof window!="undefined"&&(xl(),window.applyEditableObjectConfig=(a,r)=>{var o,l,c;console.log("[LIVE-EDIT] \u{1F504} applyEditableObjectConfig called for:",a);try{let d=window.__editableConfig;(o=d==null?void 0:d.objects)!=null&&o.set&&(d.objects.set(a,r),console.log("[LIVE-EDIT] \u2705 Updated config in __editableConfig"));let p=(l=t==null?void 0:t.get)==null?void 0:l.call(t,a);if(console.log("[LIVE-EDIT] gameObject found?",!!p),p&&(console.log("[LIVE-EDIT] gameObject type:",(c=p.constructor)==null?void 0:c.name),console.log("[LIVE-EDIT] has updateConfig?",typeof p.updateConfig=="function"),console.log("[LIVE-EDIT] has onConfigUpdate?",typeof p.onConfigUpdate=="function")),p&&typeof p.updateConfig=="function")console.log("[LIVE-EDIT] \u2705 Calling updateConfig()"),p.updateConfig(r);else if(p&&typeof p.onConfigUpdate=="function")console.log("[LIVE-EDIT] \u2705 Calling onConfigUpdate()"),p.onConfigUpdate();else{console.log("[LIVE-EDIT] \u26A0\uFE0F No updateConfig or onConfigUpdate, applying transform directly");let u=jr(p);_r(u,r)}}catch(d){console.error("[LIVE-EDIT] \u274C Error in applyEditableObjectConfig:",d)}});let n={async applyObjectConfig(a,r){var d,p;console.log("[BRIDGE] \u{1F504} applyObjectConfig called for:",a);let o=e();(d=o==null?void 0:o.objects)!=null&&d.set&&(o.objects.set(a,r),console.log("[BRIDGE] \u2705 Updated config"));let l=(p=t==null?void 0:t.get)==null?void 0:p.call(t,a);if(console.log("[BRIDGE] gameObject found?",!!l),l&&(console.log("[BRIDGE] has updateConfig?",typeof l.updateConfig=="function"),console.log("[BRIDGE] has onConfigUpdate?",typeof l.onConfigUpdate=="function")),l&&typeof l.updateConfig=="function")console.log("[BRIDGE] \u2705 Calling updateConfig()"),l.updateConfig(r);else if(l&&typeof l.onConfigUpdate=="function")console.log("[BRIDGE] \u2705 Calling onConfigUpdate()"),l.onConfigUpdate();else{console.log("[BRIDGE] \u26A0\uFE0F Applying transform directly");let u=jr(l);_r(u,r)}let c=[a];i==null||i(a,r,c)},rebuildIndexes(){let a=e();typeof window!="undefined"&&(window.__editableConfig=a,Or(a))}};return n.rebuildIndexes(),n}K();var $r=Ze(require("lottie-web"),1);Tn(An);typeof window!="undefined"&&!window.lottie&&(window.lottie=$r.default);var pt=null,Sl=async()=>{if(!pt){let s=typeof window!="undefined"?window.INLINE_ASSETS:null,e=(s==null?void 0:s["handler.config"])||(s==null?void 0:s["handler.config.json"]);if(e)try{if(e.startsWith("data:")){let i=atob(e.split(",")[1]);pt=JSON.parse(i)}else pt=JSON.parse(e);return pt}catch(i){console.warn("[CONFIG] Failed to parse inline handler.config.json:",i)}pt=await(await fetch("./handler.config.json")).json()}return pt},Da,Ut,Dr,ut,za,$a;function El(s){Da=s.initGame,Ut=s.CustomAssets,Dr=s.updateScreenState,ut=s.globalResponsiveMultipliers,za=s.layout,$a=s.clearResponsiveElements}var cn="web_embed",Gt="https://example.com",Rr={profile_id:cn},Re=null,fe=null,Bt={width:0,height:0},Cl=!0,Al=async()=>{var c,d,p,u;document.title="Handler Pixi Game";let s=await Sl();Rr={...s.ids||{},profile_id:cn},Gt=s.destination_url||((d=(c=s.export_profiles)==null?void 0:c[cn])==null?void 0:d.destination_url)||Gt,De.init({ids:Rr,profile:cn,destinationUrl:Gt});let e=De.getRoot();if(typeof __PREVIEW_SHELL__!="undefined"&&__PREVIEW_SHELL__){console.log("[BOOTSTRAP] Initializing Preview Shell..."),fe=Oa({onDeviceChange:h=>{console.log(`[PREVIEW] Device switched to ${h.width}x${h.height}, restarting game...`),zr()},onRefresh:zr});let g=fe.getGameContainer();g&&(e=g),window.addEventListener("handler-preview:screen",h=>{var v,x,L,P,O,w,k,j,C,A,M,T,E;let f=window.gameApp,m=window.gameObjectManager,{width:b,height:y}=h.detail;if(Bt.width=b,Bt.height=y,Dr(b,y),!(!f||!f.renderer)){m&&o(f,m);try{f.renderer.resize(b,y);let S=f.view;S&&(S.style.width="100%",S.style.height="100%",S.style.display="block")}catch(S){console.warn("[SCREEN] Error resizing renderer:",S);return}if(t&&m&&za)try{let S=(v=window.__mainContainer)!=null?v:f.stage,_=(k=(w=(P=window.__tutorialLabel)!=null?P:(L=(x=m.get("label_1"))==null?void 0:x.getDisplayObject)==null?void 0:L.call(x))!=null?w:(O=m.get("label_1"))==null?void 0:O.pixiObject)!=null?k:m.get("label_1"),I=m.get("background_1"),R=(M=(A=(C=window.__background)!=null?C:(j=I==null?void 0:I.getDisplayObject)==null?void 0:j.call(I))!=null?A:I==null?void 0:I.pixiObject)!=null?M:I;if(S){let z=S===f.stage;za({mainContainer:S,label:_,background:R,backgroundTexture:(R==null?void 0:R.texture)||null,app:f},t,0,Bt,m,{skipMainContainerTransform:z}),window.dispatchEvent(new CustomEvent("handler:layout-applied",{detail:{width:Bt.width,height:Bt.height,presetId:(E=(T=h.detail)==null?void 0:T.presetId)!=null?E:null}}))}}catch(S){console.warn("[SCREEN] Error in layout:",S)}}})}let t=await Se("scene.main");window.__editableConfig=t,r(),window.__editableConfigBaseline||(window.__editableConfigBaseline=Y(t),console.log("[BOOTSTRAP] Frozen config baseline for persistence")),(u=(p=t.engine.runtime)==null?void 0:p.layout)!=null&&u.design_width_portrait||(console.warn("[BOOTSTRAP] Config layout missing, retrying..."),await new Promise(g=>setTimeout(g,100)),t=await Se("scene.main"));let i=await Da(e,t,Gt,fe);Re=i.app;let n=i.gameObjectManager;window.gameApp=Re,window.gameObjectManager=n;try{window.__liveEditBridge=ln({getConfig:()=>window.__editableConfig,gameObjectManager:n,assets:Ut})}catch(g){console.warn("[BOOTSTRAP] Failed to initialize live-edit bridge",g)}fe&&fe.notifyGameLoaded();let a=window.__debugScale;a&&typeof a=="number"&&(ut.scale=a,console.log(`[DEBUG] Applied persisted debug scale: ${a}`)),o(Re,n);async function r(){try{let g=async y=>{let v=y.startsWith("/")?y:`/${y}`,x=await fetch(v,{cache:"no-cache"});if(!x.ok)return null;let L=await x.text();try{return JSON.parse(L)}catch{return null}},h=await g("configs/flow/app.flow.json");if(!h||typeof h!="object")return;let f=h.screens;if(!f||typeof f!="object")return;let m={},b={};for(let[y,v]of Object.entries(f)){let x=v==null?void 0:v.source;if(typeof x!="string")continue;let L=await g(x),P=L==null?void 0:L.elements;if(!Array.isArray(P))continue;let O=P.map(w=>w==null?void 0:w.instance_id).filter(w=>typeof w=="string");m[y]=O;for(let w of O)b[w]||(b[w]=y)}window.__HANDLER_APP_FLOW=h,window.__HANDLER_SCREEN_INDEX={screenToInstances:m,instanceToScreen:b},window.dispatchEvent(new CustomEvent("handler:screen-index-loaded"))}catch{}}function o(g,h){if(Cl){console.log("[RESPONSIVE] Skipping global scaling; using config-driven layout");return}if(console.log("[RESPONSIVE] ===== APPLYING GLOBAL RESPONSIVE SCALING ====="),console.log(`[RESPONSIVE] Scale multiplier: ${ut.scale.toFixed(3)}`),g.stage){let m=function(b,y=0){if(!b||!b.children)return;let v=" ".repeat(y);b.children.forEach((x,L)=>{if(x&&x.zIndex===9999){console.log(`${v}[RESPONSIVE] Skipping debug border (zIndex 9999)`);return}if(x&&x.scale){let P=x.scale.x||1,O=x.scale.y||1;x.__originalScale||(x.__originalScale={x:P,y:O},console.log(`${v}[RESPONSIVE] Stored original scale for child[${L}]: ${P.toFixed(3)}, ${O.toFixed(3)}`));let w=x.__originalScale.x*ut.scale,k=x.__originalScale.y*ut.scale;typeof x.scale.set=="function"?x.scale.set(w,k):(x.scale.x=w,x.scale.y=k),console.log(`${v}[RESPONSIVE] Child[${L}] scale: ${P.toFixed(3)}\u2192${x.scale.x.toFixed(3)} (type: ${x.constructor.name})`),m(x,y+1)}else x&&console.log(`${v}[RESPONSIVE] Child[${L}] has no scale (type: ${x.constructor.name})`)})};var f=m;console.log("[RESPONSIVE] Applying scale to PIXI stage children"),m(g.stage)}else console.warn("[RESPONSIVE] No app.stage found!");console.log("[REDDEBUG] Debug border left unscaled (fixed boundaries)"),console.log("[RESPONSIVE] ===== GLOBAL RESPONSIVE SCALING COMPLETE =====")}function l(g){if(g!==void 0){ut.scale=g,console.log(`[RESPONSIVE] Updated global scale multiplier to: ${g.toFixed(3)}`);let h=window.gameApp,f=window.gameObjectManager;h&&f?(o(h,f),h.renderer&&(h.renderer.render(h.stage),console.log("[RESPONSIVE] Forced PIXI renderer update"))):console.warn(`[RESPONSIVE] No gameApp (${!!h}) or gameObjectManager (${!!f}) found in window for live update`)}}window.updateGlobalResponsiveMultipliers=l,De.start()},zr=async()=>{var e,t,i,n;console.log("[PREVIEW] Restarting game in 1 seconds...");let s=(e=window.gameObjectManager)==null?void 0:e.get("character_1");if(s){let a=((t=s.getDisplayObject)==null?void 0:t.call(s))||s;a&&a.scale&&console.log(`[CHARACTER] Before restart - Current scale - x: ${((i=a.scale.x)!=null?i:1).toFixed(3)}, y: ${((n=a.scale.y)!=null?n:1).toFixed(3)}`)}if(fe){fe.notifyGameDestroyed();try{$a&&$a()}catch(a){console.warn("Failed to clear responsive elements",a)}setTimeout(()=>{console.log("[PREVIEW] Executing restart...");let a=fe.getGameContainer(),r=window.gameObjectManager;if(r&&typeof r.clear=="function"&&(console.log("[PREVIEW] Clearing old GameObjectManager tickers..."),r.clear()),Re){try{Re.destroy(!0,{children:!0,texture:!1})}catch(o){console.warn("[PREVIEW] Destroy warning:",o)}Re=null}window.gameApp=null,window.gameObjectManager=null,a&&(a.innerHTML="");try{typeof Ut.resetScene=="function"&&Ut.resetScene()}catch(o){console.warn("Asset reset failed",o)}setTimeout(()=>{Se("scene.main").then(o=>{window.__editableConfig=o,window.__editableConfigBaseline||(window.__editableConfigBaseline=Y(o)),Da(a,o,Gt).then(l=>{Re=l.app,window.gameApp=Re,window.gameObjectManager=l.gameObjectManager;try{window.__liveEditBridge=ln({getConfig:()=>window.__editableConfig,gameObjectManager:window.gameObjectManager,assets:Ut})}catch(c){console.warn("[BOOTSTRAP] Failed to re-initialize live-edit bridge",c)}fe&&fe.notifyGameLoaded(),console.log("[PREVIEW] Game restarted successfully");try{De.start()}catch{}})})},100)},1e3)}};xi();K();var me={background:"#F6F3EF",ink:"#1E1E1E",secondaryText:"#8E8A84",primaryAccent:"#E38A5A",secondaryAccent:"#C9A28C",statusGreen:"#5F8F6B"},Nr=1.25,Hr={fontFamily:"Inter, system-ui, sans-serif"};var dn=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=`
2488
2488
  position: fixed;
2489
2489
  inset: 0;
2490
2490
  display: flex;
@@ -2683,7 +2683,7 @@ Style guidelines: ${i.summary}`;this.promptInput.value=n,this.currentPrompt=n}}c
2683
2683
  0%, 100% { opacity: 1; }
2684
2684
  50% { opacity: 0.3; }
2685
2685
  }
2686
- `,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 Na=ss.version,Ll=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"]);as();var Wr={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},Yr=Math.random().toString(36).slice(2),mt=null,gt={...Wr},Kr="web_embed",Ga={},Vt,Ha=!1,qt=!1,Yt=!1,Xr=!1,Wa=1,un=0,mn=!1,Ce=!1,ht="",ft=Math.floor(window.innerWidth),bt=Math.floor(window.innerHeight),Ua=ft>bt,Ae=!1,Wt=!1,Fr=!1,Br=!1,Fa=!1,gn=null,Ye=null,qa=!1,Va=!1,pn=new Map;function Jr(){if(!Ye)return null;let s=Date.now()-Ye;return!Number.isFinite(s)||s<0?null:s}function Ba(s){if(qa)return;let e=Jr();e!==null&&(qa=!0,D("session_time",{duration_ms:e,reason:s}))}function Gr(){if(mt)return mt;let s=document.createElement("div");return s.id="handler-root",s.setAttribute("data-handler-root","true"),document.body.appendChild(s),mt=s,s}function hn(s){switch(s){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return s}}function Zr(s,e){return{event_name:s,ts:Date.now(),session_id:Yr,deployment_id:gt.deployment_id,variant_id:gt.variant_id,export_profile_id:gt.profile_id,instance_id:gt.instance_id||"default",env:Kr==="mraid"?"mraid":"web",attribution:Vt,payload:e}}function D(s,e){let t=hn(s),i=Zr(t,e);Sn(i,!!Ga.analytics),ei(t,i),t!==s&&ei(s,i)}function Kt(){gn&&(gn(ft,bt),gn=null)}function yt(s){Wa=s,D("volume",s)}function vt(s){s&&(Xr=!0),!Yt&&(Yt=!0,D("pause"),yt(0))}function Xt(s){!s&&Xr||Yt&&(Yt=!1,D("resume"),yt(Wa))}function ze(s,e){ft=Math.floor(s||window.innerWidth),bt=Math.floor(e||window.innerHeight),Ua=ft>bt,D("resize",{width:ft,height:bt})}function Tl(){if(bs())try{let s=mraid.getMaxSize();ze(s.width,s.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Xt():vt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();ze(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();yt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&yt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),mn=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Ae=!0,D("boot"),D("view"),D("ready"),Ce=!0,Kt();else{let t=()=>{Ae=!0,D("boot"),D("view"),D("ready"),Ce=!0,Kt()};mraid.addEventListener("ready",t)}}catch(s){console.warn("MRAID hook skipped",s)}}function kl(){if(ys())try{let s=dapi.getScreenSize();ze(s.width,s.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Xt():vt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();ze(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(yt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>yt(t?1:0)),mn=!0,dapi.isViewable())Ae=!0,D("boot"),D("view"),D("ready"),Ce=!0,Kt();else{let t=()=>{Ae=!0,D("boot"),D("view"),D("ready"),Ce=!0,Kt()};dapi.addEventListener("ready",t)}}catch(s){console.warn("DAPI hook skipped",s)}}function Ur(){let s=()=>{Ae||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Ae=!0,D("boot"),D("view"),D("ready"),Ce=!0,Kt(),Wt&&(Wt=!1,ce.start()))};window.addEventListener("resize",()=>ze()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Xt(),s()):vt()}),document.readyState==="complete"||document.readyState==="interactive"?s():window.addEventListener("load",s),mn=!0}function Pl(){let s=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Fr=!0),!(Fr&&e instanceof MouseEvent)&&(un+=1,Va||(Va=!0,D("first_interaction",{count:un})),D("interaction",un))};document.addEventListener("mousedown",s),document.addEventListener("touchstart",s)}function qr(s){var i,n,a,r,o,l,c,d,p,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(s||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(tt())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(vs())(o=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||o.call(r);else if(Es())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ss())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(m){console.warn("Smadex redirect failed",m)}else if(ws()){let m=window.ExitApi;m&&typeof m.exit=="function"?m.exit(s||ht||""):s&&window.open(s)}else et()?(u=window.install)==null||u.call(window):xs()?(g=window.openAppStore)==null||g.call(window):En()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):s&&window.open(s)}function Il(){let s=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(s==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;ee("view",()=>e(t.mraid_viewable)),ee("start",()=>e(t.game_viewable)),ee("engagement",()=>e(t.engagement));let i=()=>e(t.complete);ee("complete",i),Qt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),ee("cta_click",()=>e(t.click))}else if(s==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;ee("view",()=>e(t.Ad_Load_Start)),ee("start",()=>e(t.Ad_Viewable)),ee("engagement",()=>e(t.First_Engagement)),ee("complete",()=>e(t.Gameplay_Complete)),ee("cta_click",()=>e(t.DSP_Click)),ee("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Ml(){if(!tt())return;let s=window.TJ_API;s&&s.setPlayableAPI&&s.setPlayableAPI({skipAd:()=>{try{ce.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Vr(){var e,t,i;let s=window.TJ_API;(e=s==null?void 0:s.objectiveComplete)==null||e.call(s),(t=s==null?void 0:s.playableFinished)==null||t.call(s),(i=s==null?void 0:s.gameplayFinished)==null||i.call(s)}function jl(){et()&&(window.mintGameStart=()=>{Xt(!0),ze()},window.mintGameClose=()=>{vt(!0)})}function _l(){if(!Cn())return;let s=window.NUC;!s||!s.trigger||(ce.on("cta_click",()=>{var e,t;return(t=(e=s.trigger).convert)==null?void 0:t.call(e,ht)}),ce.on("complete",()=>{var e,t;return(t=(e=s.trigger).tryAgain)==null?void 0:t.call(e)}))}var ce={init(s={},e){var t;if(Kr=s.profile||"web_embed",Ga=s.consent||{},gt={...Wr,...s.ids||{}},mt=s.rootEl||mt,Vt=void 0,Ja((t=s.telemetry)!=null&&t.endpoint?s.telemetry:null),Ye=null,qa=!1,Va=!1,pn.clear(),ht=s.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(gn=e),D("init"),document.body.oncontextmenu=()=>!1,Gr(),Rl(mt),Cs(),Tl(),kl(),!mn){if(document.readyState==="complete")Ur();else if(!Br){Br=!0;let i=()=>{Ur(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Pl(),Il(),Ml(),jl(),_l(),console.log(`%c @handler/playable-sdk %c v${Na} `,"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;"),Ae&&!Ce&&(D("boot"),D("view"),D("ready"),Wt&&(Wt=!1,ce.start()),Ce=!0),Ce=Ae},getRoot(){return Gr()},get version(){return Na},get maxWidth(){return ft},get maxHeight(){return bt},get isLandscape(){return Ua},get isReady(){return Ce},get isStarted(){return Ha},get isPaused(){return Yt},get isFinished(){return qt},get volume(){return Wa},get interactions(){return un},on(s,e){Qt(hn(s),e)},off(s,e){xn(hn(s),e)},start(){var s,e;if(!Ha){if(!Ae){Wt=!0;return}if(Ha=!0,Ye||(Ye=Date.now()),D("start"),ze(),et())vt(),(s=window.gameReady)==null||s.call(window);else if(tt()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Ua?"landscape":"portrait",buildID:Na})}}},finish(){var s,e;qt||(qt=!0,D("complete"),Ba("complete"),et()?(s=window.gameEnd)==null||s.call(window):En()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):tt()&&Vr())},install(s){if(!qt){qt=!0,tt()?(Vr(),setTimeout(()=>ce.install(s),300)):(D("complete"),setTimeout(()=>ce.install(s),0));return}Fa||(Fa=!0,setTimeout(()=>Fa=!1,500),D("cta_click"),D("conversion"),Ba("cta"),qr(s||ht))},emit(s,e){let t=hn(s);if(!Ll.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${s} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Zr(t,e);Sn(i,!!Ga.analytics),ei(t,i)},gameStart(){ce.start()},gameEnd(){ce.finish()},ctaClick(s,e){D("cta_click",{url:s||ht,manual:!0}),(e==null?void 0:e.open)!==!1&&qr(s||ht)},ctaShow(s){D("cta_show",s)},ctaDismiss(s){D("cta_dismiss",s)},getGameTimeMs(){return Jr()},endSession(s="manual"){Ba(s)},setAttribution(s){Vt=s},abTest(s,e){if(!s)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(Ol(`${Yr}:${s}`))%e.length,i=e[t];return Vt={...Vt||{},experiment_id:s},gt.variant_id=i,D("ab_assign",{experiment_id:s,variant_id:i}),i},levelStart(s,e){Ye||(Ye=Date.now()),D("level_start",{level_id:s,...e})},levelComplete(s,e){D("level_complete",{level_id:s,...e})},levelFail(s,e){D("level_fail",{level_id:s,...e})},checkpoint(s,e){D("checkpoint",{checkpoint_id:s,...e})},reward(s,e){D("reward",{reward_id:s,...e})},tutorialStart(s,e){D("tutorial_start",{step_id:s,...e})},tutorialComplete(s,e){D("tutorial_complete",{step_id:s,...e})},tutorialSkip(s,e){D("tutorial_skip",{step_id:s,...e})},timerStart(s){s&&pn.set(s,Date.now())},timerEnd(s,e="custom",t){if(!s)return;let i=pn.get(s);if(!i)return;pn.delete(s);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){D("engagement",{action:"timer",key:s,duration_ms:n,...t});return}D(e,{key:s,duration_ms:n,...t})}},fps(s,e){D("fps",{value:s,...e})},memory(s,e){D("memory",{bytes:s,...e})},assetLoadStart(s,e){D("asset_load_start",{asset_id:s,...e})},assetLoadComplete(s,e){D("asset_load_complete",{asset_id:s,...e})},reportError(s,e,t){D("error",{code:s,message:e,...t})},retry(){var s,e,t;if(et())(s=window.gameRetry)==null||s.call(window);else if(Cn()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}D("engagement",{action:"retry"})},pause(){vt(!0)},resume(){Xt(!0)},resize(s,e){ze(s,e)}},De=ce;function Ol(s){let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function Rl(s){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2686
+ `,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 Na=ss.version,Ll=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"]);as();var Wr={mechanic_id:"TODO_mechanic_id",variant_id:"TODO_variant_id",deployment_id:"TODO_deployment_id",export_id:"TODO_export_id",profile_id:"TODO_profile_id",instance_id:"default"},Yr=Math.random().toString(36).slice(2),ft=null,gt={...Wr},Kr="web_embed",Ga={},Vt,Ha=!1,qt=!1,Yt=!1,Xr=!1,Wa=1,un=0,fn=!1,Ce=!1,ht="",mt=Math.floor(window.innerWidth),bt=Math.floor(window.innerHeight),Ua=mt>bt,Ae=!1,Wt=!1,Fr=!1,Br=!1,Fa=!1,gn=null,Ye=null,qa=!1,Va=!1,pn=new Map;function Jr(){if(!Ye)return null;let s=Date.now()-Ye;return!Number.isFinite(s)||s<0?null:s}function Ba(s){if(qa)return;let e=Jr();e!==null&&(qa=!0,D("session_time",{duration_ms:e,reason:s}))}function Gr(){if(ft)return ft;let s=document.createElement("div");return s.id="handler-root",s.setAttribute("data-handler-root","true"),document.body.appendChild(s),ft=s,s}function hn(s){switch(s){case"interaction":return"engagement";case"finish":return"complete";case"install":return"cta_click";default:return s}}function Zr(s,e){return{event_name:s,ts:Date.now(),session_id:Yr,deployment_id:gt.deployment_id,variant_id:gt.variant_id,export_profile_id:gt.profile_id,instance_id:gt.instance_id||"default",env:Kr==="mraid"?"mraid":"web",attribution:Vt,payload:e}}function D(s,e){let t=hn(s),i=Zr(t,e);Sn(i,!!Ga.analytics),ei(t,i),t!==s&&ei(s,i)}function Kt(){gn&&(gn(mt,bt),gn=null)}function yt(s){Wa=s,D("volume",s)}function vt(s){s&&(Xr=!0),!Yt&&(Yt=!0,D("pause"),yt(0))}function Xt(s){!s&&Xr||Yt&&(Yt=!1,D("resume"),yt(Wa))}function ze(s,e){mt=Math.floor(s||window.innerWidth),bt=Math.floor(e||window.innerHeight),Ua=mt>bt,D("resize",{width:mt,height:bt})}function Tl(){if(bs())try{let s=mraid.getMaxSize();ze(s.width,s.height);let e=()=>{mraid.isViewable()&&mraid.getState()!=="hidden"?Xt():vt()};if(mraid.addEventListener("viewableChange",e),mraid.addEventListener("stateChange",e),mraid.addEventListener("sizeChange",()=>{let t=mraid.getMaxSize();ze(t.width,t.height)}),mraid.getAudioVolume){let t=mraid.getAudioVolume();yt(t?1:0)}if(mraid.addEventListener("audioVolumeChange",t=>{t!==null&&yt(t>0?1:0)}),mraid.addEventListener("error",(t,i)=>{console.warn("mraid error:",t,"action:",i)}),fn=!0,mraid.isViewable()&&mraid.getState()!=="hidden")Ae=!0,D("boot"),D("view"),D("ready"),Ce=!0,Kt();else{let t=()=>{Ae=!0,D("boot"),D("view"),D("ready"),Ce=!0,Kt()};mraid.addEventListener("ready",t)}}catch(s){console.warn("MRAID hook skipped",s)}}function kl(){if(ys())try{let s=dapi.getScreenSize();ze(s.width,s.height),dapi.addEventListener("viewableChange",t=>{t.isViewable?Xt():vt()}),dapi.addEventListener("adResized",t=>{let i=dapi.getScreenSize();ze(t.width||i.width,t.height||i.height)});let e=dapi.getAudioVolume();if(yt(e?1:0),dapi.addEventListener("audioVolumeChange",t=>yt(t?1:0)),fn=!0,dapi.isViewable())Ae=!0,D("boot"),D("view"),D("ready"),Ce=!0,Kt();else{let t=()=>{Ae=!0,D("boot"),D("view"),D("ready"),Ce=!0,Kt()};dapi.addEventListener("ready",t)}}catch(s){console.warn("DAPI hook skipped",s)}}function Ur(){let s=()=>{Ae||document.visibilityState==="visible"&&(document.readyState==="complete"||document.readyState==="interactive")&&(Ae=!0,D("boot"),D("view"),D("ready"),Ce=!0,Kt(),Wt&&(Wt=!1,de.start()))};window.addEventListener("resize",()=>ze()),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"?(Xt(),s()):vt()}),document.readyState==="complete"||document.readyState==="interactive"?s():window.addEventListener("load",s),fn=!0}function Pl(){let s=e=>{typeof TouchEvent!="undefined"&&e instanceof TouchEvent&&(Fr=!0),!(Fr&&e instanceof MouseEvent)&&(un+=1,Va||(Va=!0,D("first_interaction",{count:un})),D("interaction",un))};document.addEventListener("mousedown",s),document.addEventListener("touchstart",s)}function qr(s){var i,n,a,r,o,l,c,d,p,u,g,h;let e=typeof AD_PROTOCOL!="undefined"?AD_PROTOCOL:"none";if((typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed")==="google")try{(i=window.ExitApi)==null||i.exit();return}catch{}if(e==="mraid"&&typeof mraid!="undefined")mraid.open(s||"");else if(e==="dapi"&&typeof dapi!="undefined")dapi.openStoreUrl();else if(tt())(a=(n=window.TJ_API)==null?void 0:n.click)==null||a.call(n);else if(vs())(o=(r=window.FbPlayableAd)==null?void 0:r.onCTAClick)==null||o.call(r);else if(Es())(c=(l=window.ScPlayableAd)==null?void 0:l.onCTAClick)==null||c.call(l);else if(Ss())try{(p=(d=window.smxTracking)==null?void 0:d.redirect)==null||p.call(d)}catch(f){console.warn("Smadex redirect failed",f)}else if(ws()){let f=window.ExitApi;f&&typeof f.exit=="function"?f.exit(s||ht||""):s&&window.open(s)}else et()?(u=window.install)==null||u.call(window):xs()?(g=window.openAppStore)==null||g.call(window):En()?(h=parent==null?void 0:parent.postMessage)==null||h.call(parent,"download","*"):s&&window.open(s)}function Il(){let s=typeof AD_NETWORK!="undefined"?AD_NETWORK:"web_embed",e=t=>{if(!t)return;let i=new Image;i.src=t};if(s==="bigabid"){let t=window.BIGABID_BIDTIMEMACROS;if(!t)return;te("view",()=>e(t.mraid_viewable)),te("start",()=>e(t.game_viewable)),te("engagement",()=>e(t.engagement));let i=()=>e(t.complete);te("complete",i),Qt("engagement",n=>{var a;((a=n==null?void 0:n.payload)==null?void 0:a.count)>3&&i()}),te("cta_click",()=>e(t.click))}else if(s==="inmobi"){let t=window.INMOBI_DSPMACROS;if(!t)return;te("view",()=>e(t.Ad_Load_Start)),te("start",()=>e(t.Ad_Viewable)),te("engagement",()=>e(t.First_Engagement)),te("complete",()=>e(t.Gameplay_Complete)),te("cta_click",()=>e(t.DSP_Click)),te("start",()=>{[5,10,15,20,25,30].forEach(i=>setTimeout(()=>e(t[`Spent_${i}_Seconds`]),i*1e3))})}}function Ml(){if(!tt())return;let s=window.TJ_API;s&&s.setPlayableAPI&&s.setPlayableAPI({skipAd:()=>{try{de.finish()}catch(e){console.warn("Tapjoy skip failed",e)}}})}function Vr(){var e,t,i;let s=window.TJ_API;(e=s==null?void 0:s.objectiveComplete)==null||e.call(s),(t=s==null?void 0:s.playableFinished)==null||t.call(s),(i=s==null?void 0:s.gameplayFinished)==null||i.call(s)}function jl(){et()&&(window.mintGameStart=()=>{Xt(!0),ze()},window.mintGameClose=()=>{vt(!0)})}function _l(){if(!Cn())return;let s=window.NUC;!s||!s.trigger||(de.on("cta_click",()=>{var e,t;return(t=(e=s.trigger).convert)==null?void 0:t.call(e,ht)}),de.on("complete",()=>{var e,t;return(t=(e=s.trigger).tryAgain)==null?void 0:t.call(e)}))}var de={init(s={},e){var t;if(Kr=s.profile||"web_embed",Ga=s.consent||{},gt={...Wr,...s.ids||{}},ft=s.rootEl||ft,Vt=void 0,Ja((t=s.telemetry)!=null&&t.endpoint?s.telemetry:null),Ye=null,qa=!1,Va=!1,pn.clear(),ht=s.destinationUrl||(/android/i.test(navigator.userAgent)?"https://play.google.com/store":"https://www.apple.com/app-store/"),e&&(gn=e),D("init"),document.body.oncontextmenu=()=>!1,Gr(),Rl(ft),Cs(),Tl(),kl(),!fn){if(document.readyState==="complete")Ur();else if(!Br){Br=!0;let i=()=>{Ur(),window.removeEventListener("load",i),document.removeEventListener("DOMContentLoaded",i)};window.addEventListener("load",i),document.addEventListener("DOMContentLoaded",i)}}Pl(),Il(),Ml(),jl(),_l(),console.log(`%c @handler/playable-sdk %c v${Na} `,"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;"),Ae&&!Ce&&(D("boot"),D("view"),D("ready"),Wt&&(Wt=!1,de.start()),Ce=!0),Ce=Ae},getRoot(){return Gr()},get version(){return Na},get maxWidth(){return mt},get maxHeight(){return bt},get isLandscape(){return Ua},get isReady(){return Ce},get isStarted(){return Ha},get isPaused(){return Yt},get isFinished(){return qt},get volume(){return Wa},get interactions(){return un},on(s,e){Qt(hn(s),e)},off(s,e){xn(hn(s),e)},start(){var s,e;if(!Ha){if(!Ae){Wt=!0;return}if(Ha=!0,Ye||(Ye=Date.now()),D("start"),ze(),et())vt(),(s=window.gameReady)==null||s.call(window);else if(tt()){let t=window.TJ_API;(e=t==null?void 0:t.setPlayableBuild)==null||e.call(t,{orientation:Ua?"landscape":"portrait",buildID:Na})}}},finish(){var s,e;qt||(qt=!0,D("complete"),Ba("complete"),et()?(s=window.gameEnd)==null||s.call(window):En()?(e=parent==null?void 0:parent.postMessage)==null||e.call(parent,"complete","*"):tt()&&Vr())},install(s){if(!qt){qt=!0,tt()?(Vr(),setTimeout(()=>de.install(s),300)):(D("complete"),setTimeout(()=>de.install(s),0));return}Fa||(Fa=!0,setTimeout(()=>Fa=!1,500),D("cta_click"),D("conversion"),Ba("cta"),qr(s||ht))},emit(s,e){let t=hn(s);if(!Ll.has(t)&&t!=="resize"&&t!=="volume"&&!t.startsWith("custom."))throw new Error(`Event ${s} must be canonical or namespaced as custom.<mechanic_id>.<event>`);let i=Zr(t,e);Sn(i,!!Ga.analytics),ei(t,i)},gameStart(){de.start()},gameEnd(){de.finish()},ctaClick(s,e){D("cta_click",{url:s||ht,manual:!0}),(e==null?void 0:e.open)!==!1&&qr(s||ht)},ctaShow(s){D("cta_show",s)},ctaDismiss(s){D("cta_dismiss",s)},getGameTimeMs(){return Jr()},endSession(s="manual"){Ba(s)},setAttribution(s){Vt=s},abTest(s,e){if(!s)throw new Error("abTest requires experimentId");if(!Array.isArray(e)||e.length<2)throw new Error("abTest requires at least 2 variants");let t=Math.abs(Ol(`${Yr}:${s}`))%e.length,i=e[t];return Vt={...Vt||{},experiment_id:s},gt.variant_id=i,D("ab_assign",{experiment_id:s,variant_id:i}),i},levelStart(s,e){Ye||(Ye=Date.now()),D("level_start",{level_id:s,...e})},levelComplete(s,e){D("level_complete",{level_id:s,...e})},levelFail(s,e){D("level_fail",{level_id:s,...e})},checkpoint(s,e){D("checkpoint",{checkpoint_id:s,...e})},reward(s,e){D("reward",{reward_id:s,...e})},tutorialStart(s,e){D("tutorial_start",{step_id:s,...e})},tutorialComplete(s,e){D("tutorial_complete",{step_id:s,...e})},tutorialSkip(s,e){D("tutorial_skip",{step_id:s,...e})},timerStart(s){s&&pn.set(s,Date.now())},timerEnd(s,e="custom",t){if(!s)return;let i=pn.get(s);if(!i)return;pn.delete(s);let n=Date.now()-i;if(!(!Number.isFinite(n)||n<0)){if(e==="custom"){D("engagement",{action:"timer",key:s,duration_ms:n,...t});return}D(e,{key:s,duration_ms:n,...t})}},fps(s,e){D("fps",{value:s,...e})},memory(s,e){D("memory",{bytes:s,...e})},assetLoadStart(s,e){D("asset_load_start",{asset_id:s,...e})},assetLoadComplete(s,e){D("asset_load_complete",{asset_id:s,...e})},reportError(s,e,t){D("error",{code:s,message:e,...t})},retry(){var s,e,t;if(et())(s=window.gameRetry)==null||s.call(window);else if(Cn()){let i=window.NUC;(t=(e=i==null?void 0:i.trigger)==null?void 0:e.tryAgain)==null||t.call(e)}D("engagement",{action:"retry"})},pause(){vt(!0)},resume(){Xt(!0)},resize(s,e){ze(s,e)}},De=de;function Ol(s){let e=2166136261;for(let t=0;t<s.length;t++)e^=s.charCodeAt(t),e=Math.imul(e,16777619);return e|0}function Rl(s){let e=document.createElement("script");e.type="text/javascript",e.textContent=`
2687
2687
  (function(){
2688
2688
  var events = ['touchstart','touchend','mousedown','keydown'];
2689
2689
  function unlock(){